继续调到现在,现在现象是:<br /><br />在改变了一些参数(如波特率)之后,接收与发送模块的中断均正常。但接收模块的LED测试表明,远程与数据帧的那个位,接收模块接收到的是1(即远程帧,实际发送的为数据帧),后用接收模块上的数码管显示了接收到的高8位,PTR,低3位标识符,发现与发送模发送过来的差别很远,根本就是乱来了。<br /> 波特率我没有认真算过,直接使用周工网站下载的计算器计算所得的,有网上**说该计算器计算值有误。模块使用24MHz晶振,(使用CLKOUT为MCU提供振荡信号),波特率设为100Kb,其它设置如下:<br /><br /> //-----------------------定义总线定时寄存器的值--------------------------------------------------------<br />#define SJA_BTR0 0x57 //该值需要用户根据实际需要的波特率进行计算<br />#define SJA_BTR1 0x11 //具体计算见**说明<br />//-----------------------设置接收报文类型(标示符)--------------------------------------------------------<br /> //该值需要用户根据实际需要重新配置<br />#define SJA_ACR 0xaa //验收代码寄存器的值<br />#define SJA_AMR 0xff //验收屏蔽寄存器的值<br />//-----------------------设置输出始终类型--------------------------------------------------------<br /> //该值需要用户根据实际需要重新配置<br />#define SJA_OCR 0xaa //输出控制寄存器的值<br />#define SJA_CDR 0x40 //始终分频寄存器的值<br /><br /><br />帧所用到的数据结构:<br /><br /><br />struct BASICCAN_BUFstruct{<br /> unsigned char FrameID_H ; //帧ID高8位<br /> unsigned char FrameLENTH ; //帧数据长度<br /> unsigned char FrameKIND ; //数据帧或远程帧(0:数据;1:远程)<br /> unsigned char FrameID_L3 ; //帧ID低3位<br /> unsigned char Frame_Data[8]; //数据缓冲区<br /> };<br /><br /><br /><br /><br />接收与发送部分的程序,觉得原来下载的不对,如下:<br /><br /><br />//------------------------------------------------------------------------------------------------------<br />// 函数类别 SJA1000基本操作<br />// 函数名称 Write_SJAsendBUF<br />// 入口函数 无<br />// 出口函数 setting_success<br />// 操作寄存器 发送缓存器(10-19)状态寄存器02<br />// 函数功能 写发送缓存器<br />// 特殊要求 只能在工作模式下写<br />//------------------------------------------------------------------------------------------------------<br />bit Write_SJAsendBUF(void)<br />{<br /> bit setting_success=0; <br /> unsigned char i;<br /> while(SJA_workmode==0)<br /> {<br /> setting_SJA_workingmode(); //设置SJA在工作模式<br /> }<br /> if((CANREG_read(0x02)&0x10)==0)<br /> {<br /> if((CANREG_read(0x02)&0x04)!=0)<br /> {<br /> CANREG_write(0x10,send_BUF.FrameID_H);<br /> CANREG_write(0x11,(send_BUF.FrameLENTH<<4)||(send_BUF.FrameKIND<<3)||(send_BUF.FrameID_L3));<br /> if(send_BUF.FrameKIND==0)<br /> {<br /> for(i=0;i<send_BUF.FrameLENTH,i<8;i++)<br /> CANREG_write(0x12+i,send_BUF.Frame_Data);<br /> }<br /> setting_success=1; //发送寄存器写成功<br /> }<br /> }<br /> return(setting_success);<br />}<br /><br />//------------------------------------------------------------------------------------------------------<br />// 函数类别 SJA1000基本操作<br />// 函数名称 Write_SJAsendBUF<br />// 入口函数 无<br />// 出口函数 setting_success<br />// 操作寄存器 接收缓存器(20-29)状态寄存器02<br />// 函数功能 写发送缓存器<br />// 特殊要求 只能在工作模式下写<br />//------------------------------------------------------------------------------------------------------<br />bit read_SJAreceiveBUF(void)<br />{<br /> bit setting_success=0; <br /> unsigned char i;<br /> while(SJA_workmode==0)<br /> {<br /> setting_SJA_workingmode(); //设置SJA在工作模式<br /> }<br /> if((CANREG_read(0x02)&0x01)!=0)<br /> {<br /> if((CANREG_read(0x02)&0x10)==0)<br /> {<br /> receive_BUF.FrameID_H=CANREG_read(0x20);<br /> receive_BUF.FrameLENTH=((CANREG_read(0x21)&0xF0)>>4);<br /> receive_BUF.FrameKIND=((CANREG_read(0x21)&0x08)>>3);<br /> receive_BUF.FrameID_L3=(CANREG_read(0x21)&0x07);<br /> if(receive_BUF.FrameKIND==0)<br /> {<br /> for(i=0;i<receive_BUF.FrameLENTH,i<8;i++)<br /> receive_BUF.Frame_Data=CANREG_read(0x22+i);<br /> }<br /> setting_success=1; //接收寄存器读成功<br /> }<br /> }<br /> return(setting_success);<br />}<br /><br /><br /><br /><br />我修改的发送与接收函数:<br /><br /><br />//------------------------------------------------------------------------------------------------------<br />// 函数类别 SJA1000基本操作<br />// 函数名称 Write_SJAsendBUF<br />// 入口函数 无<br />// 出口函数 setting_success<br />// 操作寄存器 发送缓存器(10-19)状态寄存器02<br />// 函数功能 写发送缓存器<br />// 特殊要求 只能在工作模式下写<br />//------------------------------------------------------------------------------------------------------<br />bit Write_SJAsendBUF(void)<br />{<br /> bit setting_success=0; <br /> unsigned char i;<br /><br />// while(SJA_workmode==0)<br />// {<br />// setting_SJA_workingmode(); //设置SJA在工作模式<br />// }<br /><br /> if((CANREG_read(0x02)&0x10)==0)<br /> {<br /> if((CANREG_read(0x02)&0x04)!=0)<br /> {<br /> CANREG_write(0x10,send_BUF.FrameID_H);<br /> CANREG_write(0x11,(send_BUF.FrameLENTH)||(send_BUF.FrameKIND<<4)||(send_BUF.FrameID_L3<<5));<br /> <br /> if(send_BUF.FrameKIND==0)<br /> {<br /> for(i=0;i<send_BUF.FrameLENTH,i<8;i++)<br /> CANREG_write(0x12+i,send_BUF.Frame_Data);<br /> P1_7 = !P1_7;<br /> }<br /> //发送寄存器写成功<br /> setting_success=1;<br /> }<br /> <br /><br /> }<br /> else <br /> {<br /> setting_success=0;<br /> }<br /> return(setting_success);<br />}<br />//------------------------------------------------------------------------------------------------------<br />// 函数类别 SJA1000基本操作<br />// 函数名称 Write_SJAsendBUF<br />// 入口函数 无<br />// 出口函数 setting_success<br />// 操作寄存器 接收缓存器(20-29)状态寄存器02<br />// 函数功能 写发送缓存器<br />// 特殊要求 只能在工作模式下写<br />//------------------------------------------------------------------------------------------------------<br />bit read_SJAreceiveBUF(void)<br />{<br /> bit setting_success=0; <br /> unsigned char i;<br />// while(SJA_workmode==0)<br />// {<br />// setting_SJA_workingmode(); //设置SJA在工作模式<br />// }<br /> if((CANREG_read(0x02)&0x01)!=0)<br /> {<br /> if((CANREG_read(0x02)&0x10)==0)<br /> {<br /> receive_BUF.FrameID_H=CANREG_read(0x20);<br /> receive_BUF.FrameLENTH=((CANREG_read(0x21)&0x0f));<br /> receive_BUF.FrameKIND=((CANREG_read(0x21)&0x10)>>4);<br /> receive_BUF.FrameID_L3=((CANREG_read(0x21)&0xe0)>>5);<br /> if(receive_BUF.FrameKIND==0)<br /> {<br /> for(i=0;i<receive_BUF.FrameLENTH,i<8;i++)<br /> receive_BUF.Frame_Data=CANREG_read(0x22+i);<br /> }<br /> setting_success=1; //接收寄存器读成功<br /> }<br /> }<br /> else <br /> {<br /> setting_success=0;<br /> }<br /> return(setting_success);<br />}<br />
|