tms320f28335的CAN总线
0赞
发表于 5/4/2013 8:56:48 PM
阅读(5251)
一、 怎么样快速得到自己得程序
参考ti提供得例子程序,先将他们得例子在自己得板子上跑起来,其实就是用自测试得方式来验证一下程序,也可以加些中断,看看程序怎么跑得。这步没问题得话,可以改写程序,当然还在自测试模式下先试,如果可以改写后,在自测试模式下可以。那么就差不多了,将自测试模式改成正常模式,将程序移植到自己得程序中,拿一个经过验证可以正常通讯得can模块通讯,记得两个can得速率要一致。当然这个can模块还要能让你看到或者说能验证你得can是否通讯正常。例如can转232接口得板子,如果收到你得can数据通过232口输出到电脑上。
我经过验证,ti得例子基本上,只要将自测试模式改成正常模式,基本上就可以正常通讯。修改成那种方式,可以参看《Programming Examples for the TMS320F281x eCAN.pdf》
二、can接收id得问题
如果在不使用滤波得情况下,基本不用考虑id因为只有相同id得才能接收。如果使用id滤波,那么对于增强性ecan模式来说,发送方得id就放在接收邮箱得id标志符里面,这个我经过程序验证了。这个问题我看了资料但是不很明白,程序验证后才明白得。另外,不知道怎么回事我在自测试模式下,发送方得id没有放到接收邮箱得id标志符里面。程序烧到flash中和外面得程序通讯才看到确实放在那里了。
三、发送邮箱数据得修改
cpu可以直接对发送邮箱得数据进行修改,不需要对其他操作。这个2407不一样。
四、发送和接收得中断
如果发送和接收得中断都开发后,在发送和接收成功后,都会有产生中断,那么在中断中一定要记得清除中断标志。
顺便给大家一个例子程序。
void InitECan(void)
{
struct ECAN_REGS ECanaShadow;
EALLOW;
ECanaShadow.CANTIOC.all = ECanaRegs.CANTIOC.all;
ECanaShadow.CANTIOC.bit.TXFUNC = 1;
ECanaRegs.CANTIOC.all = ECanaShadow.CANRIOC.all;
ECanaShadow.CANRIOC.all = ECanaRegs.CANRIOC.all;
ECanaShadow.CANRIOC.bit.RXFUNC = 1;
ECanaRegs.CANRIOC.all = ECanaShadow.CANRIOC.all;
EDIS;
ECanaRegs.CANME.all = 0;
//客流的转换模块的发送ID 0×02 接收0×20
/*发送邮箱的ID号*/
ECanaMboxes.MBOX0.MSGID.all = 0x8000ffff;//发送0×01 扩展
/*接收邮箱的ID号*/
ECanaMboxes.MBOX31.MSGID.all =0xC0000001;//接收0×01//使用屏蔽位
ECanaLAMRegs.LAM31.all=0x1FFFFFFF;
/*15 is TX,31 is RX*/
ECanaRegs.CANMD.all = 0×80000000;
/*使能31和15号邮箱*/
ECanaRegs.CANME.all = 0×80000001;
/*数据长度 8个BYTE*/
ECanaMboxes.MBOX0.MSGCTRL.bit.DLC = 8;
ECanaMboxes.MBOX31.MSGCTRL.bit.DLC = 8;
ECanaMboxes.MBOX0.MSGCTRL.bit.TPL=0;
ECanaMboxes.MBOX31.MSGCTRL.bit.TPL=0;
/*没有远方应答帧被请求*/
{
struct ECAN_REGS ECanaShadow;
EALLOW;
ECanaShadow.CANTIOC.all = ECanaRegs.CANTIOC.all;
ECanaShadow.CANTIOC.bit.TXFUNC = 1;
ECanaRegs.CANTIOC.all = ECanaShadow.CANRIOC.all;
ECanaShadow.CANRIOC.all = ECanaRegs.CANRIOC.all;
ECanaShadow.CANRIOC.bit.RXFUNC = 1;
ECanaRegs.CANRIOC.all = ECanaShadow.CANRIOC.all;
EDIS;
ECanaRegs.CANME.all = 0;
//客流的转换模块的发送ID 0×02 接收0×20
/*发送邮箱的ID号*/
ECanaMboxes.MBOX0.MSGID.all = 0x8000ffff;//发送0×01 扩展
/*接收邮箱的ID号*/
ECanaMboxes.MBOX31.MSGID.all =0xC0000001;//接收0×01//使用屏蔽位
ECanaLAMRegs.LAM31.all=0x1FFFFFFF;
/*15 is TX,31 is RX*/
ECanaRegs.CANMD.all = 0×80000000;
/*使能31和15号邮箱*/
ECanaRegs.CANME.all = 0×80000001;
/*数据长度 8个BYTE*/
ECanaMboxes.MBOX0.MSGCTRL.bit.DLC = 8;
ECanaMboxes.MBOX31.MSGCTRL.bit.DLC = 8;
ECanaMboxes.MBOX0.MSGCTRL.bit.TPL=0;
ECanaMboxes.MBOX31.MSGCTRL.bit.TPL=0;
/*没有远方应答帧被请求*/
ECanaMboxes.MBOX0.MSGCTRL.bit.RTR = 0;
ECanaMboxes.MBOX31.MSGCTRL.bit.RTR = 0;
ECanaMboxes.MBOX0.MDL.all = 0×01234567;
ECanaMboxes.MBOX0.MDH.all = 0x89ABCDEF;
EALLOW;
/*邮箱屏蔽使能*/
ECanaRegs.CANMIM.all = 0xFFFFFFFF;
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.CCR = 1;
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
EDIS;
do
{
ECanaShadow.CANES.all = ECanaRegs.CANES.all;
}while(ECanaShadow.CANES.bit.CCE != 1);
EALLOW;
/*(BRPREG+1)=200 波特率50K*/
ECanaShadow.CANBTC.bit.BRPREG = 199;
ECanaMboxes.MBOX31.MSGCTRL.bit.RTR = 0;
ECanaMboxes.MBOX0.MDL.all = 0×01234567;
ECanaMboxes.MBOX0.MDH.all = 0x89ABCDEF;
EALLOW;
/*邮箱屏蔽使能*/
ECanaRegs.CANMIM.all = 0xFFFFFFFF;
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.CCR = 1;
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
EDIS;
do
{
ECanaShadow.CANES.all = ECanaRegs.CANES.all;
}while(ECanaShadow.CANES.bit.CCE != 1);
EALLOW;
/*(BRPREG+1)=200 波特率50K*/
ECanaShadow.CANBTC.bit.BRPREG = 199;
ECanaShadow.CANBTC.bit.TSEG2REG = 2;
ECanaShadow.CANBTC.bit.TSEG1REG = 10;
ECanaRegs.CANBTC.all = ECanaShadow.CANBTC.all;
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.CCR = 0;
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
EDIS;
do
{
ECanaShadow.CANES.all = ECanaRegs.CANES.all;
}while(ECanaShadow.CANES.bit.CCE != 0);
EALLOW;
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.STM = 0;//自测试模式=1
ECanaShadow.CANMC.bit.SCB = 1;//ecan模式=1
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
EDIS;
ECanaShadow.CANBTC.bit.TSEG1REG = 10;
ECanaRegs.CANBTC.all = ECanaShadow.CANBTC.all;
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.CCR = 0;
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
EDIS;
do
{
ECanaShadow.CANES.all = ECanaRegs.CANES.all;
}while(ECanaShadow.CANES.bit.CCE != 0);
EALLOW;
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.STM = 0;//自测试模式=1
ECanaShadow.CANMC.bit.SCB = 1;//ecan模式=1
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
EDIS;
EALLOW;
ECanaRegs.CANMIM.all = 0xFFFFffff;
ECanaRegs.CANMIL.all = 0;
ECanaRegs.CANGIF0.all = 0xFFFFFFFF;
ECanaRegs.CANGIM.bit.I0EN = 1;
ECanaRegs.CANGIM.bit.I1EN = 1;
ECanaRegs.CANGIM.all = 0x3ff07;
EDIS;
PieCtrlRegs.PIEIER9.bit.INTx6 = 1;
PieCtrlRegs.PIEIER9.bit.INTx5 = 1;
ECanaRegs.CANMIM.all = 0xFFFFffff;
ECanaRegs.CANMIL.all = 0;
ECanaRegs.CANGIF0.all = 0xFFFFFFFF;
ECanaRegs.CANGIM.bit.I0EN = 1;
ECanaRegs.CANGIM.bit.I1EN = 1;
ECanaRegs.CANGIM.all = 0x3ff07;
EDIS;
PieCtrlRegs.PIEIER9.bit.INTx6 = 1;
PieCtrlRegs.PIEIER9.bit.INTx5 = 1;
}
void can_send_operation()
{
static Uint16 count=0;
ECanaRegs.CANTRS.all = 0×00000001;
while(ECanaRegs.CANTA.all != 0×00000001);
ECanaRegs.CANTA.all = 0×00000001; //清除中断标志
delay_ms(2000);
if(can_send_flag==1)
{
can_send_flag=0;
senda_char_one(‘F’);
senda_char_one(ECanaMboxes.MBOX31.MSGID.all);
senda_char_one((ECanaMboxes.MBOX31.MSGID.all)>>8);
}
count++;
ECanaMboxes.MBOX0.MDL.all= count;
if(count==0xffff)
{
count=0;
}
}
{
static Uint16 count=0;
ECanaRegs.CANTRS.all = 0×00000001;
while(ECanaRegs.CANTA.all != 0×00000001);
ECanaRegs.CANTA.all = 0×00000001; //清除中断标志
delay_ms(2000);
if(can_send_flag==1)
{
can_send_flag=0;
senda_char_one(‘F’);
senda_char_one(ECanaMboxes.MBOX31.MSGID.all);
senda_char_one((ECanaMboxes.MBOX31.MSGID.all)>>8);
}
count++;
ECanaMboxes.MBOX0.MDL.all= count;
if(count==0xffff)
{
count=0;
}
}
interrupt void ECAN0INTA_ISR(void) // eCAN-A
{
PieCtrlRegs.PIEACK.bit.ACK9 = 1;
senda_char_one(‘Y’);
if(ECanaRegs.CANRMP.bit.RMP31==1)
{
senda_char_one(‘S’);
can_send_flag=1;
ECanaRegs.CANRMP.bit.RMP31=1;
}
EINT;
{
PieCtrlRegs.PIEACK.bit.ACK9 = 1;
senda_char_one(‘Y’);
if(ECanaRegs.CANRMP.bit.RMP31==1)
{
senda_char_one(‘S’);
can_send_flag=1;
ECanaRegs.CANRMP.bit.RMP31=1;
}
EINT;
}
