用gpio两个管脚模拟can总线

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(还可以不用关闭打开中断操作,直接用一全局变量控制,如果全局变量有效,中断来了才开始接收。这样如果有下降沿就会触发中断,但不会出现中断生效间隔太大导致这个问题)。



  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值