Other Parts Discussed in Thread:C2000WARE
部分工程师在使用TI提供的CAN通信例程(C:\ti\c2000\C2000Ware_3_03_00_00\device_support\f2833x\examples\ecan_a_to_b_xmit)时,会遇到发送成功TA位一直等待置位的问题:
do
{
ECanaShadow.CANTA.all = ECanaRegs.CANTA.all;
} while(ECanaShadow.CANTA.bit.TA25 == 0 ); // Wait for TA25 bit to be set.
该程序的工程名虽然是A to B,但是程序中并没有对B口接收邮箱进行ID、方向等的初始化,仅仅是对A口的25邮箱(不同的例子可能有些区别)进行发送初始化并且使能了发送。其原因可以在下列帖子中找到:e2e.ti.com/…/250556
也即:如果通信不成功的话,物理层上CAN通信收发芯片(板子上的CAN驱动IC)是不会给DSP返回ASK应答信号的,那么TA就不会置位。那么通信不成功有哪些原因呢?下面列举了一些可能的情况供大家参考:
硬件方面:
1、画板子时28335 CAN的GPIO口定义错误。要确认画板子的时候是否将CAN口的输入和输出口给定义正确。
2、驱动IC的选择。CAN 通信需要接专门的驱动IC才能通信,而不能简单的将28335的CANTX和CANRX连接进行通信。
3、驱动IC的供电电压,由于DSP的GPIO输出是3.3V,而有些板子上的CAN驱动IC供电是5V,所以在这里要确定所用驱动IC在3.3V的供电电压下是否能正常工作。
4、终端电阻的问题,如果你采用的是ISO11898协议的驱动芯片,则你要在通信总线上接上两个120欧姆的终端电阻。
软件问题:
1、28335 CAN的复用GPIO口的设置。这个问题与硬件问题1类似,即配置的时候需要确定所用的CAN对应的GPIO口复用正确。
2、波特率问题,通信的两个CAN口的波特率必须一致,这个是毫无疑问的。
3、邮箱的初始化,这里参考TI的例程就OK了,这里列举一些个人觉得比较要注意的寄存器赋值:
a、ECanbShadow.CANMC.bit.ABO = 1; //auto bus on
b、ECanbShadow.CANBTC.bit.SAM = 1; //required if BRP is > 4
c、ECanaShadow.CANMC.bit.STM = 0; // Configure CAN for nomal mode
4、ID屏蔽的问题,这里建议刚开始调试时,如果是用CAN卡来接收,则建议不使用ID滤波,也就是使能CAN卡不论发送的数据的ID是什么,都接收;如果是DSP接收,则建议将发送和接收的邮箱ID设置成一样的,通信正常后在玩ID屏蔽的功能。
TI提供的例子有两个:1、selftest 2、A to B 。
seltest就是TI提供的自测模式,该模式发送端口同时也是接收端口,但是该模式下接收邮箱的ID不会被发送数据的ID覆盖,因此selftest的模式下不能测试涉及ID的CAN通信协议,在selftest模式下,只要将自测模式改为正常模式,A口就可以正常的向外面发送数据了:
CANMC.bit.STM = 1; // Configure CAN for selftest mode
改为
CANMC.bit.STM = 0; // Configure CAN for selftest mode
A to B例程只定义了A口的25邮箱为发送邮箱并且发送数据,并没有把B邮箱定义为接收邮箱并接受数据,所以要想在28335的板子上实现A to B的can通信还要B邮箱定义为接收邮箱并接受数据。
Annie Liu:
我们建议您在发布新问题之前先搜索 E2E支持论坛,E2E支持论坛已经拥有数十万个已得到解答的话题。 这通常是解决问题的最快方法。