This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

F280049 CAN如何查询方式发送

Other Parts Discussed in Thread: C2000WARE

F280049CAN通信用中断方式接收,很稳定。想用查询方式发送减少中断次数。

配置了四个MSG_OBJ为发送,发送前先查询哪个MSG_OBJ空闲,哪个空闲就用哪个发送。

现在的问题是,怎么查询哪个MSG_OBJ是空闲的。

查询状态的drivlib函数只有CAN_getStatus(CANA_BASE),但是这个好像不行。

谢谢!!

  • 您可以查询CANES寄存器中的TXOK位。

    有关示例,请参见应用程序报告中的CAN_EX4_SIMPLE_TRANSMIT项目。下面的代码段:

     //
        // Comment for infinite transmissions
        //
        //for(i = 0; i < TXCOUNT; i++)
        //
    	{
            CAN_sendMessage(CANA_BASE, TX_MSG_OBJ_ID, MSG_DATA_LENGTH, txMsgData);
    
            //
            // Poll TxOk bit in CAN_ES register to check completion of transmission
            //
            while(((HWREGH(CANA_BASE + CAN_O_ES) & CAN_ES_TXOK)) !=  CAN_ES_TXOK)
    		{
    		}
        }
        //

    例程是2837XD的,路径为 C2000Ware_3_03_00_00\driverlib\f2837xd\examples\cpu1\can

  • TXOK只是指示Cana有一个帧发出去了吧。同时往多个TX_MSG_OBJ里面放了数据。TXOK并不能指示哪个TX_MSG_OBJ的数据已经发出去了。

    比如规划了0,1,2,3四个MSG_OBJ为发送邮箱。某一时刻同时有多个发送需要,往0,1,2,3里面分别放了电压、电流、温度,工作状态等

    把四个发邮箱都用到了,这种情况任意一个邮箱发送成功TX_OK就已经置位了。此时又来了个发送需求,这时候就要查询0,1,2,3哪个是空闲的,哪个正忙。

    查询TX_OK是不够的。

  • 大体理解您的需求了。那您可以看一下用户指南的 26.15.2.14 CAN_TXRQ_21 Register