1、can总线多机通讯发送报文资料#includeSJA1000REG_1.h#include#include#include#include#define STD_FRAMEID_LENTH 2 /标准帧ID长度#define EXT_FRAMEID_LENTH 4 /扩展帧ID长度#define LOW_BYTE(x) (unsigned char)(x)#define HIGH_BYTE(x) (unsigned char)(unsigned int)(x)8)#define OSCCLK 11059200UL#define CPUCLK (OSCCLK/12)#define SJA_BAS
2、E_ADDR 0X7E00#define T0_MASK 0x0fsbit LED=P25;sbit SJA1000_RST=P26;unsigned char xdata *SJA_CS_Point=(unsigned char xdata*)SJA_BASE_ADDR;void SJA1000_Init(unsigned char btr0,unsigned char btr1,unsigned char *filter);void WriteSJAReg(unsigned char RegAdr,unsigned char Value); /写寄存器unsigned char ReadS
3、JAReg(unsigned char RegAdr); /读寄存器char SetBitMask(unsigned char RegAdr,unsigned char BitValue); /设置寄存器特定位char ClearBitMask(unsigned char RegAdr,unsigned char BitValue); /清除寄存器特定位char WriteSJARegBlock(unsigned char RegAdr,unsigned char *ValueBuf,unsigned char len); /连续写寄存器char ReadSJARegBlock(unsigne
4、d char RegAdr,unsigned char *ValueBuf,unsigned char len); /连续读寄存器char SetSJASendCmd(unsigned char cmd); /发送模式cmd 0为正常发送 1为单次发送 2为自发自收char SJASendData(unsigned char *databuf,unsigned char cmd); /sja1000发送函数,将数据写入sja1000发送缓冲区,再将其发到总线上 char SJARcvData(unsigned char *databuf); /SJA1000接收函数 读取接收缓冲区的CAN报文
5、 /void SJA1000_Config_Filter(char mode,char *Filter); /配置滤波器模式和滤波参数 mode大于0为双滤波器,其他为单滤波 unsigned char SJA_CAN_Filter8= 0xea,0x40,0x00,0x00,0x00,0x0f,0xff,0xff;unsigned char UserData8;typedef struct /结构定义 unsigned long ID; unsigned char FF; unsigned char RTR; unsigned char DLC; unsigned char CanData8
6、;CanFrame_t;CanFrame_t UserSendData;void UserDataDeal() UserData0=0x55; void NumDataDeal() UserSendData.ID=0x251; UserSendData.FF=0; UserSendData.RTR=0; UserSendData.DLC=8; UserSendData.CanData0=UserData0; UserSendData.CanData1=UserData1; UserSendData.CanData2=UserData2; UserSendData.CanData3=UserDa
7、ta3; UserSendData.CanData4=UserData4; UserSendData.CanData5=UserData5; UserSendData.CanData6=UserData6; UserSendData.CanData7=UserData7; void timerInit(void) /串口初始化 TMOD&=T0_MASK; /清除旧的设置(#define T0_MASK 0x0f) TMOD|=0x01;void timerDelay(unsigned int n) /延时0.01n do TL0=LOW_BYTE(65536UL-CPUCLK/100); T
8、H0=HIGH_BYTE(65536UL-CPUCLK/100); TR0=1; while(!TF0); TR0=0; TF0=0; while(-n!=0);void SJA1000_Init(unsigned char btr0,unsigned char btr1,unsigned char *filter) SetBitMask(REG_CAN_MOD,RM_RR_BIT); /进入复位模式 WriteSJAReg(REG_CAN_CDR,0x48); /配置时钟分频,选择peliCAN模式 WriteSJAReg(REG_CAN_MOD,0x09); /配置模式寄存器,选择单滤波、
9、正常模式 WriteSJARegBlock(REG_CAN_ACR0,filter,8); /配置验收代码/屏蔽寄存器 WriteSJAReg(REG_CAN_BTR0,btr0); /配置总线定时器0 WriteSJAReg(REG_CAN_BTR1,btr1); /配置总线定时器1 WriteSJAReg(REG_CAN_OCR,0x1A); /配置输出引脚TX0与RX0,推挽输出 ClearBitMask(REG_CAN_MOD,RM_RR_BIT); /推出复位模式void WriteSJAReg(unsigned char RegAdr,unsigned char Value) /写
10、SJA1000寄存器 *(SJA_CS_Point+RegAdr)=Value; return;unsigned char ReadSJAReg(unsigned char RegAdr) /读SJA1000寄存器 return(*(SJA_CS_Point+RegAdr);char SetBitMask(unsigned char RegAdr,unsigned char BitValue) /设置指定寄存器指定位为1 char status=0; unsigned char temp; temp=ReadSJAReg(RegAdr); temp=temp|BitValue; WriteSJ
11、AReg(RegAdr,temp); if(ReadSJAReg(RegAdr)=temp) status=1; else status=0; return(status);char ClearBitMask(unsigned char RegAdr,unsigned char BitValue) /将指定寄存器的指定位清零 char status=0; unsigned char temp; temp=ReadSJAReg(RegAdr); temp=temp&(BitValue); WriteSJAReg(RegAdr,temp); if(ReadSJAReg(RegAdr)=temp)
12、status=1; else status=0; return(status);char WriteSJARegBlock(unsigned char RegAdr,unsigned char *ValueBuf,unsigned char len) /连续写多个寄存器 RegAdr寄存器起始地址 len要连续写入的寄存器数 unsigned char i; if(len!=0) for(i=0;ilen;i+) WriteSJAReg(RegAdr+i,ValueBufi); return len;char ReadSJARegBlock(unsigned char RegAdr,unsig
13、ned char *ValueBuf,unsigned char len) /连续读多个寄存器 RegAdr寄存器起始地址 len要读取的寄存器数 unsigned char i; if(len!=0) for(i=0;i8) dlc=8; switch(*databuf&0xc0) case 0x00: len=STD_FRAMEID_LENTH+dlc+1; break; case 0x40: len=STD_FRAMEID_LENTH+1; break; case 0x80: len=EXT_FRAMEID_LENTH+dlc+1; break; case 0xc0: len=EXT_F
14、RAMEID_LENTH+1; break; default: len=0; status=0; break; if(len0) WriteSJARegBlock(REG_CAN_TXFMINFO,databuf,len); SetSJASendCmd(cmd); status=1; return(status);char SJARcvData(unsigned char *databuf) /SJA1000接收函数 读取接收缓冲区的CAN报文 char status=1; unsigned char len; unsigned char dlc; if(ReadSJAReg(REG_CAN_
15、SR)&RBS_BIT)=0) status=0; else *databuf=ReadSJAReg(REG_CAN_RXFMINFO); dlc=(*databuf&0x0f); if(dlc8) dlc=8; switch(*databuf&0xC0) case 0x00: len=STD_FRAMEID_LENTH+dlc; break; case 0x40: len=STD_FRAMEID_LENTH; break; case 0x80: len=EXT_FRAMEID_LENTH+dlc; break; case 0xC0: len=EXT_FRAMEID_LENTH; break;
16、 default: len=0; status=0; break; if(len0) ReadSJARegBlock(REG_CAN_RXBUF1,databuf+1,len); status=SetBitMask(REG_CAN_CMR,RRB_BIT); return(status);/*void SJA1000_Config_Filter(char mode,char *Filter) /配置滤波器模式和滤波参数 mode大于0为双滤波器,其他为单滤波 SetBitMask(REG_CAN_MOD,RM_RR_BIT); if(mode0) SetBitMask(REG_CAN_MOD,
17、AFM_BIT); else ClearBitMask(REG_CAN_MOD,AFM_BIT); WriteSJARegBlock(REG_CAN_ACR0,Filter,8); ClearBitMask(REG_CAN_MOD,RM_RR_BIT);*/int Hal_CanMsgSend(CanFrame_t *pCanFrame) /CAN控制器报文发送接口 unsigned char snd_buf13; unsigned long id; snd_buf0=(pCanFrame-DLC&0xf); if(pCanFrame-FF) snd_buf0=(1RTR) snd_buf0|
18、=(1FF) id=(pCanFrame-ID24)&0xff; snd_buf2=(id16)&0xff; snd_buf3=(id8)&0xff; snd_buf4=(id0)&0xff; memcpy(&snd_buf5,pCanFrame-CanData,pCanFrame-DLC); else id=(pCanFrame-ID8)&0xff; snd_buf2=id&0xff; memcpy(&snd_buf3,pCanFrame-CanData,pCanFrame-DLC); return SJASendData(snd_buf,0);int Hal_CanMsgRecive(Ca
19、nFrame_t *pCanFrame) /CAN控制器报文接收接口 unsigned char rcv_buf13; if(SJARcvData(rcv_buf) pCanFrame-DLC=(rcv_buf0&0xf); if(rcv_buf0&(1FF=1; else pCanFrame-FF=0; if(rcv_buf0&(1RTR=1; else pCanFrame-RTR=0; if(rcv_buf0&(1ID=rcv_buf1; pCanFrame-IDID+=rcv_buf2; pCanFrame-IDID+=rcv_buf3; pCanFrame-IDID+=rcv_buf4
20、; pCanFrame-ID=3; memcpy(pCanFrame-CanData,&rcv_buf5,8); else pCanFrame-ID=rcv_buf1ID|=rcv_buf2ID=5; memcpy(pCanFrame-CanData,&rcv_buf3,8); return 1; else return 0; int Hal_CanInit(void) SJA1000_RST=1; timerDelay(50); SJA1000_RST=0; SJA1000_Init( 0x00,0x14, SJA_CAN_Filter); return 1;void main() timerInit(); Hal_CanInit(); while(1) / unsigned char status,JiShu; / JiShu=0; UserDataDeal(); NumDataDeal(); if(Hal_CanMsgSend(&UserSendData) LED=!LED; timerDelay(100);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1