基于CAN总线的汽车电器网络设计 - 学习can总线宝典 - 图文

发布时间 : 星期六 文章基于CAN总线的汽车电器网络设计 - 学习can总线宝典 - 图文更新完毕开始阅读

天津工业大学2011届本科生毕业设计(论文)

系统进行合理的分块,并针对每个模块进行了功能描述。给出总线节点电路的设计以及电源电路的设计,针对一些干扰,采取了相应措施。同时设计总线接口每一部分的电路,并进行详细分析。

28

天津工业大学2011届本科生毕业设计(论文)

第五章 CAN总线网络软件设计

结合上一章的硬件电路设计,本章完成了下位机数据采集程序的编写,制定了CAN通信协议,实现了CAN节点间的数据通信。

5.1CAN总线系统智能节点的软件设计

CAN总线智能节点部分的程序设计是整个控制网络系统软件设计的基础,它主要包括三个部分:CAN节点初始化、报文发送和报文接收程序。

5.1.1初始化过程

SJA1000的初始化只有在复位模式下才可以进行,初始化主要包括工作方式的设置、接收滤波方式的设置、接收屏蔽寄存器(AMR)和接收代码寄存器(ACR)的设置、波特率参数设置和中断允许寄存器(IER)的设置等。在完成SJA1000的初始化设置以后,SJA1000就可以回到工作状态,进行正常的通信任务。CAN总线控制器SJA1000的初始化流程图如图5-1所示。

开始初始化配置总线定时寄存器禁止主控制器中断源配置输出控制寄存器进入复位模式进入工作模式复位模式=复位(1)?NY配置时钟分频寄存器1.Basic CAN2.CAN输入比较器旁路3.CLKOUT控制以及频率4.TX1禁用复位模式=普通(0)?NY使能CAN中断和CAN 中断源配置验收代码配置结束

图5-1 CAN总线控制器SJA1000的初始化流程图

SJA1000初始化子程序: //SJA1000初始化 void CAN_Init()

29

天津工业大学2011届本科生毕业设计(论文)

{

unsigned char i_temp = 0,j_temp = 0; CLI(); }

do {

Write_SJA1000(MODE,0X01); }

while(!(Read_SJA1000(MODE) & 0X01));

Write_SJA1000(CDR,0XC8); //PeliCAN 模式,禁能CLOCKOUT引脚 Write_SJA1000(AMR0,0XFF); //设置验收屏蔽位 Write_SJA1000(AMR1,0X00); Write_SJA1000(AMR2,0XFF); Write_SJA1000(AMR3,0X00); Write_SJA1000(ACR1,0X00); Write_SJA1000(ACR3,0x01); Write_SJA1000(BTR0,0X7F);

Write_SJA1000(BTR1,0XFF); //16M晶振下 波特率为5Kbit/s Write_SJA1000(OCR,0X1A); //TX1悬空 ,TX0推挽正常输出 do { }

while((Read_SJA1000(MODE)&0x01)); //双滤波方式,正常工作模式 Write_SJA1000(TXID2,0X00); //配置发送缓冲区ID3 Write_SJA1000(IER,0X01); //配置SJA1000中断 SEI();

Write_SJA1000(MODE,0X00);

5.1.2报文发送过程

根据CAN协议规范,报文的传输由CAN控制器SJA1000独立完成。主控制器将要发送的报文传送到发送缓冲器,然后将命令寄存器里的发送请求标志置位。发送过程由SJA1000的中断请求控制或由查询控制段的状态标志控制。发送程序完成通信双方约定的帧的发送,发送时把需发送的数据送入发送缓冲区,然后置

30

天津工业大学2011届本科生毕业设计(论文)

位命令寄存器的―发送请求‖位,SJA1000启动发送。发送过程流程图如图5-2所示。

程序开始SJA1000复位SJA1000初始化SJA1000进入工作模式等待重发将待发送数据送入发送缓冲区执行发送操作查询状态寄存器判断是否发送成功Y程序结束N 图5-2 CAN总线数据发送程序流程图

CAN发送子程序: void CAN_Send() {

unsigned char a_temp = 0;

unsigned char SR_temp,i; NOP();

for(i = 2 ;i < 6; i++) { CLI(); do

{

a_temp = Read_SJA1000(SR); }

while(!(a_temp & 0x04));

TransBuffer[0]=0x04; TransBuffer[1]=0x00;

31

联系合同范文客服:xxxxx#qq.com(#替换为@)