我们采用的是SDK6.0,bitrate 20000,回环测试已经OK了。但是在正常模式时接收不到别的板子发过来的数据,尝试发送数据时CAN-TX也没看到波形。
正常模式时,用示波器看CAN-RX有波形,表明can总线数据通过收发器已到达CAN-RX。但用ip -d -s link show can1命令或者candump can1命令都看不到有数据接收到。用can utilities工具尝试发送一包数据,在CAN-TX引脚也没有看到波形。
有可能是什么原因?有没有可能是SDK或者是底层驱动的问题?
已经卡了好久。请TI技术支持帮忙解答,谢谢!
Steven Liu1:
首先这里有个user guide可以作为你使用的时候的参考:
http://processors.wiki.ti.com/index.php/AM335X_DCAN_Driver_Guide
回到这个问题本身,你是使用自己的板子进行的收发测试吧?想确认的两个测试:
1. 如果是用两个板子,有一个板子发一个板子收,这样的情况下,能正常收到数据吗?
2. 如果上面的不行,把通讯速率再降一些,可以正常通信吗?
如果上面两个测试,都是失败了。
建议查一下板子的pinmux设置,先确认你使用的CAN的端口的pinmux是否正确。可以直接使用devmem2+地址的方式直接在进入kernel后进行查看。
再者可以通过GPIO的方式来测试那两个管脚是否正常。一般情况下,软件配置正确、无冲突,硬件连接妥当的时候,这个是应该没有问题的。CAN端口的使用比较广泛,所以感觉上还是配置出问题的可能性较大。
Steven Liu1:
回复 Steven Liu1:
特别提一点,你的CAN 对应的这个pinmux的配置,是否有使能receive enable的这个接收位。如果pinmux中没有使能这个,那你收不到是很正常的。一定要查pinmux先。
cen miao:
回复 Steven Liu1:
刘工:你好,谢谢你的回复。我们是用自己的板子。用AM335x的板子接入已经OK的CAN总线中去。查看了一下pinmux的设置,其实程序中已经帮我们设置好了receiver enablestatic struct pinmux_config d_can_sk1_pin_mux[] = { {"uart1_rxd.d_can1_tx", OMAP_MUX_MODE2 | AM33XX_PULL_ENBL}, {"uart1_txd.d_can1_rx", OMAP_MUX_MODE2 | AM33XX_PIN_INPUT_PULLUP}, {NULL, 0},};
#define AM33XX_PIN_INPUT_PULLUP (AM33XX_INPUT_EN | AM33XX_PULL_UP)#define AM33XX_INPUT_EN (1 << 5)但是按照你说的方法测试寄存器,发现CAN-RX的pinmux确实存在问题:root@am335x-evm:/dev# devmem2 0x44e10984/dev/mem opened.Memory mapped at address 0x40222000.Read at address 0x44E10984 (0x40222984): 0x00000037但是我们只是在SDK6.0的基础上对CAN模块进行了移植和修改,且pinmux配置程序是正确的(如上程序),查看代码并没有找到哪里会再次修改这个寄存器。有没有什么好的方法定位问题?可否在应用程序中直接修改这个寄存器?盼复,谢谢!
Jian Zhou:
回复 cen miao:
之前碰到过有的客户,CAN的收发线接反了,也不能正常通信。
cen miao:
回复 Jian Zhou:
Jian Zhou:
你好。我们能够确认CAN收发线的极性和波形是正确的。目前猜测可能的问题是pinmux寄存器设置本来应是正确的,但不知是被代码哪里修改了?如上面帖子所述。看代码没有找到问题,有没有好的方法可以定位问题?谢谢!