[CAN-bus/DeviceNet] LPC2119 CAN 多节点竞争 报文内容出错 移位

[复制链接]
3079|3
 楼主| 有意思 发表于 2009-3-12 10:15 | 显示全部楼层 |阅读模式
<br />网络拓扑结构为5个20Kbps的主CAN节点,通过5个LPC2119+PCA82AC250(网关)将波特率降低至12kbps、5Kbps已适应远距离传输,网关采用透明传输,使用<br />缓冲区存储转发,<br />20K→5K使用一个大缓冲区,可存储800帧报文,<br />5K→20K使用一个小缓冲区,可存储80帧报文,<br />5个网关通过5K的CAN总线联网,手拉手式连接,短线,5个主节点可能同时向<br />网关发送事件信息,每个主节点约有12个事件约60帧的报文向CAN总线发送,很可能是同时发送的,即肯定为发送总线竞争;<br />经多次测试发现,低速口多次发生“仲裁丢失中断”,导致各节点不同收到所有<br />网络上的事件信息,如果只有一个节点发送事件信息,250个事件约1000帧也不<br />会出现丢帧现象;<br />疑问:即使出现竞争,CAN协议2.0不是规定要自动重发的吗?应该可以保证数据都能发送到总线上?以下是相关代码:<br /><br />/**********中断发送程序***********/<br />void&nbsp;__irq&nbsp;can_isr(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint32&nbsp;dev&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;uCANICR&nbsp;k;<br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(dev=0;&nbsp;dev&ltCAN_MAX_NUM;&nbsp;dev++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k&nbsp;=&nbsp;CANICR(dev);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(k.Bits.RI_BIT&nbsp;!=&nbsp;0){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//rcvdata_fromcanbus(dev);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(CAN1&nbsp;==&nbsp;dev)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;Low2High&nbsp;*ptr=&LowSpeed2Highbuf;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ptr-&gtfull&nbsp;==&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr-&gtbuf[ptr-&gtstart]&nbsp;=&nbsp;RxBUF(dev);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(++ptr-&gtstart&nbsp;&gt=&nbsp;SIZEOF_LOW_HIGH)<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;ptr-&gtstart&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ptr-&gtstart&nbsp;==&nbsp;ptr-&gtend)<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;ptr-&gtfull&nbsp;=&nbsp;_FULL_;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else&nbsp;ON_RCAN_LED();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RelCanRecBuf(dev);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else&nbsp;if&nbsp;(CAN2&nbsp;==&nbsp;dev){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;High2Low&nbsp;*ptr=&HighSpeed2Lowbuf;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ptr-&gtfull&nbsp;==&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr-&gtbuf[ptr-&gtstart]&nbsp;=&nbsp;RxBUF(dev);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(++ptr-&gtstart&nbsp;&gt=&nbsp;SIZEOF_HIGH_LOW)<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;ptr-&gtstart&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ptr-&gtstart&nbsp;==&nbsp;ptr-&gtend)<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;ptr-&gtfull&nbsp;=&nbsp;_FULL_;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else&nbsp;ON_RCAN_LED();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RelCanRecBuf(dev);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((k.Bits.TI1_BIT&nbsp;!=&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||&nbsp;(k.Bits.TI2_BIT&nbsp;!=&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||&nbsp;(k.Bits.TI3_BIT&nbsp;!=&nbsp;0))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(k.Bits.ALCBIT_BIT&nbsp;!=&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag[dev]&nbsp;|=&nbsp;1&lt&lt2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(k.Bits.BEI_BIT&nbsp;!=&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CanBufOffLinePrg(dev);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(k.Bits.DOI_BIT&nbsp;!=&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag[dev]&nbsp;|=&nbsp;1&lt&lt4;<br />&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;ClrCanDataOver(dev);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr&nbsp;=&nbsp;0x00;<br />}<br /><br />/*高速口数据转发至低速口*/<br />void&nbsp;SendHigh2LowData2Bus(void)<br />{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;High2Low&nbsp;*ptr=&HighSpeed2Lowbuf;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((ptr-&gtstart&nbsp;!=&nbsp;ptr-&gtend)&nbsp;||&nbsp;ptr-&gtfull&nbsp;==&nbsp;_FULL_&nbsp;)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(CANGSR(CAN1).Bits.TBS_BIT&nbsp;!=&nbsp;0){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(BegainSend2CANBus(CAN1,&nbsp;&ptr-&gtbuf[ptr-&gtend])&nbsp;!=&nbsp;1){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TCAN_LEDGlint();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(++ptr-&gtend&nbsp;&gt=&nbsp;SIZEOF_HIGH_LOW)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr-&gtend&nbsp;=&nbsp;0;<br />&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr-&gtfull&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />/*低速口转发至高速口*/<br />void&nbsp;SendLow2HighData2Bus(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;Low2High&nbsp;*ptr=&LowSpeed2Highbuf;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((ptr-&gtstart&nbsp;!=&nbsp;ptr-&gtend)&nbsp;||&nbsp;ptr-&gtfull&nbsp;==&nbsp;_FULL_)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ptr-&gtfull&nbsp;==_FULL_)&nbsp;print(&quot;low&nbsp;to&nbsp;high&nbsp;is&nbsp;fullx0dx0a&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(CANGSR(CAN2).Bits.TBS_BIT&nbsp;!=&nbsp;0){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(BegainSend2CANBus(CAN2,&nbsp;&ptr-&gtbuf[ptr-&gtend])&nbsp;!=&nbsp;1){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TCAN_LEDGlint();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(++ptr-&gtend&nbsp;&gt=&nbsp;SIZEOF_LOW_HIGH)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr-&gtend&nbsp;=&nbsp;0;<br />&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr-&gtfull&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><br />/*<br />********************************************************************************<br />**函数名称:BegainSend2CANBus<br />**函数功能:启动发送<br />**入口参数:cannum:CAN控制器通道号ptr:发送缓冲区指针<br />**出口参数:1:&nbsp;erro&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0:right<br />**函数说明:选择发送缓冲区<br />**<br />********************************************************************************<br />*/<br />uint32&nbsp;BegainSend2CANBus(uint32&nbsp;cannum,&nbsp;struct&nbsp;ObjectMessage&nbsp;*ptr)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint32&nbsp;status&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;uCANCMR&nbsp;Temp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Temp.Word&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(0&nbsp;!=&nbsp;CANSR(cannum).Bits.TBS1_BIT)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(0&nbsp;==&nbsp;CANSR(cannum).Bits.TS1_BIT)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CANTFI1(cannum)&nbsp;=&nbsp;ptr-&gtRFS_TFI;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CANTID1(cannum)&nbsp;=&nbsp;ptr-&gtID;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CANTDA1(cannum)&nbsp;=&nbsp;ptr-&gtCANRDA;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CANTDB1(cannum)&nbsp;=&nbsp;ptr-&gtCANRDB;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Temp.Bits.STB1_BIT&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(0&nbsp;!=&nbsp;CANSR(cannum).Bits.TBS2_BIT){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(0==&nbsp;CANSR(cannum).Bits.TS2_BIT)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CANTFI1(cannum)&nbsp;=&nbsp;ptr-&gtRFS_TFI;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CANTID1(cannum)&nbsp;=&nbsp;ptr-&gtID;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CANTDA1(cannum)&nbsp;=&nbsp;ptr-&gtCANRDA;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CANTDB1(cannum)&nbsp;=&nbsp;ptr-&gtCANRDB;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Temp.Bits.STB2_BIT&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}else&nbsp;if&nbsp;(0&nbsp;!=&nbsp;CANSR(cannum).Bits.TBS3_BIT){&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(0&nbsp;==&nbsp;CANSR(cannum).Bits.TS3_BIT)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CANTFI1(cannum)&nbsp;=&nbsp;ptr-&gtRFS_TFI;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CANTID1(cannum)&nbsp;=&nbsp;ptr-&gtID;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CANTDA1(cannum)&nbsp;=&nbsp;ptr-&gtCANRDA;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CANTDB1(cannum)&nbsp;=&nbsp;ptr-&gtCANRDB;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Temp.Bits.STB3_BIT&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(status&nbsp;==&nbsp;0){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(CANMOD(cannum).Bits.SM_BIT&nbsp;!=&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CanQuitSM(cannum);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Temp.Bits.TR_BIT&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CANCMR(cannum).Word&nbsp;=&nbsp;Temp.Word;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;status;<br />}<br /><br />/*主函数,只处理转发机制,*/<br />int&nbsp;main(void)<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;TargetInit();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(1)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendHigh2LowData2Bus();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendLow2HighData2Bus();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;feeddog();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1;<br />}<br />/*************************************/<br />在打印数据过程中发现有数据错位的现象发送<br />/*打印函数*/<br />void&nbsp;printfMessage(struct&nbsp;ObjectMessage&nbsp;*Msg)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;i=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;DLC=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;buf[8];<br />&nbsp;&nbsp;&nbsp;&nbsp;memset(buf,&nbsp;0,&nbsp;8);<br />&nbsp;&nbsp;&nbsp;&nbsp;DLC&nbsp;=&nbsp;Msg-&gtRFS_TFI.Bits.DLC_BIT;<br />&nbsp;&nbsp;&nbsp;&nbsp;//print(&quot;TFI=%#X&nbsp;&quot;,&nbsp;Msg-&gtRFS_TFI);<br />&nbsp;&nbsp;&nbsp;&nbsp;print(&quot;ID=%#X:&nbsp;x0dx0a&quot;,&nbsp;Msg-&gtID);<br />&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(DLC){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;8:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf[7]&nbsp;=&nbsp;Msg-&gtCANRDB.Bits.Data4_BIT;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;7:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf[6]&nbsp;=&nbsp;Msg-&gtCANRDB.Bits.Data3_BIT;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;6:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf[5]&nbsp;=&nbsp;Msg-&gtCANRDB.Bits.Data2_BIT;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;5:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf[4]&nbsp;=&nbsp;Msg-&gtCANRDB.Bits.Data1_BIT;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;4:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf[3]&nbsp;=&nbsp;Msg-&gtCANRDA.Bits.Data4_BIT;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;3:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf[2]&nbsp;=&nbsp;Msg-&gtCANRDA.Bits.Data3_BIT;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;2:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf[1]&nbsp;=&nbsp;Msg-&gtCANRDA.Bits.Data2_BIT;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;1:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf[0]&nbsp;=&nbsp;Msg-&gtCANRDA.Bits.Data1_BIT;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(&quot;DLC=%dx0dx0ax0dx0a&quot;,&nbsp;DLC);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&ltDLC;i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(&quot;f%d=%#x,&quot;,&nbsp;i,&nbsp;buf);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;print(&quot;x0dx0ax0dx0a&quot;);<br />}<br /><br />void&nbsp;SendLow2HighData2Bus(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;Low2High&nbsp;*ptr=&LowSpeed2Highbuf;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ptr-&gtTxBusy)&nbsp;return;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((ptr-&gtstart&nbsp;!=&nbsp;ptr-&gtend)&nbsp;||&nbsp;ptr-&gtfull&nbsp;==&nbsp;_FULL_)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//if&nbsp;(CANGSR(CAN2).Bits.TBS_BIT&nbsp;!=&nbsp;0){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(BegainSend2CANBus(CAN2,&nbsp;&ptr-&gtbuf[ptr-&gtend])&nbsp;!=&nbsp;1){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//TCAN_LEDGlint();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr-&gtTxBusy&nbsp;=&nbsp;1;//开始向高速CAN口发送报文<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//在此打印由5K总线收到并发送给20K的数据帧<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printfMessage(&ptr-&gtbuf[ptr-&gtend]);<br />&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(++ptr-&gtend&nbsp;&gt=&nbsp;SIZEOF_LOW_HIGH)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr-&gtend&nbsp;=&nbsp;0;<br />&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr-&gtfull&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(&quot;2:busyx0dx0a&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />/************************************************/<br />/*打印结果如下(出错即丢帧时)*/<br /><br />//事件1,2帧<br />ID=0X1C880100:&nbsp;<br />f0=0x5,f1=0x1,f2=0x9,f3=0xed,f4=0x2a,f5=0xb9,f6=0x49,f7=0x1,<br /><br />ID=0XC840100:&nbsp;<br />f0=0,f1=0,f2=0x1,f3=0,f4=0,f5=0,f6=0,f7=0,<br /><br />//事件2,2帧<br />ID=0X1C888200:&nbsp;<br />f0=0x5,f1=0x82,f2=0x9,f3=0xec,f4=0x2a,f5=0xb9,f6=0x49,f7=0x1,<br /><br />ID=0XC848200:&nbsp;<br />f0=0,f1=0,f2=0x1,f3=0,f4=0,f5=0,f6=0,f7=0,<br /><br />//事件3,2帧<br />ID=0X1C888300:&nbsp;<br />f0=0xb,f1=0x83,f2=0x9,f3=0xec,f4=0x2a,f5=0xb9,f6=0x49,f7=0x1,<br /><br />ID=0XC848300:&nbsp;<br />f0=0,f1=0,f2=0x1,f3=0,f4=0,f5=0,f6=0,f7=0,<br /><br />//事件4,2帧<br />ID=0X1C888100:&nbsp;<br />f0=0xb,f1=0x81,f2=0x9,f3=0xed,f4=0x2a,f5=0xb9,f6=0x49,f7=0x1,<br /><br />ID=0XC848100:&nbsp;<br />f0=0,f1=0,f2=0x1,f3=0,f4=0,f5=0,f6=0,f7=0,<br /><br />//事件5,2帧<br />ID=0X1C880100:&nbsp;<br />f0=0xb,f1=0x1,f2=0x9,f3=0xee,f4=0x2a,f5=0xb9,f6=0x49,f7=0x1,<br /><br />ID=0XC840100:&nbsp;<br />f0=0,f1=0,f2=0x1,f3=0,f4=0,f5=0,f6=0,f7=0,<br /><br />//事件6,2帧<br />ID=0X1C888200:&nbsp;<br />f0=0xb,f1=0x82,f2=0x9,f3=0xed,f4=0x2a,f5=0xb9,f6=0x49,f7=0x1,<br /><br />ID=0XC848200:&nbsp;<br />f0=0,f1=0,f2=0x1,f3=0,f4=0,f5=0,f6=0,f7=0,<br /><br />//事件7,2帧<br />//本帧出错,f0~f7的内容应与其它事件信息一样即<br />//f0应为0xb,貌似f0数据丢失,而后续的向前移动了一个字节,导致节点<br />//无法正确识别数据帧格式,导致事件丢失<br />ID=0X44:&nbsp;<br />f0=0x81,f1=0x9,f2=0xed,f3=0x2a,f4=0xb9,<br /><br />ID=0XC848100:&nbsp;<br />f0=0,f1=0,f2=0x1,f3=0,f4=0,f5=0,f6=0,f7=0,<br /><br />//事件8,2帧<br />//同上,本节点正好丢失的2个事件,就是7,8<br />ID=0XC4:&nbsp;<br />f0=0x83,f1=0x9,f2=0xed,f3=0x2a,f4=0xb9,<br /><br />ID=0XC848300:&nbsp;<br />f0=0,f1=0,f2=0x1,f3=0,f4=0,f5=0,f6=0,f7=0,<br /><br />//不知道为什么帧内数据为出错<br />还有次打印出&nbsp;DLC=11;不解中,收帧函数有bug???<br /><br />以上为程序基本流程,<br />现在在多个节点同时发送数据时,就会出现大量丢帧现在<br />各位看客有没有好的建议和解决方案!!!<br />谢谢<br />
georgekin203 发表于 2009-3-12 11:36 | 显示全部楼层

heihei

各节点发送频率太高导致数据区倒数第二位丢失,或者位定时标志丢失<br />建议各节点尽量不要同时发送,差开一个时间最好,2119好像是有这个问题,sja1000及其他内嵌can的mcu都没这个现象
 楼主| 有意思 发表于 2009-3-12 14:03 | 显示全部楼层

不会吧

芯片本身如果有这个问题<br />NXP早就应该知道,出修订版本了吧<br />我一直认为是自己程序哪里处理出错,但是一直没找到问题啊,郁闷<br />发送频率基本上是调节不了了<br />LPC2119类似一个中继降速模块,高速节点的发送频率已经定型,控制不了<br />降速模块收到高速节点发送的报文后,立即存储到high→low缓冲区<br />主main中判断读写指针不等后就立即启动发送<br />作为中继节点,觉得不应该控制发送速率,怕当有大量数据时,缓冲区满会溢出<br />郁闷ing
 楼主| 有意思 发表于 2009-3-13 11:02 | 显示全部楼层

报文收错了

void&nbsp;sendbyte(uint32&nbsp;Device,uint8&nbsp;ch)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(Device&nbsp;==&nbsp;UART0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;U0THR&nbsp;=&nbsp;ch;<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(Device&nbsp;==&nbsp;UART1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;U1THR&nbsp;=&nbsp;ch;<br />}<br />在中断中打印同样出现出差情况<br />sendbyte(UART0,CANRDA(dev).Bits.Data1_BIT);<br />ptr-&gtbuf[ptr-&gtstart]&nbsp;=&nbsp;RxBUF(dev);<br />同样Data1_BIT的数据会变成Data2_BIT的数据,郁闷ing
您需要登录后才可以回帖 登录 | 注册

本版积分规则

79

主题

331

帖子

0

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