1.gpio两个管脚连接can收发器(sn65hvd256),模拟can控制器,实现can总线的数据接收。
2. 配置gpio rx管脚中断模式为下降沿触发,中断到来表示数据的开始(sof),这时定时器Timer开始计时(时间到触发中断)。
3. 配置Timer计时单位为20us(使用的can协议速率为50kbps),在Timer中断到来开始读gpio rx管脚,根据CAN协议解析个段内容。
调试出现的问题及解决方法:
1.接收一个字节内容时没有问题,2个字节时有时候数据最后一个字节内容不对。修改采样点:在下降沿中断到来后延时一段时间开始Timer计时,内容正确。
2. 调试过程中使用全局变量数组,如果定义时初始化为0,在Timer中断中对数组赋值程序会挂死;如果定义时不初始化,在程序中赋值为0,这样没有问题。原因待查。
3.调试返回ack bit时,在收到crcdel后:
(1)开始是gpio tx 在Timer中断来时置1,下一个Timer中断置0,pc显示传输失败。这时,查看示波器tx波形,默认为低,然后在crcdel后一bit相应位置为高然后低。
(2)改为先置0,然后置1,pc显示成功。这时tx波形默认为高,然后在crcdel后一bit相应位置为低然后高。这时是符合can波形的。
参见如下:摘录于关于CAN报文中ACK应答错误的检测原理文章中的描述及波形
http://www.51hei.com/bbs/dpj-34521-1.html
(出处: 单片机论坛)
4. 板卡上电后pc发数据,第一个数据总是失败,查看波形,crcdel后一bit没有变化,gpio tx波形始终为一直线。修改:初始化时应先将gpio tx 配置为高(隐形电平)。
5.之前调试第一个能正常收到,因为之前将板卡连接的can收发器配成了slient mode,这时只有receive起作用。现在要发送ack,配成了NORMAL mode。
6.调试发现pc连续多次发送数据时会出现有些接收不成功。后经定位,原因为:中断产生到软件收到中断有几个us的延时,程序中为了确定采样点使用了软件延时。而软件延时通过示波器看,每次延时误差很大。于是再使用一个Timer,用来发送ack的定时。调试连续接收没问题。
7.当pc发送间隔设置为0时,连续两次发送,第二次接收失败;时间设置为1ms时,没有问题。示波器查看,第二次没有ack。查看gpio中断计数,发现发送了两次,只有一次中断。原来两次中断间隔时间太长,中断来不及被第二次数据下降沿触发。优化代码,减少中断间隔,测试ok(还可以不用关闭打开中断操作,直接用一全局变量控制,如果全局变量有效,中断来了才开始接收。这样如果有下降沿就会触发中断,但不会出现中断生效间隔太大导致这个问题)。