基于LPC2131嵌入式系统μCOS-II实现CAN通讯
图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;
}
·数据发送模块
假设要发送的数据的ID存储在数组ID[4]中,数据存储在数组SendData[8]中,其发送模块程序如下所示,其中参数DLC为发送的字节数,FF为帧类型,即0为数据帧,1为远程帧。
void Tx(uint8 DLC,uint8 FF)
{
uint8 i;
OS_ENTER_CRITICAL();
If (FF==0x01)
{
WriteCan(16,DLC+0x80); //数据帧
}
else
{
WriteCan(16,DLC+0xd0); //远程帧
}
WriteCan(17,ID[0]);
WriteCan(18,ID[1]);
WriteCan(19,ID[2]);
WriteCan(20,ID[3]); //TX标识码
for (i=0;i
WriteCan(21+i,sentdata[i]); //TX数据
WriteCan(1,0x01);//设置发送寄存器发送
OS_EXIT_CRITICAL();
}
评论