工具与软件:
你(们)好
使用 EK-TM4C1294XL 作为从器件 接收模式的 CAN 通信。 我根据 spna245.pdf 下载了示例代码(spna245.zip)、在接收端执行了[simple_can_rx]、并确认通信可以正常执行。
https://www.ti.com/lit/an/spna245/spna245.pdf
Code Composer Studio Code 具有以下特性
//
//初始化要用于接收 CAN 消息的消息对象
//任意 CAN ID。 为了接收任何 CAN ID、ID 和掩码必须两者兼而有之
//设置为0、启用 ID 过滤器。
//
sCANMessage.ui32MsgID = 0x321;
sCANMessage.ui32MsgIDMask = 0;
sCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER;
sCANMessage.ui32MsgLen = 8;
//
//现在将报文对象载入 CAN 外设。 加载后
// CAN 将接收总线上的任何消息、并且会发生中断。
//使用消息对象1接收消息(这与不同
// CAN ID、在这个示例中可以是任意值)。
//
CANMessageSet (CAN0_BASE、0x321、&S CANMessage、MSG_OBJ_TYPE_RX);
//
//进入循环以处理接收到的消息。 此循环仅检查标志
//这是由中断处理程序设置的、如果设置、则读取
//消息并显示内容。 这对于而言不是一种稳健的方法
//处理传入的 CAN 数据、并且一次只能处理一条消息。
//如果多条消息同时收到、则会有一些消息
//可能会被丢弃。 在实际应用中、应该使用其他方法
//以确保不会丢失的方式排队接收到的消息。 你
//也可以使用允许消息的 CAN FIFO 模式
//在处理之前进行缓冲。
//
for (;;)
{
unsigned int uIdx;
//
//如果设置了该标志、则表示发生了 RX 中断、并且
//有一条消息可以从 CAN 读取
//
if (g_bRXFlag)
{
//
//重新使用之前用于配置的相同消息对象
//用于接收消息的 CAN。 作为用于存储的缓冲器
//还必须提供接收到的数据、因此设置缓冲指针
//在消息对象内。
//
sCANMessage.pui8MsgData = pui8MsgData;
//
//从 CAN 读取消息。 1号报文对象被使用
//(与 CAN ID 不同)。 中断清除
//不设置标志、因为该中断已在中清除
//中断处理程序。
//
CANMessageGet (CAN0_BASE、0x321、&sCANMessage、0);
//
//清除挂起的消息标志以便中断处理程序可以执行此操作
//在下一条消息到达时重新设置。
//
g_bRXFlag = 0;
//
//检查是否存在某些消息
//丢失。
//
if (sCANMessage.ui32Flags 和 MSG_OBJ_DATA_LOST)
{
UARTprintf ("检测到 CAN 消息丢失\n");
}
//
//打印接收到的消息的内容。
//
UARTprintf ("Msg ID=0x%08X len=%u data=0x"、
sCANMessage.ui32MsgID、sCANMessage.ui32MsgLen);
for (uIdx = 0;uIdx < sCANMessage.ui32MsgLen;uIdx++)
{
UARTprintf ("%02x "、pui8MsgData[uIdx]);
}
UARTprintf ("total count=%u\n"、g_ui32MsgCount);
}
}
使用 STM32F407VET6作为主器件并将接收端更改为 EK-TM4C1294XL 时、或与我们自己的产品连接时、无法执行通信。
PA0 = CAN_L
PA1 = CAN_H
GND =接地