LPC2131嵌入式系统μCOS-II实现CAN通讯 02
![Rank: 8](images/default/star_level3.gif) ![Rank: 8](images/default/star_level3.gif)
- UID
- 872238
|
![](http://images.eccn.com/silabs/silicon_chip_980x60_202203.jpg)
LPC2131嵌入式系统μCOS-II实现CAN通讯 02
CAN收发器与CAN总线接口
CAN收发器与CAN总线的接口如图2所示,其中SJA1000的TX0,RX0分别与CAN收发器的TXD,RXD相连,为提高CAN收发器82C250与CAN总线的接口部分的抗干扰能力,特在82C250 的CANH 和CANL 引脚串接一个共模扼流圈,以消除一定的共模干扰,而使得总线差分信号能够顺利通过。并且CANH和CANL分别通过一个磁珠与总线相连,以起到消除一定的高频干扰。同时CANH 和CANL与地之间并联了两个30pf 的小电容,可以起到滤除总线上的高频干扰和一定的防电磁辐射的能力。另外在两根CAN总线接入端与地之间分别接了一个TVS,当CAN 总线有较高的电压时通过TVS的击穿而接地,可起到一定的过压保护作用。82C250 的Rs引脚上接有一个斜率电阻以降低CAN总线的向外辐射。
![](http://embed.chinaitlab.com/UploadFiles_4615/201209/20120901164411612.jpg)
图2 CAN收发器与总线接口电路
对于其他无内置CAN控制器的能够承受5V的TTL电平的处理器来说,只需改变与SJA1000的数据端口ALE/AS,RD/E,WR,CS,INT,RST相连接的引脚即可完成外扩CAN接口的硬件设计工作,否则在两者之间加一个逻辑电平转换的器件即可。
软件设计
对SJA1000的读写访问
由于LPC2131的48个引脚全是IO,所以首先需要通过软件模拟读写SJA1000的时序,来对SJA1000进行操作,进而完成CAN通讯功能。
依据SJA1000在Intel模式下的读写时序[4],可编写LPC2131通过CAN控制器SJA1000发送数据的写函数void WriteCan(uint8 Addr,uint8 Data)和接受CAN控制器所接受的数据的读函数uint8 ReadCan(uint8 Addr),其中Addr为SJA1000相应的寄存器的地址,Data为LPC2131所发送的数据,读函数ReadCan可返回所接受的数据。
CAN通讯的实现
要实现一个CAN通讯需要实现3个功能模块:对SJA1000的初始化模块;数据发送模块;数据接受模块。
·对SJA1000的初始化模块
在开始通讯之前,首先要在SJA
1000的各个功能寄存器进行设置,包括模式寄存器,波特率,时钟分频器,中断使能寄存器,滤波寄存器,输出控制寄存器。
uint8 IniSJA1000(uint8 BTR0,uint8 BTR1)
{
IO0CLR=CS; //片选SJA1000
WriteCan(0,0x09); //进入复位模式
WriteCan(31,0xe8); //设置时钟分频器
WriteCan(4,0xfd); //设置中断使能寄存器
WriteCan(16,AcceptCode1);//设置验收代码1
WriteCan(17,AcceptCode2);//设置验收代码2
WriteCan(18,AcceptCode3);//设置验收代码3
WriteCan(19,AcceptCode4);//设置验收代码4
WriteCan(20,MaskCode1); //设置验收屏蔽1
WriteCan(21,MaskCode2); //设置验收屏蔽2
WriteCan(22,MaskCode3); //设置验收屏蔽3
WriteCan(23,MaskCode4); //设置验收屏蔽4
WriteCan(6,BTR0); //设置总线时序寄存器1
WriteCan(7,BTR1); //设置总线时序寄存器2
WriteCan(8,0xfa); //设置输出控制积存器
WriteCan(0,0x08); //进入操作模式
OSCANMbox=OSMboxCreate(0);/建立CAN通讯邮箱
if (OSCANMbox==NULL)
{
return FALSE;
}
return TRUE;
} |
|
|
|
|
|