版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、MCP2515SJA1000通讯调试记录一、CAN总线CAN是控制器局域网络(ControllerAreaNetwork,CAN)的简称,是由研发和生产汽车电子产品著称的德国BOSCH公司开发了的,并最终成为国际标准(ISO11898)。SJA1000是飞利浦公司一款并行接口的CAN协议控制器,为了减少IO口资源占用,Microchip推由SPI接口CAN协议控制器,型号:MCP2515。这两款芯片都支持CANV2.0B技术规范,能发送和接收标准和扩展数据帧以及远程帧。CAN电平:CAN数据格式:标准帧扩展帧远程帧(省略)二、原理图2.1、 MCP2515的原理图2.2、 SJA1000的原理
2、图三、调试思路3.1、 SPI接口调试3.2、 CAN接口调试第一步:配置CLKOUT输生(CANCTRL寄存器配置CLKEN和分频系数),通过示波器观察CLKOUT引脚输由。确认MCP2515受控。第二步:环路测试(自发自收)首先MCP2515配置成环路模式,下面是验证环路测试1、配置RXB0禁止滤波屏蔽标识符功能1、收发功能是否正常。验证:RXB0接收数据(可以读取接收缓冲区获取)和发送数据对比,是否一致。2、开启CANINTE.TX0IE、CANINTE.RX0IE中断,监测/INT和/RX0B引脚电平变化。理论上:1)成功发送数据,TXB0CTRL.TXREQ由1变成0和/INT引脚产
3、生中断,且CANINTF.TX0IF发送中断标志位置1。2)成功接收数据,/INT引脚产生中断,且CANINTF,RX0IF发送中断标志位置1。同时RX0BF引脚由现低电平(前提使能RX0BF接收缓冲区满中断引脚,BFPCTRL.BxBFE和BFPCTRL.BxBFM置1)2、配置RXB0使能滤波屏蔽标识符功能(11位标准标识符)1、发送两组数据帧:先发送不符合滤波码的数据帧,然后发送符合滤波码的数据帧。验证方法:1、读取RX接收缓冲区,打印由来2、通过/INT和RX0BF引脚时序判断。理论:当成功发送第一帧数据是,中断引脚/INT置低,但数据的标识符不符合滤波码;发送第二帧数据符合滤波码,所
4、以RX0BF置低。注:/INT引脚为什么一直置低?因为响应中断后,未清除中断标志位。当清除中断标志位后,/INT恢复高电平。第三步:MCP2515同SJA1000通讯(MCP2515发送)初步调试现象:SJA1000未将接收数据发送。个人分析可能原因:1、硬件连接:通过示波器监测TJA1040T的发送端TXD和PCA82C250的接收端RXD波形一致。2、波特率:通过一对SJA1000模块收发,测试CAN总线时序,可知波特率100K。而MCP2515发送数据时,测试的波特率也是100Ko3、电平兼容性:可以排除。4、有无验证滤波码:查看外SJA1000程序,该程序中未设置屏蔽码(即接收标准标识
5、符的所有数据),可以排除。5、CAN终端匹配电阻:TJA1040T的匹配电阻参考datasheet设计,而SJA1000未接匹配电阻,后来焊接60欧,可以排除。6、通过CAN错误标志寄存器EFLG状态判定问题TXB0CTRL1B-报文发送期间发送总线错误和报文发送请求位CANINTFA0-报文错误中断标志位和错误中断标志位置1EFLG20-总线关闭错误标志位置1(即发送错误计数器TEC>255)TEC00总线发送错误计数器REC5E总线接收错误计数器综上所述:CAN总线异常。7、查看CAN电平转换芯片TJ1040引脚信号,发现该芯片由3.3V,而datasheet表示需要5V。(
6、该步骤应该放在第一步,自己过失一)。通过焊下芯片割断VCC与3.3V连接,并同5V连接。重新测试后,发现CAN总线上无数据,而TJ1040的TXD有数据。why?查看TJ1040的PIN8的引脚一直为高电平,由datasheet可知:芯片处于待机模式,无法实现CAN电平转换。通过确认:TJ1040的PIN8的引脚虚焊,导致的。排除上述问题后,在CAN总线上有数据通讯。已知MCP2515发送数据格式:11位标识符ID=0x110、数据长度DLC=8、data0-7=0x00-0x07。通过示波器解码CAN_H的数据得由下图,对比后发现一致,且SJA1000接收到数据也一致。第三步:MCP2515
7、同SJA1000通讯(MCP2515接收)由第二步成功发送,表明CAN总线可以正常通讯。所以接收程序可以参考环路模式中接收程序。通过上面调试感想:此次调试主要问题硬件上大意:1.、未发现TJ1040T芯片电源不合适(3.3V)2、焊接TJ1040T时,虚焊。这两点都是低级错误。以后必须杜绝。以后调试硬件,首先将该芯片相关信号(VCC、GND、RET、CS等)全部测试一下确认无误,在进行软件调试。四、程序4.1、 MCP2515程序voidMCP2515_init(void)(MCP2515_Reset();/*NO1checkifMODE_CONFIG*/while(MCP2515_Read(
8、MCP2515REG_CANSTAT)&MODE_CONFIG)!=MODE_CONFIG)(MCP2515_Write(MCP2515REG_CANCTRL,0x86);/如果未进入MODE_CONFIG,重新配置)/*NO2CNF1-3,Baud=100K对应20个*TQ*/MCP2515_Write(CNF1,SJW1|0x4);/SynchronizationJumpWidthLength=1*TQMCP2515_Write(CNF2,BTLMODE_CNF3|(SEG8<<3)|SEG3);/PhaseSeg1=8*TQ,PropSeg=3
9、*TQMCP2515_Write(CNF3,SEG8);/PhaseSeg2=8*TQ/*NO3设置MCP2515中断使能寄存器,使能接收缓冲器中断*/MCP2515_Write(CANINTE,0xff);MCP2515_Write(CANINTF,0x00);/*NO4设置数据接收相关寄存器*/MCP2515_Write(RXB0CTRL,RXB_RXM0);/设置RXM1:0=01,接收缓冲器0接收标准标识符报文;禁止滚存功能MCP2515_Write(RXB1CTRL,RXB_RXM0|RXB_RXF2);/设置RXM1:0=10,接收缓冲器1接收标准标识符报文;禁止滚存功能/*NO5
10、配置引脚设置接收相关引脚控制寄存器,配置它们禁用第二功能*/MCP2515_Write(BFPCTRL,0x05);/当由接收报文时,引脚/RX0BF产生中断信号MCP2515_Write(RXB0DLC,0x08);/设置RXsizeMCP2515_Write(RXB1DLC,0x08);/设置RXsize/*NO6设置2个验收滤波寄存器*/MCP2515_Write(RXF0SIDH,0x22);/RXF0=0x22,即验收滤波器ID10:3=0x22MCP2515_Write(RXF0SIDL,0x00);/验收滤波器ID2:0=0x00MCP2515_Write(RXF2SIDH,0x
11、22);/RXF0=0x000MCP2515_Write(RXF2SIDL,0x00);/*NO7设置屏蔽滤波寄存器为*/MCP2515_Write(RXM0SIDH,0xFF);/RXM0=0x3FF,验收屏蔽使能10:3=0xFFMCP2515_Write(RXM0SIDL,0xE0);/验收屏蔽使能2:0=0x7即是需要验证所有标准帧的11位ID。MCP2515_Write(RXM1SIDH,0xFF);/RXM0=0x3FF,验收屏蔽使能10:3=0xFFMCP2515_Write(RXM1SIDL,0xE0);/验收屏蔽使能2:0=0x7即是需要验证所有标准帧的11位ID。/MCP2
12、515_Write(RXM0SIDH,0x00);/RXM0=0x00,验收屏蔽使能10:3=0x00/MCP2515_Write(RXM0SIDL,0x00);/验收屏蔽使能2:0=0x0即是不验证标准帧的11位ID,接收任何标准帧数据。/*N07设置发送相关引脚控制寄存器,配置它们禁用第二功能*/MCP2515_Write(TXRTSCTRL,0x00);/*NO8setMODE_LOOPBACKMCP2515进入环回模式,进行功能测试*/#ifDEBUG_loopbackMCP2515_Write(MCP2515REG_CANCTRL,(MODE_LOOPBACK|CLKEN|CLK2)
13、;#elseMCP2515_Write(MCP2515REG_CANCTRL,(MODE_NORMAL|CLKEN|CLK2);#endifvoidMCP2515_loopback(void)Uint8data8=1,2,3,4,5,6,7,8,temp;printf('nThisMCP2515_loopbacktestn');MCP2515_Write(TXB0CTRL,(MCP2515_Read(TXB0CTRL)&(TXB_TXREQ_M);/清除请求发送位TXB_TXREQ_M/*发送第一帧不可识别标识符数据帧*/MCP2515_Write(TXB0CT
14、RL,0x03);设置为发送最高优先级MCP2515_Write(TXB0SIDH,0x88);/SID10-SID3MCP2515_Write(TXB0SIDL,0x00);/SID2-SID0MCP2515_Write(TXB0DLC,0x08);/发送数据长度为8字节MCP2515_Write(TXB0D0,0x11);/发送数据长度为8字节发送数据长度为8字节发送数据长度为8字节MCP2515_Write(TXB0D1,0x22);/发送数据长度为8字节MCP2515_Write(TXB0D2,0x33);/MCP2515_Write(TXB0D3,0x44);发送数据长度为8字节MC
15、P2515_Write(TXB0D4,0x55);/发送数据长度为8字节MCP2515_Write(TXB0D5,0x66);MCP2515_Write(TXB0D6,0x77);/发送数据长度为8字节MCP2515_Write(TXB0D7,0x88);/发送数据长度为8字节temp=MCP2515_Read(TXB0CTRL);MCP2515_Write(TXB0CTRL,(temp|TXB_TXREQ_M);/请求发送while(MCP2515_Read(TXB0CTRL)&TXB_TXREQ_M)=TXB_TXREQ_M)/等待发送完毕/printf('TXB0
16、CTRL%02Xn',MCP2515_Read(TXB0CTRL);/printf('CANINTF%02Xn',MCP2515_Read(CANINTF);printf('CANINTF%02Xn',MCP2515_Read(CANINTF);if(MCP2515_Read(CANINTF)&0x01=01)MCP2515_Write(CANINTF,0);/清除中断标志位printf('RXB0SIDH%02Xn',MCP2515_Read(RXB0SIDH);printf('RXB0SIDL%02Xn'
17、;,MCP2515_Read(RXB0SIDL);/printf('TXB0CTRL%02Xn',MCP2515_Read(TXB0CTRL);/printf('CANINTF%02Xn',MCP2515_Read(CANINTF);printf('RXB0D0%02Xn',MCP2515_Read(RXB0D0);printf('RXB0D1%02Xn',MCP2515_Read(RXB0D1);printf('RXB0D2%02Xn',MCP2515_Read(RXB0D2);printf('RXB0D
18、3%02Xn',MCP2515_Read(RXB0D3);printf('RXB0D4%02Xn',MCP2515_Read(RXB0D4);printf('RXB0D5%02Xn',MCP2515_Read(RXB0D5);printf('RXB0D6%02Xn',MCP2515_Read(RXB0D6);printf('RXB0D7%02Xn',MCP2515_Read(RXB0D7);/*发送第二帧可识别标识符数据帧*/MCP2515_Write(CANINTF,0);/清除中断标志位MCP2515_Write(TX
19、B0CTRL,0x03);设置为发送最高优先级MCP2515_Write(TXB0SIDH,0x22);/SID10:3=0x22MCP2515_Write(TXB0SIDL,0x00);/SID2-SID0MCP2515_Write(TXB0DLC,0x08);/发送数据长度为8字节MCP2515_Write(TXB0D0,data0);/发送数据长度为8字节MCP2515_Write(TXB0D1,data1);/发送数据长度为8字节MCP2515_Write(TXB0D2,data2);/发送数据长度为8字节MCP2515_Write(TXB0D3,data3);/发送数据长度为字节MC
20、P2515_Write(TXB0D4,data4);/发送数据长度为字节MCP2515_Write(TXB0D5,data5);/发送数据长度为字节MCP2515_Write(TXB0D6,data6);/发送数据长度为字节MCP2515_Write(TXB0D7,data7);/发送数据长度为字节temp=MCP2515_Read(TXB0CTRL);MCP2515_Write(TXB0CTRL,(temp|TXB_TXREQ_M);/求发送while(MCP2515_Read(TXB0CTRL)&TXB_TXREQ_M)=TXB_TXREQ_M)/等待发送完毕printf(
21、'TXB0CTRL%02Xn',MCP2515_Read(TXB0CTRL);printf('CANINTF%02Xn',MCP2515_Read(CANINTF);if(MCP2515_Read(CANINTF)&0x01=01)/判断是否接收到符合规则数据帧MCP2515_Write(CANINTF,0);/清除中断标志位printf('RXB0D0%02Xn',MCP2515_Read(RXB0D0);printf('RXB0D1%02Xn',MCP2515_Read(RXB0D1);printf('
22、RXB0D2%02Xn',MCP2515_Read(RXB0D2);printf('RXB0D3%02Xn',MCP2515_Read(RXB0D3);printf('RXB0D4%02Xn',MCP2515_Read(RXB0D4);printf('RXB0D5%02Xn',MCP2515_Read(RXB0D5);printf('RXB0D6%02Xn',MCP2515_Read(RXB0D6);printf('RXB0D7%02Xn',MCP2515_Read(RXB0D7);4.2、 SJA1000
23、0程序尸*工程:芯片SJA1000从CAN总线接收任何标识符的数据功能:从CAN总线接收一帧数据,并通过RS232发送由去数据格式=标识符(任意)长度(8)数据参数:CAN总线波特率100K,RS232通讯波特率57600时间:2011年4月6日*/根据时序要求,可以利用I/O口模拟总线了:/*读SJA1000*/uintRead_SJA1000(uintaddress)uchardata;asm('nop');ALE_0;WR_1;RD_1;/DDRB=0xff;/数据口为输由/PORTB=address;/输由数据的地址DATA_D1;/数据口为输由DATA=address
24、;/输出数据的地址asm('nop');/delay5us(1);ALE_1;asm('nop');/delay5us(1);asm('nop');/delay5us(1);ALE_0;RD_0;asm('nop');/delay5us(2);asm('nop');/DDRB=0x00;/数据口为输入/PORTB=0xff;/上拉DATA_D0;/数据口为输入DATA=0xff;/上拉asm('nop');/data=PINB;/获得数据data=DATA_IN;/获得数据asm('nop&
25、#39;);/delay5us(1);RD_1;asm('nop');/delay5us(2);returndata;/*voidWrite_SJA1000(uintaddress,uintdata)asm('nop');SJA10000*/DDRB=0xff;数据口为输由/PORTB=address;/输由数据的地址DATA_D1;/数据口为输由DATA=address;/输由数据的地址ALE_0;WR_1;RD_1;asm('nop');/delay5us(1);ALE_1;asm('nop');/delay5us(1);as
26、m('nop');/delay5us(1);ALE_0;WR_0;asm('nop');/delay5us(1);asm('nop');/PORTB=data;输由数据DATA=data;/输由数据asm('nop');/delay5us(2);WR_1;asm('nop');/delay5us(2);asm('nop');/dog();voidCAN_init(void)CAN初始化uchara;doWrite_SJA1000(CAN_MOD,0x01);设定复位模式的请求位a=Read_SJA1
27、000(CAN_MOD);读取模式寄存器中状态while(a&0x01)=0x00);/保证进入复位模式,bit0.0不为1,再写CAN_MODWrite_SJA1000(CAN_CDR,0x40);写时钟分频寄存器,Basic模式Write_SJA1000(CAN_BTR0,0x43);/写总线定时器0寄存器晶振16M,通讯波特率100KWrite_SJA1000(CAN_BTR1,0x2f);/写总线定时器1寄存器Write_SJA1000(CAN_OCR,0x1a);/写输由控制寄存器Write_SJA1000(CAN_ACR,0x01);/验收码寄存器,表示需要验证的接
28、收标识符Write_SJA1000(CAN_AMR,0xff);/写验收屏蔽寄存器,当莫一位为1时,表示对应验收码寄存器的位无屏蔽作用报文标识符高8位(ID.10-ID03)对应着验收代码AC.7-AC.0/而AM.7-AM.0对应AC.7-AC.0doWrite_SJA1000(CAN_MOD,0x00);/退由复位模式a=Read_SJA1000(CAN_MOD);/读取模式寄存器中状态while(a&0x01)=0x01);/保证进入复位模式,bit0.0不为0,再写CAN_MO/*函数名称:voidUsart_Receive(void)函数功能:查询方式,接收数据参数:
29、返回值:无*/unsignedcharUsart_Receive(void)/定义返回值类型,否贝由错while(!(UCSRA&(1<<RXC);判断是否有数据未读生returnUDR;/获取并返回接收数据)/*函数名称:voidUsart_Transmit(unsignedchari)函数功能:查询方式,发送数据参数:返回值:无*/voidUsart_Transmit(unsignedchari)while(!(UCSRA&(1<<UDRE);/判断UDR是否为空UDR=i;/发送数据)/INT0中断函
30、数#pragmainterrupt_handlerInt0:2voidInt0(void)uchara,b0,b1,b2,b3,b4,b5,b6,b7,b8,b9;a=Read_SJA1000(0x03);a=a&0x04;if(a!=0x04)(a=Read_SJA1000(0x02);a=a&0x01;if(0x01=a)(b0=Read_SJA1000(0x14);b1=Read_SJA1000(0x15);b2=Read_SJA1000(0x16);b3=Read_SJA1000(0x17);b4=Read_SJA1000(0x18);b5=Read_SJA1000(0x19);b6=Read_SJA1000(0x1a);b7=Read_SJA1000(0x1b);b8=Read_SJA1000(0x1c);b9=Read_SJA1000(0x1d);Write_SJA1000(0x01,0x04);/释放接收缓冲区Usart_Transmit(0xff);Usart_Transmit(b0);Usart_Transmit(b1);Usart_Transmit(b2);Usart_Transmit(b3);Usart_Transmit(b4);Usart_Transmit(b5);Usart_Transmit(b6);Usart_Tr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年华师大版八年级历史下册月考试卷
- 2024版劳务分包协议书保证
- 临时季节工劳动合同示范文本 2024年一
- 2025年北师大版九年级科学下册阶段测试试卷
- 2025年外研版高一物理下册月考试卷含答案
- 2025年仁爱科普版九年级英语下册阶段测试试卷
- 2025年人教版PEP八年级科学下册月考试卷
- 2025年冀教版一年级语文下册月考试卷
- 2025年浙科版第二册地理下册阶段测试试卷含答案
- 2024年高标准场地租赁协议
- 单位档案三合一制度怎么写范文
- 【课件】跨学科实践:探索厨房中的物态变化问题-人教版八年级上册物理
- 房地产企业岗位招聘笔试题题库之四(含答案)营销副总经理
- 某集团下属子公司年度经营绩效管理办法全套
- 2024-2030年中国汽车防撞梁行业发展动态与市场需求研究报告
- 骨科中医护理方案培训计划(2篇)
- 2024年美国X射线荧光光谱仪(XRF)市场现状及上下游分析报告
- 2024年江苏农牧科技职业学院单招职业适应性测试题库必考题
- 食品机械与设备智慧树知到期末考试答案章节答案2024年西北农林科技大学
- 861个CCER备案项目清单
- 直肠脱垂的护理查房
评论
0/150
提交评论