CAN-bus接口控制实验
波特率
SJAQuitResetMode(); //退出复位模式
}
/*------------------------------------------------------------------------------------
** 函数原型: unsigned char Send_Sja1000_Self(void)
** 功能描述: 把数据传送到SJA1000的接收缓冲区,并进行自发自收的测试
** 参数说明: 无
** 返回值: 0 失败
** 1 成功
/*----------------------------------------------------------------------------------*/
unsigned char Send_Sja1000_Self(void)
{
uchar i;
SJA1000_Config_Self();
WriteSJAReg(REG_CAN_IER,0x03); //使能接收发送中断标志位
Delay_ms(100);
for(i=0;i<2;i++)
{
if((ReadSJAReg(REG_CAN_SR)&0x0c)==0x0c)//判断是否可以发送
{
WriteSJARegBlock(16,Send_CAN_Info_ID,5);
//扩展帧,向发送缓冲区写入5个数据
WriteSJARegBlock(21,Send_Data_For_Self,8);
//扩展帧,向发送缓冲区写入8个数据
SetBitMask(REG_CAN_CMR,SRR_BIT); //使能自发送请求标志位
return(1); //返回发送成功标志
}
else
{
Delay_ms(200); //延时200ms
}
return(0); //返回发送失败标志
}
}
/*------------------------------------------------------------------------------------
** 函数原型: void main(void)
** 功能描述: 主函数
** 参数说明: 无
** 返回值: 无
/*----------------------------------------------------------------------------------*/
void main()
{
RESET_PIN=0;
//将SJA1000的复位线与P1.0相连接
Delay_ms(1);
RESET_PIN=1;
//控制P1.0来实现SJA1000的复位
SJA_CS_Point=&CAN_SJA_BaseAdr; //确定SJA1000的基址
ScanNum[0]=0; //不显示
Display_Buffer[0]=0x1f;
ZLG7290_SendDisBuf(Display_Buffer,0);
ISendStr(ZLG7290,0x0d,ScanNum,1);
Delay_ms(100);
if(Send_Sja1000_Self())
{
Delay_ms(200);
if((ReadSJAReg(REG_CAN_IR)==0x03)) //查询接收/发送中断位
{
WriteSJAReg(REG_CAN_CMR,4); //释放接收缓冲区
ScanNum[0]=3; //扫描4位
Display_Buffer[0]=0x0d; //显示Good
Display_Buffer[1]=0x15;
Display_Buffer[2]=0x15;
Display_Buffer[3]=0x10;
ISendStr(ZLG7290,0x0d,ScanNum,1);
ZLG7290_SendDisBuf(Display_Buffer,4);
}
else
{
ScanNum[0]=4; //扫描5位
Display_Buffer[0]=0x18; //显示Error
Display_Buffer[1]=0x15;
Display_Buffer[2]=0x18;
Display_Buffer[3]=0x18;
Display_Buffer[4]=0x0e;
ISendStr(ZLG7290,0x0d,ScanNum,1);
}
else
{
ScanNum[0]=4; //扫描5位
Display_Buffer[0]=0x18; //显示Error
Display_Buffer[1]=0x15;
Display_Buffer[2]=0x18;
Display_Buffer[3]=0x18;
Display_Buffer[4]=0x0e;
ISendStr(ZLG7290,0x0d,ScanNum,1);
ZLG7290_SendDisBuf(Display_Buffer,5);
}
while(1)
{
; //死循环
}
}
在本示范程序中,采用了查询中断标志位的方式来判断自发自收数据是否成功。用户也
可以将SJA1000的INT管脚连接到MCU的外部中断管脚上,并使能相应的中断位,在程序
中编写中断服务程序来实现同样的功能。采用中断的方式,可以提高系统的实时性。特别是
在接收数据的时候,采用中断方式可以在效率和实时性上比采用查询方式得到很大的提高。
接收数据采用中断方式的程序流程图如下所示。

图3.42 CAN 节点自发自收基本流程图
九. 实验思考题
(1) 请用户思考一下,如何编写CAN 总线数据的正常发送程序。
(2) 请用户再思考一下,如何编写CAN 总线数据的接收程序。
CANbus接口控 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)
