ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:17.21KB ,
资源ID:10192651      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10192651.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(can总线多机通讯发送报文资料.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

can总线多机通讯发送报文资料.docx

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