本帖最后由 叶落风过 于 2015-3-1 00:01 编辑 1.CAN是控制器局域网络(Controller Area Network, CAN)的简称 2.芯片选用:TJA1050 差分信号输入, 这里的显性电平CANH和CANL压差是2V左右,逻辑上表示“0” 两线之间没有压差CANH和CANL都是2.5V左右,表示逻辑“1” 实现代码 1、
②对于CAN_NVIC_Config(); 看下CAN 的中断分类
③CAN_Mode_Config(); //CAN不像I2C那样有片选,他背身有许多协议,也要进行选择,所以对应代码的结构体也多(集体可看CAN手册) ④CAN_Filter_Config(); 过滤器程序 看下CAN的主要框图(M3里面的CAN) M3里面有三个发送邮箱,把要发送的数据打包成报文,然后把它发送到CAN网络总线上; 接收器 先经过滤器,M3里面有14个过滤器,过滤的时候是根据报文的ID来过滤的,ID相同的话,才能过去(相当于一个闸门) 接收到数据后(这里有两个FIFO ,0、1 ),我们的实验用的是 放到FIFO 的Mailbox 0; 代码写法根基三部分: 1.Tx Mailboxes 2.Acceptance Filters 3.Receive FIFO STM32 的 ID 过滤方式有两种,一种为标识符列表模式,它把要接收报文 的 ID 列成一个表,要求报文 ID 与列表中的某一个标识符完全相同才可以接 收,可以理解为白名单管理。(说白了就是有一个标志位相同,然后就联通了) 另一种称为标识符屏蔽模式,它把可接收报文 ID 的某几位作为列表,这几 位被称为屏蔽位,可以把它理解成关键字搜索,只要屏蔽位(关键字)相同,就 符合要求。即这种模式只要求报文 ID 的屏蔽位与列表中标识符相应屏蔽位相 同 ,报文就被保存到接收 FIFO。(标志位的某几位检验,相同的话就通过了) 2.什么叫做报文(就是帧) 在原始数据段的前面加上传输起始标签、片选(识别)标签、控制标签,在 数据的尾段加上 CRC 校验标签、应答标签和传输结束标签。把这些内容按特定 的格式打包好,就可以用一个通道表达各种信号了,各种各样的标签就如同 SPI 中各种通道上的信号,起到了协同传输的作用。当整个数据包被传输到其 它设备时,只要这些设备按格式去解读,就能还原出原始数据。类似这样的数 据包就被称为 CAN的数据帧。 看下数据帧 扩展与标准 仲裁段不一样,扩展11+18 = 29位 仲裁段:告诉是发还是收(几个同时通信的时候,那那根的信号,拉低了就是谁的了)如: 总电平接收了节点2的^_^(can的神奇之处) CRC:发送与接收的对应 IDE:用于区分标准帧与扩展帧 r0、r1 都是显性位 3.CAN通信报文内容设置 void CAN_SetMsg(void) 4.发送消息,“ABCD” CAN_Transmit(CAN1, &TxMessage); 总体流程图(例程对应): while( flag == 0xff ); //flag =0 ,success ,此时产生一个中断(CAN中断) 对于从机的CAN_Config(); 是一模一样 不一样的是从机先上电 中断函数时一样的 CAN线接的时候 CANH接CANH, CANL接CANL, 不能对接 |
NO 工控