[CAN-bus/DeviceNet] 请教wxj1952前辈:Basic模式双节点通信接收不成功

[复制链接]
 楼主| 桂电飞天鼠 发表于 2007-4-8 00:58 | 显示全部楼层 |阅读模式
&nbsp;&nbsp;&nbsp;&nbsp;SJA1000的驱动用了网上找的,已经详细看过,符合Basic的通信的要求(看不出有什么问题,跟周工网站提供的函数基本是一样的)初始化设置都设好了,中断全部使能。<br />&nbsp;&nbsp;&nbsp;&nbsp;两个CAN模块(SJA1000+89S51,两模块是一样的,只是其中一个接了18B20,板上有两个LED,一个MAX7219驱动的四位数码管,一个蜂鸣器)。<br />&nbsp;&nbsp;&nbsp;&nbsp;本实验的目的是:一块将测得的温度发送到另一块板上并显示。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;现在问题是:一块将测得的温度(18B20板上的)每隔10ms发送出去。有一个LED显示发送中断有效,不过闪烁频率时低时高(不断取反的);另一块接收模块,四位数码管显示0(即没收到数据),没有接收中断(已使能),交换两板也一样,即肯定是程序问题。但当复位接收的那个模块时(复位键),发送模块上的错误码中断指示LED亮,不过一会儿就灭了。后用接收模块上的MAX7219四位数据管的其中两位用来显示状态寄存器的值,其中接收状态位(RS)隔一段时间显示正在接收(跟发送模块的发送中断LED的闪烁频率有关),然后又不接收。<br />&nbsp;&nbsp;&nbsp;&nbsp;不清楚表达清楚了没?我现在想知道,在basic模块下,接收中断出不来会是什么原因?谢谢了~~<br />&nbsp;&nbsp;&nbsp;&nbsp;(手上有一老式20M双踪示波器,可以看到两条传输线都有占空比不同的方波(类似))。<br />
wxj1952 发表于 2007-4-8 12:30 | 显示全部楼层

参考程序

1、别在中断程序里处理任务;<br />2、把10ms改为100ms,可行后逐渐缩短,发现问题。<br /><br /><br />while(!RBF){<br />receive();<br />.......<br />RBF=0;<br />}<br /><br />void&nbsp;ex0int(void)&nbsp;interrupt&nbsp;0&nbsp;using&nbsp;0<br />{<br />LED1=!LED1;<br />RBF=1;&nbsp;&nbsp;<br />}
 楼主| 桂电飞天鼠 发表于 2007-4-8 15:32 | 显示全部楼层

之前已试过不行

程序都是用中断改变标志,由主程序刷新标志的执行方式工作的。<br /><br />现在是中断进不了,任何中断都没有发生(接收模块)。奇怪了~~不知道是不是验收/屏蔽没设好?<br /><br />我再调试看看。
 楼主| 桂电飞天鼠 发表于 2007-4-8 16:04 | 显示全部楼层

确实是验收屏蔽没处理好!

我把AMR设为0xff,中断就正常了!<br />不过显示还是不正常,继续检错中。。。。
 楼主| 桂电飞天鼠 发表于 2007-4-9 02:04 | 显示全部楼层

继续

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

确实是乱了套

//-----------------------定义总线定时寄存器的值--------------------------------------------------------<br />#define&nbsp;SJA_BTR0&nbsp;0x57&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//该值需要用户根据实际需要的波特率进行计算<br />#define&nbsp;SJA_BTR1&nbsp;0x11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//具体计算见**说明<br />//-----------------------设置接收报文类型(标示符)--------------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//该值需要用户根据实际需要重新配置<br />#define&nbsp;SJA_ACR&nbsp;0xaa&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//验收代码寄存器的值<br />#define&nbsp;SJA_AMR&nbsp;0xff&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//验收屏蔽寄存器的值<br />//-----------------------设置输出始终类型--------------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//该值需要用户根据实际需要重新配置<br />#define&nbsp;SJA_OCR&nbsp;0xaa&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//输出控制寄存器的值<br />#define&nbsp;SJA_CDR&nbsp;0x40&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//始终分频寄存器的值<br /><br />问题:<br />1、这些寄存器只能在程序运行中(且只能复位模式下)写吧。能预定义?<br /><br />2、&nbsp;for(i=0;i&ltsend_BUF.FrameLENTH,i&lt8;i++)&nbsp;&nbsp;&nbsp;能行?反正我认为不可行。<br /><br /><br />可以在论坛上查找两篇**:<br /><br />1、CAN波特率的简单计算&nbsp;<br /><br />2、SJA1000标准发送/接收实验C程序&nbsp;<br /><br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

273

帖子

0

粉丝

13

主题

273

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部