在CAN总线通讯程序中,发送子程序中需要设置“目的CAN节点地址”。例如描述符的前两个字节为: send_data[0]=0xAA; send_data[1]=0x08; //填写发送can数据帧的描述符 表示向地址为550的CAN节点发送8个字节的数据。 CAN转232串口程序中的SJA1000初始化程序中需要设置“自己的CAN节点地址”,也是允许接收其他通讯节点发送过来的CAN总线数据信息。例如: if(set_ACR_AMR(0xaa,0x00)) //设置自己的地址ID:550 相互通讯的两个CAN节点之间的地址必须对应,否则通讯不成功。 Basican和Pelican两种协议CAN地址的设置方法不同,下面具体进行介绍。 1、Basican的id设置方法: 由ACR和AMR两个8位寄存器决定: ACR:ID10 ID9 ID8 ID7 ID6 ID5 ID4 ID3 ID2 ID1 ID0 二进制: 1 0 1 0 1 0 1 0 十六进制: 0xaaH AMR: 0 0 0 0 0 0 0 0 十六进制: 0x00H 最后三位“ID2 ID1 ID0”跟ACR无关。AMR对应ACR各位,AMR位为“0”,表示can接收滤波器接收数据时,地址必须和ACR各位设置的数字相等。AMR位为“1”,则表明滤波器设置无效。 但是,计算CAN的id地址的时候,需要把“ID2ID1 ID0”这3个跟ACR无关的位计算在内,例如: ID10 ID9 ID8 ID7 ID6 ID5 ID4 ID3 ID2 ID1 ID0 1 0 1 0 1 0 1 0 0 0 0 CAN地址为:550 1 0 1 0 1 0 1 0 1 1 1 CAN地址为 :557 根据后三位的不同值,有不同的id地址。 2、Pelican的id设置方法: Can的id设置由ACR0~ACR3和AMR0~ AMR3八个寄存器设置决定,AMR的功能和Basican的 id设置方法中介绍的相同,下面着重介绍ACR0~ ACR3的设置。对于pelican而言: ID28 ID27 ID26 ID25 ID24 ID23 ID22 ID21 二进制: 0 0 0 0 0 0 0 0 十六进制: 0x00H ID20 ID19 ID18 ID17 ID16 ID15 ID14 ID13 二进制:0 0 0 0 0 0 0 0 十六进制: 0x00H ID12 ID11 ID10 ID9 ID8 ID7 ID6 ID5 二进制:0 0 1 0 1 0 1 0 十六进制: 0x2AH ID4 ID3 ID2 ID1 ID0 X X X 二进制:0 0 0 0 0 0 0 0 十六进制: 0x00H 其中X表示任意值,和can的ID无关。计算Can的ID的时候,需要计算ID0~ID28的值,也就是从ID0算起,因此: ID28 ID27 ID26 ID25 ID24 ID23 ID22 ID21 ID20 0 0 0 0 0 0 0 0 0 0 0 0 ID19 ID18 ID17 ID16 ID15 ID14 ID13 ID12 0 0 0 0 0 0 0 0 0 0 ID11 ID10 ID9 ID8 ID7 ID6 ID5 ID4 0 1 0 1 0 1 0 0 5 4 ID3 ID2 ID1 ID0 0 0 0 0 0 CAN地址为 :00000540 推荐CAN总线学习书籍及学习板: 1、《CAN总线嵌入式开发——从入门到实战》, 牛跃听 周立功等编著, 该书的当当网网址: 该书的当当网网址:
|