[CAN-bus/DeviceNet] lpc2119怎样使用中断发送CAN帧

[复制链接]
 楼主| 有意思 发表于 2008-4-16 16:31 | 显示全部楼层 |阅读模式
<br />lpc2119的can中断发送怎样发啊,现在感觉一直用的查询发送,效率太低了,有没有好的方案啊,<br /><br />/*<br />********************************************************************************<br />**函数名称:startup_sendcan<br />**函数功能:启动发送<br />**入口参数:cannum:CAN控制器通道号ptr:发送缓冲区指针<br />**出口参数:1:&nbsp;erro&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0:right<br />**函数说明:<br />**<br />********************************************************************************<br />*/<br />uint32&nbsp;startup_sendcan(uint32&nbsp;cannum,&nbsp;struct&nbsp;txcanbuf&nbsp;*ptr)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint32&nbsp;status&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;uCANCMR&nbsp;Temp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Temp.Word&nbsp;=&nbsp;0;<br />&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-&gttxdbuf_can[ptr-&gtend].TxFrameInfo;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CANTID1(cannum)&nbsp;=&nbsp;ptr-&gttxdbuf_can[ptr-&gtend].TxCANID;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CANTDA1(cannum)&nbsp;=&nbsp;ptr-&gttxdbuf_can[ptr-&gtend].CANTDA;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CANTDB1(cannum)&nbsp;=&nbsp;ptr-&gttxdbuf_can[ptr-&gtend].CANTDB;<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;CANTFI2(cannum)&nbsp;=&nbsp;ptr-&gttxdbuf_can[ptr-&gtend].TxFrameInfo;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CANTID2(cannum)&nbsp;=&nbsp;ptr-&gttxdbuf_can[ptr-&gtend].TxCANID;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CANTDA3(cannum)&nbsp;=&nbsp;ptr-&gttxdbuf_can[ptr-&gtend].CANTDA;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CANTDB2(cannum)&nbsp;=&nbsp;ptr-&gttxdbuf_can[ptr-&gtend].CANTDB;<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;CANTFI3(cannum)&nbsp;=&nbsp;ptr-&gttxdbuf_can[ptr-&gtend].TxFrameInfo;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CANTID3(cannum)&nbsp;=&nbsp;ptr-&gttxdbuf_can[ptr-&gtend].TxCANID;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CANTDA3(cannum)&nbsp;=&nbsp;ptr-&gttxdbuf_can[ptr-&gtend].CANTDA;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CANTDB3(cannum)&nbsp;=&nbsp;ptr-&gttxdbuf_can[ptr-&gtend].CANTDB;<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;&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br /><br />/*<br />********************************************************************************<br />**函数名称:send2canbus<br />**函数功能:发送缓冲区数据到CAN总线上<br />**入口参数:cannum:CAN控制器通道号<br />**出口参数:无<br />**函数说明:<br />**<br />********************************************************************************<br />*/<br />void&nbsp;send2canbus(uint32&nbsp;cannum)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;length&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;txcanbuf&nbsp;*ptr;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(CAN1&nbsp;==&nbsp;cannum)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr&nbsp;=&nbsp;&can1buf_txd;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;length&nbsp;=&nbsp;MAX_TX_CAN1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(CAN2&nbsp;==&nbsp;cannum){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(setup_total.type&nbsp;!=&nbsp;REPEATERS)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr&nbsp;=&nbsp;&can2buf_txd;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;length&nbsp;=&nbsp;MAX_TX_CAN2;<br />&nbsp;&nbsp;&nbsp;&nbsp;}else&nbsp;return;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((ptr-&gtfull&nbsp;==&nbsp;_FULL_)&nbsp;||&nbsp;(ptr-&gtend&nbsp;!=&nbsp;ptr-&gtstart)){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(CANGSR(cannum).Bits.TBS_BIT&nbsp;!=&nbsp;0){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(startup_sendcan(cannum,ptr)&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;length)<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;ptr-&gtfull&nbsp;=&nbsp;_EMPTY_;<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 />**函数名称:can_isr<br />**函数功能:can中断复位函数<br />**入口参数:无<br />**出口参数:无<br />**函数说明:<br />**<br />********************************************************************************<br />*/<br />void&nbsp;__irq&nbsp;can_isr(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint32&nbsp;j&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;uCANICR&nbsp;k;<br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(j=0;&nbsp;j&ltCAN_MAX_NUM;&nbsp;j++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k&nbsp;=&nbsp;CANICR(j);&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(j);<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 />&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(j);<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;ClrCanDataOver(j);<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 />应怎样像串口那样采用中断发送啊,只要吧数据丢到缓冲区就不用管它了,中断自动发送,效率肯定高很多!谢谢,有人用过吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

79

主题

331

帖子

0

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

79

主题

331

帖子

0

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