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.
最近在调试28335的CAN通信,调试的过程中遇到了关于一直等待发送成功TA置位的问题:
do
{
ECanaShadow.CANTA.all = ECanaRegs.CANTA.all;
} while(ECanaShadow.CANTA.bit.TA25 == 0 ); // Wait for TA25 bit to be set.
这是TI提供的A to B 的工程中的等待发送成功标志置位等待,该程序的工程名虽然是A to B,但是程序中并没有对B口接收邮箱进行ID,方向等初始化,仅仅是对A口的25邮箱(不同的例子可能有些区别)进行发送初始化并且使能了发送,所以这里我的测试是将A口接到我的USB接口的CAN卡上,与PC机通信。
开始测试的时候就遇到了等待TA置位的问题,示波器打CANH和CANL两端没有波形,后来在TI的论坛上查到了原因:
http://e2e.ti.com/support/microcontrollers/tms320c2000_32-bit_real-time_mcus/f/171/p/69248/250556.aspx#250556
即如果通信不成功的话,物理层上CAN通信收发芯片(板子上的CAN驱动IC)是不会给DSP返回ASK应答信号的,那么TA就不会置位。那么通信不成功有哪些原因呢?我下面列举下我知道的原因,希望对大家调CAN有所帮助,同时也欢迎大家补充。
硬件问题:
1、画板子时28335 CAN的GPIO口的定义,就是要确认画板子的时候是否将CAN口的输入和输出口给定义正确,例如有可能就会将DSP的CANRXB口接到CAN驱动IC的TX脚上去,我测试的板子就犯了这样坑爹的错误;-_-|
2、驱动IC的选择,CAN 通信需要接专门的驱动IC才能通信,而不能简单的将28335的CANTX和CANRX连接进行通信。CAN协议经过ISO标准化后有ISO11898标准(125K---1Mbps)和ISO11519-2(10K -----125Kbps)标准两种,这两种协议的物理层的规格是不一样的,其总线连接方式也是不同的,两种规格需要有专门的驱动IC与之对应。一般采用的是ISO11898协议(总线终端电阻为120欧姆),常用的IC有HA13721RPJE/PCA82C250/Si9200/CF15这几种,本次调试用的是Si9200驱动IC;
3、驱动IC的供电电压,由于DSP的GPIO输出是3.3V,所以有些板子上的CAN驱动IC供电也是3.3V,所以在这里要确定所用驱动IC在3.3V的供电电压下是否能正常工作,在网上就看见有些网友说有些驱动IC在3.3V下是不能正常工作的,这个时候设计电路时就可以考虑用磁隔离芯片将DSP和驱动IC隔离开,驱动IC用5V供电;
4、终端电阻的问题,如果你采用的是ISO11898协议的驱动芯片,则你要做通信总线上接上两个120欧姆的终端电阻;
软件问题:
1、28335 CAN的复用GPIO口的设置,这一点28335和2812的是有区别的,2812的CAN口对应的IO是固定的,而28335确实不确定的,像A口就有(GPIO30,GPIO31)和(GPIO18,GPIO19)两种选择,B口有(GPIO8,GPIO10)、(GPIO12,GPIO13)、(GPIO16、GPIO17)和(GPIO20、GPIO21)。这里IO复用CAN使能的时候就要注意了,一定和板子上的接口对应上,TI给的CAN例程中已经完整的列出这些管脚的初始化,屏蔽掉不用的管脚就是了。
2、波特率问题,通信的两个CAN口的波特率必须一致,这个是毫无疑问的。这里28335的波特率设置与2812的也有区别,除了要使能CAN的block外,还要注意CAN clock仅仅是 SYSCLKOUT的一半, 150 MHz SYSCLKOUT (75 MHz CAN clock) 。还有要注意如TSEG1必须大于或等于TSEG2等这些小问题,具体参考TI的手册或者程序。
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邮箱定义为接收邮箱并接受数据。