我学习 CAN 已经三周了,现在我已经完成了一些申请来验证我的学习成果。在本教程中,您将学习如何使用 Arduino 实现 CANBUS 通信。如果您有什么建议,欢迎留言。
关于 CAN
CAN(Controller Area Network)是一种可以实现分布式实时控制的串行通信网络。它是为汽车行业开发的,用两线总线代替复杂的线束。
CAN 协议定义了 OSI 模型中的数据链路层和部分物理层。
CAN 协议采用 ISO11898 和 ISO11519 进行 ISO 标准化。ISO11898是CAN高速通信标准,通信速度为125kbps-1Mbps。ISO11519是CAN低速通信标准,通信速度小于125kbps。
这里我们重点介绍高速CAN。
CAN收发器
CAN Transceiver 负责逻辑电平和物理信号之间的转换。将逻辑信号转换为差分电平或将物理信号转换为逻辑电平。
CAN控制器
CAN控制器是CAN的核心部件,实现了CAN协议中数据链路层的所有功能,可以自动解析CAN协议。
单片机
MCU负责功能电路和CAN控制器的控制。例如节点启动时初始化CAN控制器参数,通过CAN控制器读取并发送CAN帧等。
当总线空闲时,所有节点都可以开始发送消息(多主机控制)。首先访问总线的节点获得发送权(CSMA/CA 模式)。当多个节点同时开始发送时,发送高优先级ID消息的节点获得发送权。
在 CAN 协议中,所有消息都以固定格式发送。当总线空闲时,所有连接到总线的单元都可以开始发送新消息。当两个以上的小区同时开始发送消息时,根据标识符确定优先级。ID不代表发送的目的地址,而是代表消息访问总线的优先级。当两个以上的cell同时开始发送消息时,免息ID的每一位都会被一一仲裁。仲裁获胜的单元可以继续发送消息,仲裁失败的单元立即停止发送并接收工作。
CAN 总线是一种广播型总线。这意味着所有节点都可以“听到”所有传输。所有节点总是会接收所有流量。CAN 硬件提供本地过滤,以便每个节点只对感兴趣的消息做出反应。
CAN 设备通过 CAN 网络以称为帧的数据包形式发送数据。CAN 有四种帧类型:
数据框
有两种类型的数据帧,标准的和扩展的。
图中位域的含义是:
仲裁
在总线空闲状态下,首先开始发送消息的单元获得发送权。当多个单元同时开始发送时,每个发送单元从仲裁段的第一位开始。连续输出显性电平数最多的单元可以继续发送。
CAN总线是同时连接多个单元的总线。理论上可以连接的单元总数没有限制。然而,在实践中,可以连接的单元数量受到总线上的时间延迟和电气负载的限制。降低通讯速度,增加可连接的单元数,提高通讯速度,可连接的单元数减少。
通信距离与通信速度成反比,通信距离越远,通信速度越小。更长的距离可以是1km或更长,但速度小于40kps。
Maduino Zero CAN-BUS 模块是Makerfabs 开发的CANbus 通讯工具,它基于Arduino,带有CAN 控制器和CAN 收发器,创建一个即用型CAN-bus 端口。
用电线将 DHT11 模块连接到 Maduino Zero CAN-BUS 模块,用作支持 CAN 通信的仪器。同样,将显示器连接到模块以接收数据并显示。
Maduino Zero CANBUS与DHT11的连接:
Maduino Zero CANBUS -- DHT11
3v3 ------ VCC
GND ------ GND
D10 ------ DATA
Maduino Zero CANBUS与OLED的连接:
Maduino Zero CANBUS -- OLED
3v3 ------ VCC
GND ------ GND
SCL ------ SCL
SDA ------ SDA
使用 DB9 电缆连接两个 Maduino Zero CANBUS 模块。
MAX3051完成差分电平到逻辑信号的转换。MCP2515完成数据编解码等CAN功能。MCU只需要初始化控制器和发送和接收数据。
CAN.sendMsgBuf(0x10, 0, stmp1.length(), stmp_send1);
delay(500);
CAN.sendMsgBuf(0x11, 0, stmp2.length(), stmp_send2);
delay(500);
“0x10”表示消息ID,“0”表示标准帧,“stmp1.length()”表示消息长度,“stmp_send1”表示发送的数据。
给两个模块上电,显示屏上会显示温度和湿度。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !