单片机cant通讯 c语言,基于C8051F040单片机的CAN总线通信

本文档详细介绍了C8051F040单片机在CAN通信中遇到的问题及解决方法。硬件部分发现原ATA6660收发芯片因RS引脚配置不当导致通信故障,更换为TJA1050后恢复正常。软件部分展示了C语言编程的基本设置、CAN消息对象初始化、波特率设置以及发送和接收函数。最终,单片机能成功发送但无法正确接收数据,通过测试模式排查问题。
摘要由CSDN通过智能技术生成

硬件部分

硬件部分电路结构如下:

b232c1d563d7de3069beb3fc7380a1ba.png

CAN收发模块原本采用的是ATA6660高速CAN收发芯片,电路连接如下:

0b1e05d528bf405ee495b6ae2eb61ce3.png

设计电路为:当单片机发送数据时,D18闪烁,并将数据传送给ATA6660芯片;当ATA6660芯片接受到总线上的数据时,D17闪烁,并将数据传送给单片机。

实际调试时,发现C8051F040单片机既没办法发送数据到总线上,也没办法从总线上接收到数据。

用示波器对电路检测发现,当单片机需要发送数据时,ATA6660芯片的TXD引脚上能检测到数据,且D18闪烁。示波器检测总线上的电压,没有变化。PC端显示总线上的数据为FE。当PC端给总线发送数据时,总线上能检测到电压的变化,而ATA6660芯片的RXD引脚电压为0。故怀疑为CAN收发部分硬件存在问题。

因此,将CAN收发模块换为直接购买的TJA1050CAN收发模块,电路如下图所示。通过测试,CAN模块工作正常。而单片机能够成功发送数据,接收数据失败。

96cfcaad58667848d0cd18a8696f8df1.png

对比前后两个电路可以发现,区别在于CAN收发芯片的RS引脚。ATA6660芯片的RS引脚悬空,而TJA1050芯片的RS引脚接地。

查阅ATA6660芯片数据手册,发现RS引脚的功能为Switch Standby Mode/Normal Mode。而Standy Mode的解释为:

c047791d2bcfc5fe69b84d3b882df793.png

故使用ATA6660模块时无法正常收发数据。而正确的电路应为:

09d840ddc3f0b49bbb509ee2512d2ef3.png

软件部分

程序参考自童长飞编著的《C8051F系列单片机开发与C语言编程》例程12-1。

1.基本设置

int n;

//看门狗禁止

WDTCN = 0x07;

WDTCN = 0xDE;

WDTCN = 0xAD;

SFRPAGE = 0x0F;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值