最近接手了一个项目,需要调试编写与CAN总线相关的程序,在这篇博客内做个记录。
关于CAN总线介绍就不说了,两根线CANH和CANL,配合参考电平进行高低比较判断信号值。CAN总线通常通过PCA82C250控制器接口来进行CAN总线差分信号的物理层接收发送,每一个判断之后的信号值会被送往CAN总线控制器SJA1000进行管理。这些单个的数据位bit将被整理成一个个字节的形式,存储在SJA1000内的接收缓存中,然后在用户的控制下从缓存中一个个读出,发送过程相反。
连接大致如图所示:(参考一个以FPGA为核心主控的板卡原理图)
这样到达用户端的数据已经是相对比较完整的了,只差把这些八位的字节组织成帧和包,进行解析完成通信。
那么SJA1000具体完成了哪些工作呢?
SJA1000的数据手册在下面:
https://download.csdn.net/download/Newbeil/12565085
如图所示为SJA1000内部的结构框图,可以发现SJA1000这块芯片内部主要由以下几个模块构成:
接口管理逻辑IML:作为SJA1000与微控制器的主要接口管理,解析来自微控制器的命令,实现对内部寄存器的索引、提供状态、中断等信号给微控制器。
接收缓存RXB:作为ACF和微控制器之间的接口,数据由ACF写入,由微控制器读出,13字节长,相当于内部64字节深度的RXFIFO的一个长度为13字节的窗口。
发送缓存TXB:作为微控制器和BSP之间的接口,数据由微控制器写入,由BSP读出,13字节长
接收过滤器ACF:顾名思义,决定了收到的数据是否能够被接收,涉及到的内部寄存器包括ACR和AMR。
位流处理器BSP:负责协调TXB、RXFIFO、CAN总线上的数据流,兼顾错误检测,仲裁,错误处理等功能
位时序逻辑BTL:负责处理CAN总线上数据信号的时序相关功能,可对单个位的采样点、采样数量进行可编程地控制(通过对内部地寄存器设置,BTR0和BTR1)
错误管理逻辑EML:配合BSP获得错误信息,然后告知IML
未完待续