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.

[参考译文] TMS320F280049:如何启用远程帧功能

Guru**** 2611705 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/690469/tms320f280049-how-to-enable-remote-frame-function

器件型号:TMS320F280049

您好、香榭丽舍

我的客户询问远程帧。 我检查了他的代码设置、我认为设置是可以的。 我找到了讨论远程帧的相关链接。 我检查了客户代码、它确实设置了 DLC

客户测试环境:PC<->USB 转 CAN 转换 器<->CAN 收发器<->F280049

PC 发送了远程帧、但 F280049未响应。 客户发送标准帧时、F280049响应数据帧。  

我检查了 TRM、其中提到如果 RmtEn = 1、TxRqst 将自动设置、 远程帧将由数据帧自主响应。 请告诉我将自动发送哪个数据帧?

当我们将 obj 类型设置为'CAN_MSG_OBJ_TYPE_RxTx_REMOTE 时、我检查了启用 RmtEn 的 CAN.c。 但是、当我们为远程帧配置单个 RX obj 时、图27-8显示了 RmtEn = 0。 客户禁用 RmtEn、但仍然无法接收远程帧。 客户设置 CAN 消息 obj 代码如下所示。 我们是否在这里遗漏了任何其他配置? 谢谢!

CAN_setupMessageObject (CANB_BASE、(TX_OBJ_ID_3 + RX_OBJ_OFFSET)、0x310、CAN_MSG_FRAME_STD、
CAN_MSG_OBJ_TYPE_RXxTxREMOTE、 0、CAN_MSG_OBJ_RX_INT_ENABLE、
0);


CAN ISR 设置  

#pragma CODE_SECTION (canISR、".TI.ramfunc")
中断空 canISR (void){
uint32_t status;

//读取 CAN 中断状态以查找中断原因
状态= CAN_getInterruptCase (CANB_BASE);

//如果原因是控制器状态中断,则获取状态
if (status = CAN_INT_INT0ID_STATUS){
状态= CAN_getStatus (CANB_BASE);

//检查是否发生错误。
if (((status &~(CAN_STATUS_TXOK | CAN_STATUS_RXOK))!= 7)&&
((STATUS &μ~(CAN_STATUS_TXOK | CAN_STATUS_RXOK))!= 0))
{
//清除错误标志
ex_count++;

if (EX_COUNT > 500){
ex_count = 0;
}

}
否则、如果(status <= RX_obj_offset){

TX_COUNT++;

如果(TX_COUNT > 500){
TX_COUNT = 0;
}

CAN_clearInterruptStatus (CANB_BASE、STATUS);

} 否则、如果(status > RX_obj_offset){

RX_COUNT++;

如果(RX_COUNT > 500){
RX_COUNT = 0;
}

//CAN_readMessage (CANB_BASE、STATUS、rxMsgData);

//C1RX.RX_Data[0]= rxMsgData[0];
//C1RX.RX_Data[1]= rxMsgData[1];
// rxC1MsxRX.RX_Data[2]= rxC1MsgData[2];
//
rxC1MsRX_RX.3[rx



= rgData]

;rxRX_RX_RX_3[r.r.rx = rgData[r.rx = rc.rx = rx = rc.rx;// rxRX_rx = rxRX.rxRX_rxData[rxRX_rx = rx = rc.rx = rx = rx = rx = rx.4]/ rx = rx = rx = rc.rx = rx = rx = rgData[rx = rx = rx = rc.rx;// rx = rc.rx = rx = rx = rx = rx = rx = rx = rx =

相关链接:  

 

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

    使用 CAN_MSG_OBJ_TYPE_RxTx_REMOTE 设置的消息对象将是使用其数据进行响应的消息对象。 现在正在设置的消息对象看起来具有0的 DLC 大小。 此 DLC 大小应设置为与要接收的预期远程帧相同的大小。

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

    尊敬的 Chris:

    感谢您的回复。

    我的客户将 DLC 大小更改为8。 但 PC 仍然没有从 F280049获得响应。 更改 DLC 大小后,应将传输数据分配到何处? 我查看了数据表、其中提到启用 RmtEn 时、远程帧将由数据帧自主应答。 我们是否应该创建一个 ID 与远程帧 obj ID 相同的数据帧? 从 PC 接收到 F280049远程帧后、它将由另一个数据帧自主应答。 我不确定这是否正确。 如果 我错了、请告诉我。 谢谢!!  

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

    听起来您的理解基本上是正确的、让我详细介绍一个通用流程、希望它更清晰。

    1.在 F280049上配置 CAN_MSG_OBJ_TYPE_RxTx_REMOTE 消息对象(启用 RmtEn)、并使用所需的数据填充其数据/DATB 作为响应。
    2. PC 发送具有 OBJ ID (和 DLC 大小)的远程帧、该 ID 与 F280049上 CAN_MSG_OBJ_TYPE_RxTx_REMOTE 设置的 OBJ ID 匹配。
    3.当 F280049接收到远程报文时、CAN_MSG_OBJ_TYPE_RxTx_REMOTE 报文对象将自动发送一个数据填充在其 DATA/DATB 中的响应
    4. PC 应接收新发送的数据。

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

    尊敬的 Chris:

    感谢您的回复! 我对设置有疑问。 请查看我的以下回复。  

    [引用 user="Christopher Chirara"]在 F280049上配置 CAN_MSG_obj_type_RxTx_remote 消息对象(启用 RmtEn),并使用要作为响应的数据填充其数据/DATB。

    [LISA]:您是指写入 CAN_setupMessageObject() 之后 跟随 CAN_sendMessage() 吗? 但是、当我对数据寄存器进行写操作时、CAN 消息将自动发出。  

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

    首先使用 CAN_setupMessageObject()对其进行设置,但不使用 CAN_sendMessageI()。 使用 CAN_transferMessage()读取该消息对象(如果您刚刚进行了 setupMessageObject 调用,可能不需要) RAM 并填充 IFX 寄存器。 然后、使用 HWREG 来设置该 IFX reg 中的数据/DATB (如果您在 CAN.h 中查看、也可以使用 CAN_writeDataReg ()))、然后使用 CAN_transferMessage ()从 IFX 将所有这些内容写回消息对象 RAM。 现在、消息对象应该准备好使用该数据进行自动回复。

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

    尊敬的 Chris:

    感谢您的回复。 我要试一下。