新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于LPC2131嵌入式系统μCOS-II实现CAN通讯

基于LPC2131嵌入式系统μCOS-II实现CAN通讯

作者:时间:2013-09-12来源:网络收藏

CAN收发器与总线接口电路

图2 CAN收发器与总线接口电路

对于其他无内置CAN控制器的能够承受5V的TTL电平的处理器来说,只需改变与SJA1000的数据端口ALE/AS,RD/E,WR,CS,INT,RST相连接的引脚即可完成外扩CAN接口的硬件设计工作,否则在两者之间加一个逻辑电平转换的器件即可。

软件设计

对SJA1000的读写访问

由于的48个引脚全是IO,所以首先需要通过软件模拟读写SJA1000的时序,来对SJA1000进行操作,进而完成功能。

依据SJA1000在Intel模式下的读写时序[4],可编写通过CAN控制器SJA1000发送数据的写函数void WriteCan(uint8 Addr,uint8 Data)和接受CAN控制器所接受的数据的读函数uint8 ReadCan(uint8 Addr),其中Addr为SJA1000相应的寄存器的地址,Data为所发送的数据,读函数ReadCan可返回所接受的数据。

的实现

要实现一个需要实现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();

}



评论


相关推荐

技术专区

关闭