项目场景:
项目使用的DSP硬件是TMS320F280039c,CANA配置使用的是GPIO58和GPIO18,在测试过程中使用TI案例“can_ex5_transmit_receive”。
问题描述
在使用案例测试过程中,无法正常接收和发送can数据,发现需要在程序中增加如下代码片段才能在can盒上收到数据,但是DSP无法接收数据。
// Enable CAN test mode with external loopback
CAN_enableTestMode(CANA_BASE, CAN_TEST_EXL);
删除该语句后,can盒无法接收到数据,DSP也无法接收到数据,怀疑是can盒与DSP连接的物理层出现问题。因为在加上这句话的时候可以接收到数据,所以认为配置的位时间是没有问题的,接下来找来示波器进行诊断。
直接说结果,直接对DSP的Rx和Tx进行测试发现,CAN盒的数据在Rx管脚处产生了正确的波形,Tx管脚在正常发送报文时没有完整的波形发出,再三确认物理连接和端口配置后,发现并没有问题,在增加外回环模式后Tx可以看到完整波形,但是Rx的波形依然不被DSP接收。
原因分析:
可以从Ti的库文件中看到这个模式为外回环模式:
查了TI的手册可以看到该模式是将Rx和Tx都接到Tx的管脚上,形成内循环的同时,外部可以监听到can报文。到这里都是符合逻辑的,在去除外回环测试模式后没有完整的波形发出,经过仿真器检测发现是报文没有正确发送,查阅资料后发现判断报文是否正确发送是DSP监听Rx端口需要被拉低,而在外回环模式下该判断会忽略,所以在外回环模式下可以发送。此时陷入僵局,进行很多测试无果。
因为该程序在以前的老的测试板上是正常的,所以对两个板子进行了对比,发现两个板子的晶振不一样,新板子采用的是20M的外部晶振,在device.h中配置为
#define USE_PLL_SRC_XTAL,只能尝试改用内部晶振测试,便把例程配置为
#define USE_PLL_SRC_INTOSC。再次测试发现收发均正常。
解决方案:
在这种情况下只能再次查血手册,在仔细阅读手册时发现当GPIO19被配置为X1外部晶振时,GPIO18会受到牵扯。
这里可以看到外部晶振会占用这两个口,并且需要通过配置来释放X2作为GPIO使用,配置方法见手册:
然后到程序的配置里去阅读了一下:
在SysCtl_setClock(DEVICE_SETCLOCK_CFG);里有这段代码用来选择外部晶振模式:
// An highlighted block
// Configure oscillator source
//
SysCtl_selectOscSource(config & SYSCTL_OSCSRC_M);
//
// Delay of at least 60 OSCCLK cycles
//
这里分为这两种模式,而这两模式则对应这晶振是同时占用X1和X2还是只使用X1,与手册对应。而案例中则是默认使用SYSCTL_OSCSRC_XTAL:
void
SysCtl_selectXTAL(void)
{
EALLOW;
//
// Enable XOSC pads initialization and set X1, X2 high
//
HWREGH(CLKCFG_BASE + SYSCTL_O_XTALCR2) |= SYSCTL_XTALCR2_FEN |
SYSCTL_XTALCR2_XIF |
SYSCTL_XTALCR2_XOF;
//
// Wait for few cycles to allow load capacitors to charge
//
asm(" RPT #5 || NOP");
..............
在这里可以看到X2会被拉成高电平,这也是造成为什么非外回环模式时发送不成功,也是为什么GPIO18作为Rx时接收不到数据的根本原因。
在device.h把SYSCTL_OSCSRC_XTAL替换为SYSCTL_OSCSRC_XTAL_SE。
完美解决问题。这里再次提醒我一定要好好阅读手册。