如题,请问有没有基于M4单芯片CAN应用的初始化参考代码?包含发送和接收。
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.
Hi Toby,
我们现在M4的板子上面基本没带CAN的收发芯片,所以就没有现成的关于CAN通信的例程。
在我们早期的M3的板子LM3S8962的例程里面有关于CAN通信的几个实例,你可以参考一下。
另外,你在设计同时使用RX和TX的过程中,具体遇到了什么样的问题呢,我觉得这两个联合起来操作应该不会有太多的问题。
谢谢
ken
Hi Ken,
以下CAN部分初始化代码是我根据LM3S2965的example中的例程修改而来。
当我屏蔽掉TX或RX其中一个,另一个都能正常工作。
现在同时使能TX和RX时,可以正常往外发送数据,RX与TX 都能正常进入中断程序,
并且将接收到的数据用UART发送到电脑,结果发送出来的ID是结构体sCANMessage_TX中的ID信息。
tCANMsgObject sCANMessage_TX;
tCANMsgObject sCANMessage_RX;
// 以下是配置CAN TX部分报文初始化。
*(unsigned long *)ucMsgData_TX = 0;
sCANMessage_TX.ulMsgID = 0x000007DF; // CAN message ID - use ECU's ID:0x000007DF
sCANMessage_TX.ulMsgIDMask = 0; // no mask needed for TX
sCANMessage_TX.ulFlags = MSG_OBJ_TX_INT_ENABLE; // enable interrupt on TX
sCANMessage_TX.ulMsgLen = sizeof(ucMsgData_TX); // size of message is 8
sCANMessage_TX.pucMsgData = ucMsgData_TX; // ptr to message content
// 以下代码是配置CAN RX部分报文初始化。
//
// Initialize a message object to be used for receiving CAN messages with
// any CAN ID. In order to receive any CAN ID, the ID and mask must both
// be set to 0, and the ID filter enabled.
//
sCANMessage_RX.ulMsgID = 0; // CAN msg ID - 0 for any
sCANMessage_RX.ulMsgIDMask = 0; // mask is 0 for any ID
sCANMessage_RX.ulFlags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER;
sCANMessage_RX.ulMsgLen = 8; // allow up to 8 bytes
// 以下是CAN RX 数据由UART发送至PC。
//
// Print out the contents of the message that was received.
//
UARTprintf("Received Msg:ID=0x%08X len=%u data = 0x",
sCANMessage_RX.ulMsgID, sCANMessage_RX.ulMsgLen);
for(uIdx = 0; uIdx < sCANMessage_RX.ulMsgLen; uIdx++)
{
UARTprintf("%02X ", ucMsgData_RX[uIdx]);
}
UARTprintf(" total count = %u\n", g_ulMsgCount_RX);
不知道还有什么地方没有注意到,才出现这个问题。
Hi Toby,
你是指打印出来的ID是发送报文的ID符是吧,那接收到的报文数据都是正确的吗?
由于我现在没有板子在手上做测试,我觉得你可以先这样测试一下,首先设定一个端点到接收中断那边,通过单步调试,并通过查询接收数据的寄存器里面是否真正的收到了数据,具体的ID是多少,这个应该再系统寄存器里面可以看得到。
只有真正确定接收端收到了正确的数据,才好判断问题出在哪。
明天有空,我会用我手上的板子跑一下CAN的程序,然后再进一步回答你的问题。
谢谢
ken
Hi Toby,
很高兴看到你的进展。你屏蔽的那句话的作用是设置发送数据到具体的Message OBJ 里面,如果你是把它去掉然后能收到正确的数据的话,那说明你接收数据和发送数据的buffer应该是有冲突了。
你可以改改接收端或是发送端的buffer定义看看。
谢谢
ken