基于CAN总线的车门锁控制
dlc=(*databuf&0x0f); if(dlc>8){ dlc=8; }
switch(*databuf&0xC0){ case 0x00:
len=STD_FRAMEID_LENTH+dlc; break; case 0x40:
len=STD_FRAMID_LENTH; case 0x80:
len=EXT_FRAMEID_LENTH+dlc; break; case 0xC0:
len=EXT_FRAMEID_LENTH; defalut: len=0; status=0; break; } if(len>0){
WriteSJARegBlock(REG_CAN_TXFMINFO,databuf,len); SetSJASendCmd(cmd); status=1; }}
return(status); SJA1000接收程序
char SJARcvData(unsigned char *databuf) {
char status=1; unsigned char len; unsigned char dlc;
if(ReadSJAeg(REG_CAN_SR)&RBS_BIT)==0){ status=0; }else{
*databuf=ReadSJAReg(REG_CAN_RXFMINFO);
9
基于CAN总线的车门锁控制
dlc=(*databuf&0x0f); if(dlc>8){ dlc=8; }
switch(*databuf&0xC0){ case 0x00:
len=STD_FRAMEID_LENTH+dlc; break; case 0x40:
len=STD_FRAMID_LENTH; case 0x80:
len=EXT_FRAMEID_LENTH+dlc; break; case 0xC0:
len=EXT_FRAMEID_LENTH; defalut: len=0; status=0; break; } if(len>0){
ReadSJARegBlock(REG_CAN_BXBUF1,databuf+1,len); status=SetBitMask(REG_CAN_CMR,RRB_BIT); }}
return(status); }
SJA1000滤波器设置函数
void SJA1000——Config——Filter(char mode,*Filter) SetBitMask(REG_CAN_MOD,RM_RR_BIT); if(mode>0){
SetBitMask(REG_CAN_MOD,AFM_BIT); } else
{ClearBitMask(REG_CAN_MOD,AFM_BIT); }
WriteSJARegBlock(REG_CAN_ACR0,Filter,8); ClearBitMask(REG_CAN_MOD,RM_RR_BIT);
10
基于CAN总线的车门锁控制
} 4.3 ARM控制程序模块
首先是中断模块,这里我用到的是ARM2103定时器0中断及计时count表示1S中断后+!,以下是中断函数,还有一些控制程序像KEY1,LED1和LED2的控制就是按图表7主程序设计图那样编译在调控。 void Timer0_IntExt(void) {
T0TC = 0; T0PR = 0; T0MCR = 0x03; T0MR0 = Fpclk/400; T0TCR = 0x01; }
void __irq IRQ_Timer0(void) {
T0Flag = 1;
count++; //这里是当车门开后用来计20S时间的 T0IR = 0x01; VICVectAddr = 0; }
void IRQ_Init(void) {
VICIntSelect = 0x00; VICVectCntl0 = 0x20|4;
VICVectAddr0 = (uint32)IRQ_Timer0; VICIntEnable = 1<<4; }
第5章 总结
CAN自诞生以来,以其独特的设计思想、优良的性能和极高的可靠性越来越受到工业界的青睐。随着企业对CAN总线技术要求的不断提高,CAN总线技术将不断完善,各种更先进的通讯技术方案将被提出,在现有技术条件下从可靠性、经济性、可扩展性等方面尽量做出了最优化设计,希望以后有时间我继续研究探讨。
11
基于CAN总线的车门锁控制
参考文献
1,周立功《ARM嵌入式系统基础教程》 北京航空大学出版社 2,铃木雅臣《晶体管电路设计》 科学出版社 3,周立功《嵌入式接口技术》
4,石磊《基于CAN总线的车门控制系统研制》 吉林大学
12
相关推荐: