最近研究了下F28335的CAN通信模块与上位机的通信过程,主要是为了使用上位机实现对DSP的一些控制,今天算是实现了第一步。
首先是用到的模块,一块F28335开发板和USB-CAN分析仪一个
如图所示,将CAN-H和CAN-L与开发板上的对应接口连接起来就可以了。然后进行上位机的配置,通过调试助手等很容易可以进行配置,不详述。
接下来是F28335的代码部分,主要涉及CAN模块的配置,以及数据的收发。
DSP给上位机发送数据:
目标:持续发送同一组数据给上位机:
ECanaMboxes.MBOX25.MSGID.all = 0x95555555; // 使用CANA模块的25号邮箱,扩展帧,配置标识符
ECanaShadow.CANMD.all = ECanaRegs.CANMD.all;
ECanaShadow.CANMD.bit.MD25 = 0; //配置为发送邮箱
ECanaRegs.CANMD.all = ECanaShadow.CANMD.all;
ECanaShadow.CANME.all = ECanaRegs.CANME.all;
ECanaShadow.CANME.bit.ME25 = 1; //使能A模块第25个邮箱
ECanaRegs.CANME.all = ECanaShadow.CANME.all;
ECanaMboxes.MBOX25.MSGCTRL.bit.DLC = 8; //8字节有效数据
ECanaMboxes.MBOX25.MDL.all = 0x55555555; //定义发送数据
ECanaMboxes.MBOX25.MDH.all = 0x55555555;
for(; ;)
{
ECanaShadow.CANTRS.all = 0;
ECanaShadow.CANTRS.bit.TRS25 = 1; // TRS置位发送对应邮箱中的消息
ECanaRegs.CANTRS.all = ECanaShadow.CANTRS.all;
do
{
ECanaShadow.CANTA.all = ECanaRegs.CANTA.all;
} while(ECanaShadow.CANTA.bit.TA25 == 0 ); //如果邮箱中的消息发送成功,该寄存器将会置位
ECanaShadow.CANTA.all = 0;
ECanaShadow.CANTA.bit.TA25 = 1; // Clear TA5
ECanaRegs.CANTA.all = ECanaShadow.CANTA.all;
delay_loop();
}
该程序持续发送25号邮箱里的数据,在配置不成功时程序可能会卡在while(ECanaShadow.CANTA.bit.TA25 == 0 ),这个时候要注意波特率的设置。通常该设置在DSP2833x_ECan.c文件中,如下:
#if (CPU_FRQ_150MHZ)
ECanbShadow.CANBTC.bit.BRPREG = 19; //这里改成19应该是500kbps
ECanbShadow.CANBTC.bit.TSEG2REG = 2;
ECanbShadow.CANBTC.bit.TSEG1REG = 10;
#endif
此时,USB-CAN模块配置中,需要把CAN波特率改为250Kbps。具体原因还没有弄懂,但是这样可以实现通信。
下面是PC发送数据,DSP接收的部分。
配置与上面相似,只需要把邮箱的模式改成接收的即可:
ECanaMboxes.MBOX25.MSGID.all = 0x95555555; // 使用CANA模块的25号邮箱,扩展帧,配置标识符
ECanaShadow.CANMD.all = ECanaRegs.CANMD.all;
ECanaShadow.CANMD.bit.MD25 = 1; //配置为接收邮箱
ECanaRegs.CANMD.all = ECanaShadow.CANMD.all;
ECanaShadow.CANME.all = ECanaRegs.CANME.all;
ECanaShadow.CANME.bit.ME25 = 1; //使能A模块第25个邮箱
ECanaRegs.CANME.all = ECanaShadow.CANME.all;
ECanaMboxes.MBOX25.MSGCTRL.bit.DLC = 8; //8字节有效数据
do
{
ECanaShadow.CANRMP.all = ECanaRegs.CANRMPall;
} while(ECanaShadow.CANRMP.bit.RMP25 == 0 ); //接收,那么该寄存器第N位将会置位
这里即表示程序数据接收成功。
这是发送的数据,以及寄存器接收到的结果,证明成功。