已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
3.(03424a)C8051F040中的CAN控制器应用P55CAN通信部分源程序如下:. /* 报文对象初始化程序清空所有报文对象,因为有些MESSAGE OBJECT不用但要初始化将不使用的message object的MsgVal都复位 */void clear_msg_objects (void) unsigned char i; SFRPAGE = CAN0_PAGE; /*指向CAN0页面:0X01 */ CAN0ADR = IF1CMDMSK; /* 指向命令屏蔽寄存器1*/ CAN0DATL = 0xFF; /*设置为“写”,通过IFX接口寄存器写目标对象*/ for (i=1;i33;i+) CAN0ADR = IF1ARB2; CAN0DAT=0X0000; CAN0DAT=0X0000; CAN0ADR = IF1CMDRQST; / Write blank (reset) IF registers to each msg obj CAN0DATL = i; /* Start CANCAN_CLK=8MHZ,BRP=2,BIT RATE=5MBit/s,bus length=100m 1M=0X163BIF1为发送操作接口寄存器,IF2为接收操作接口寄存器 100K=0X34C5*/void start_CAN (void) SFRPAGE = CAN0_PAGE; CAN0CN |= 0x41; /*将CCE和Init置“1”开始初始化*/ CAN0ADR = BITREG; /*指向位定时寄存器进行配置*/ CAN0DAT = 0x2301; /*位率为500k/s*/ CAN0CN |= 0x06; /*允许全局中断,IE和SIE置位*/ CAN0CN &= 0x41; /*清楚CCE和INIT位,启动CAN状态机制*/ /* 初始化发送对象 用四个message object,IF1用来发送报文 */void init_msg_object_TX (char MsgNum) SFRPAGE = CAN0_PAGE; CAN0ADR = IF1CMDMSK; /*指向IF1命令屏蔽寄存器*/ CAN0DAT = 0x00B8; /*设置为写操作,除了ID的mask和数据位不能改变,其它都可以变化*/ switch(MsgNum) case 1: /*第一个目标对象的ID=0*/ CAN0ADR = IF1ARB1; /*指向仲裁寄存器1*/ CAN0DAT = 0x0000; CAN0DAT = 0xA000; /*使用标准帧*/ CAN0ADR = IF1MSK1; /*设置相应的屏蔽寄存器*/ CAN0DAT = 0x0000; CAN0DAT = 0x0000;break; case 2: /*第2个目标对象的ID=1*/ CAN0ADR = IF1ARB1; CAN0DAT = 0x0000; CAN0DAT = 0xA004; CAN0ADR = IF1MSK1; CAN0DAT = 0x0000; CAN0DAT = 0x0004;break; case 3: /*第3个目标对象的ID=2*/ CAN0ADR = IF1ARB1; CAN0DAT = 0x0000; CAN0DAT = 0xA008; CAN0ADR = IF1MSK1; CAN0DAT = 0x0000; CAN0DAT = 0x0008;break; case 4: /*第4个目标对象的ID=3*/ CAN0ADR = IF1ARB1; CAN0DAT = 0x0000; CAN0DAT = 0xA00C; CAN0ADR = IF1MSK1; CAN0DAT = 0x0000; CAN0DAT = 0x000C;break; case 5: /*第5个目标对象的ID=4*/ CAN0ADR = IF1ARB1; CAN0DAT = 0x0000; CAN0DAT = 0xA010; CAN0ADR = IF1MSK1; CAN0DAT = 0x0000; CAN0DAT = 0x0010;break; CAN0ADR = IF1MSGC; /*设置报文控制寄存器:DLC=8,远程帧允许,中断允许*/ CAN0DAT = 0X2208; CAN0ADR = IF1CMDRQST; /*指向命令请求寄存器*/ CAN0DAT = MsgNum; /*向此寄存器中写入目标对象编号,对此对象进行设置*/ /* 初始化接收对象 用的四个message object,IF2用来接收报文 */void init_msg_object_RX (char MsgNum) SFRPAGE = CAN0_PAGE; CAN0ADR = IF2CMDMSK; /*指向命令屏蔽寄存器2*/ CAN0DAT = 0x00B8; switch(MsgNum) case 6: /*第6个对象用来接收数据ID=5*/ CAN0ADR = IF2ARB1; CAN0DAT = 0x0000; CAN0DAT = 0x8014; CAN0ADR = IF2MSK1; CAN0DAT = 0x0000; CAN0DAT = 0xC014; ;break; case 7: /*第7个对象用来接收数据ID=6*/ CAN0ADR = IF2ARB1; CAN0DAT = 0x0000; CAN0DAT = 0x8018; CAN0ADR = IF2MSK1; CAN0DAT = 0x0000; CAN0DAT = 0xC018; ;break; case 8: /*第8个对象用来接收数据ID=7*/ CAN0ADR = IF2ARB1; CAN0DAT = 0x0000; CAN0DAT = 0x801C; CAN0ADR = IF2MSK1; CAN0DAT = 0x0000; CAN0DAT = 0xC01C; ;break; case 9: /*第9个对象用来接收数据ID=8*/ CAN0ADR = IF2ARB1; CAN0DAT = 0x0000; CAN0DAT = 0x8020; CAN0ADR = IF2MSK1; CAN0DAT = 0x0000; CAN0DAT = 0xC020; ;break;case 10: /*第10个对象用来接收数据ID=9*/ CAN0ADR = IF2ARB1; CAN0DAT = 0x0000; CAN0DAT = 0x8024; CAN0ADR = IF2MSK1; CAN0DAT = 0x0000; CAN0DAT = 0xC024; ;break; CAN0ADR = IF2MSGC; /*设置报文控制寄存器:中断允许、DLC=8*/ CAN0DAT = 0x1488; CAN0ADR = IF2CMDRQST; CAN0DATL = MsgNum; /* 数据发送部分CAN数据更新,由定时器2产生中断 */void transmit_ISR(void) interrupt 5TF2=0; transmit_temp_value (); void transmit_temp_value (void)char i; for(i=0;i=4;i+) transmit_FIFO_block (i); void transmit_FIFO_block (char id_value) switch(id_value) case 0: transmit_message (0X01); break; case 1: transmit_message (0X02); break; case 2: transmit_message (0X03); break; case 3: transmit_message (0X04); break; case 4: transmit_message (0X05); break; void transmit_message (char MsgNum) uchar k=0,l=4; uchar m=8,n=12,h=16; uchar i; SFRPAGE = CAN0_PAGE; CAN0ADR = IF1CMDMSK; CAN0DAT = 0X0083; CAN0ADR = IF1ARB2; switch(MsgNum) case 0X01: CAN0DATH |= 0x80;CAN0ADR = IF1DATA1; for(i=0;i4;i+) CAN0DAT = can_tempk; k+; break;case 0X02: CAN0DATH |= 0x81; CAN0ADR = IF1DATA1; for(i=0;i4;i+) CAN0DAT = can_templ; l+; break;case 0X03: CAN0DATH |= 0x82; CAN0ADR = IF1DATA1; for(i=0;i4;i+)CAN0DAT = can_tempm; m+; break;case 0X04: CAN0DATH |= 0x83; CAN0ADR = IF1DATA1; for(i=0;i4;i+) CAN0DAT = can_tempn; n+; break;case 0X05: CAN0DATH |= 0x84; CAN0ADR = IF1DATA1; for(i=0;i4;i+) CAN0DAT = can_temph; h+; break; CAN0ADR = IF1CMDRQST; CAN0DATL = MsgNum; /* 数据接收函数 */void receive_data(void) char k,l,i; char m,n,h; SFRPAGE = CAN0_PAGE; CAN0ADR = IF2CMDMSK; CAN0DAT = 0x003F; for(i=6;i11;i+) CAN0ADR = IF2CMDRQST; CAN0DATL = i; switch(i) case 6: CAN0ADR = IF2DATA1; /* 指向数据场的第一个字节*/ for(k=0;k4;k+) /*读取4个字节的数据*/ can_RXk= CAN0DAT; ;break; case 7: CAN0ADR = IF2DATA1; for(l=4;l8;l+) can_RXl= CAN0DAT; ;break; case 8: CAN0ADR = IF2DATA1; for(m=8;m12;m+) can_RXm= CAN0DAT; ;break; case 9: CAN0ADR = IF2DATA1; for(n=12;n16;n+) can_RXn= CAN0DAT; ;break; case 10: CAN0ADR = IF2DATA1; for(h=16;h20;h+) can_RXh= CAN0DAT; ;break; /* CAN中断程序 */void CAN_ISR (void) interrupt 19 int status= CAN0STA; if (status&0x10) != 0) /* RxOk 置位,中断由接收引起*/ CAN0STA = (CAN0STA
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年应用气象学《气象业务技能》专项训练试题集
- 秋季安全开学第一课课件
- 雨水季节校园安全课件
- 针刺配合推拿治疗胯骨错缝气滞血瘀证的临床疗效观察
- 安全生产培训课件下载
- 企业管理-危化品车辆异地备案申请报告模板
- 环保工程项目案例分析试题及答案
- 房地产营销师资格认证试题及答案
- 电子商务实战课程第半个月测试卷答案与解析
- 健康生活常识普及与自我评估测试集
- 九宫数独200题(附答案全)
- 2024版年度树立正确就业观课件
- 食材配送投标方案技术标
- 中医护理适宜技术工作计划
- 虚拟电厂负荷调控系统建设方案
- 临床医学导论期末测试习题与答案
- 商业伦理与企业责任课件
- 企业该如何正确如何选人
- 机器人输尿管重建手术治疗成人输尿管狭窄的现状
- 水景工程喷泉
- 我的家乡邢台内丘县宣传介绍
评论
0/150
提交评论