<br />lpc2119的can中断发送怎样发啊,现在感觉一直用的查询发送,效率太低了,有没有好的方案啊,<br /><br />/*<br />********************************************************************************<br />**函数名称:startup_sendcan<br />**函数功能:启动发送<br />**入口参数:cannum:CAN控制器通道号ptr:发送缓冲区指针<br />**出口参数:1: erro 0:right<br />**函数说明:<br />**<br />********************************************************************************<br />*/<br />uint32 startup_sendcan(uint32 cannum, struct txcanbuf *ptr)<br />{<br /> uint32 status = 0;<br /> uCANCMR Temp;<br /> <br /> Temp.Word = 0;<br /> <br /> if (0 != CANSR(cannum).Bits.TBS1_BIT) { <br /> if (0 == CANSR(cannum).Bits.TS1_BIT) {<br /> CANTFI1(cannum) = ptr->txdbuf_can[ptr->end].TxFrameInfo;<br /> CANTID1(cannum) = ptr->txdbuf_can[ptr->end].TxCANID;<br /> CANTDA1(cannum) = ptr->txdbuf_can[ptr->end].CANTDA;<br /> CANTDB1(cannum) = ptr->txdbuf_can[ptr->end].CANTDB;<br /> Temp.Bits.STB1_BIT = 1;<br /> }else{<br /> status = 1;<br /> }<br /> } else if (0 != CANSR(cannum).Bits.TBS2_BIT){<br /> if (0== CANSR(cannum).Bits.TS2_BIT) {<br /> CANTFI2(cannum) = ptr->txdbuf_can[ptr->end].TxFrameInfo;<br /> CANTID2(cannum) = ptr->txdbuf_can[ptr->end].TxCANID;<br /> CANTDA3(cannum) = ptr->txdbuf_can[ptr->end].CANTDA;<br /> CANTDB2(cannum) = ptr->txdbuf_can[ptr->end].CANTDB;<br /> Temp.Bits.STB2_BIT = 1;<br /> }else{<br /> status = 1;<br /> }<br /> }else if (0 != CANSR(cannum).Bits.TBS3_BIT){ <br /> if (0 == CANSR(cannum).Bits.TS3_BIT) {<br /> CANTFI3(cannum) = ptr->txdbuf_can[ptr->end].TxFrameInfo;<br /> CANTID3(cannum) = ptr->txdbuf_can[ptr->end].TxCANID;<br /> CANTDA3(cannum) = ptr->txdbuf_can[ptr->end].CANTDA;<br /> CANTDB3(cannum) = ptr->txdbuf_can[ptr->end].CANTDB;<br /> Temp.Bits.STB3_BIT = 1; <br /> }else{<br /> status = 1;<br /> }<br /> }else{<br /> status = 1;<br /> }<br /> if (status == 0){<br /> if(CANMOD(cannum).Bits.SM_BIT != 0) {<br /> CanQuitSM(cannum);<br /> } <br /> Temp.Bits.TR_BIT = 1;<br /> CANCMR(cannum).Word = Temp.Word;<br /> }<br /> return status; <br />}<br /><br />/*<br />********************************************************************************<br />**函数名称:send2canbus<br />**函数功能:发送缓冲区数据到CAN总线上<br />**入口参数:cannum:CAN控制器通道号<br />**出口参数:无<br />**函数说明:<br />**<br />********************************************************************************<br />*/<br />void send2canbus(uint32 cannum)<br />{<br /> uint8 length = 0;<br /> struct txcanbuf *ptr;<br /> <br /> if (CAN1 == cannum) {<br /> ptr = &can1buf_txd;<br /> length = MAX_TX_CAN1;<br /> } else if (CAN2 == cannum){<br /> if (setup_total.type != REPEATERS)<br /> return;<br /> ptr = &can2buf_txd;<br /> length = MAX_TX_CAN2;<br /> }else return;<br /> if ((ptr->full == _FULL_) || (ptr->end != ptr->start)){<br /> if (CANGSR(cannum).Bits.TBS_BIT != 0){<br /> if (startup_sendcan(cannum,ptr) != 1){<br /> TCAN_LEDGlint();<br /> if (++ptr->end >= length)<br /> ptr->end = 0;<br /> ptr->full = _EMPTY_;<br /> }<br /> }<br /> }<br />}<br /><br />/*<br />********************************************************************************<br />**函数名称:can_isr<br />**函数功能:can中断复位函数<br />**入口参数:无<br />**出口参数:无<br />**函数说明:<br />**<br />********************************************************************************<br />*/<br />void __irq can_isr(void)<br />{<br /> uint32 j = 0;<br /> uCANICR k;<br /> for (j=0; j<CAN_MAX_NUM; j++) {<br /> k = CANICR(j); <br /> if (k.Bits.RI_BIT != 0){<br /> rcvdata_fromcanbus(j);<br /> }<br /> /*<br /> if ((k.Bits.TI1_BIT != 0)<br /> || (k.Bits.TI2_BIT != 0)<br /> || (k.Bits.TI3_BIT != 0)) {<br /> }<br /> */<br /> if (k.Bits.BEI_BIT != 0) {<br /> CanBufOffLinePrg(j);<br /> }<br /> if (k.Bits.DOI_BIT != 0) {<br /> ClrCanDataOver(j);<br /> }<br /> }<br /> VICVectAddr = 0x00;<br />}<br />应怎样像串口那样采用中断发送啊,只要吧数据丢到缓冲区就不用管它了,中断自动发送,效率肯定高很多!谢谢,有人用过吗 |
|