This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[FAQ] 【分享】F28335的CAN通信例程TA位置位问题

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邮箱定义为接收邮箱并接受数据。