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.

[参考译文] EK-TM4C1294XL:使用 EK-TM4C1294XL (作为从设备)和 STM32F407VET6 (作为主设备)进行 CAN 通信

Guru**** 1753810 points
Other Parts Discussed in Thread: EK-TM4C1294XL
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1373628/ek-tm4c1294xl-can-communication-using-ek-tm4c1294xl-as-the-slave-and-stm32f407vet6-as-the-master

器件型号:EK-TM4C1294XL

工具与软件:

你(们)好

使用 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 =接地

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     您下面的行不正确。 您正在指定消息对象0x321。 由于只有32个报文对象、所以没有此类报文对象。 为什么不要仅使用将消息对象 ID 设置为1的示例呢?  

    CANMessageSet (CAN0_BASE、0x321、&S CANMessage、MSG_OBJ_TYPE_RX);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles

    我的 CAN 主代码已设置为 Msg ID=0x321、这就是为什么我分配给 ID 以及分配默认 ID 的原因、仍然没有获得 任何接收数据

    你能告诉我吗  

    e2e.ti.com/.../6087.CAN_5F00_TX.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     您可以设置所需的任何 ID。 你看到我的答复了吗? 这是  CANMessageSet API 的问题。 此 API 要求您传递消息目标、而不是消息 ID。 报文对象的范围是1到32。 它不采用消息 ID 值(如0x321,801 (十进制)。 您正在尝试将消息对象设置为等于此处的801。  在调试剩余代码之前、你至少需要先解决这个问题。