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.

[参考译文] TMS320F28377S:TMS320F28377S 可能会收到问题

Guru**** 2482225 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/681344/tms320f28377s-tms320f28377s-can-receive-issue

器件型号:TMS320F28377S

您好!

我使用的是 LAUNCHXL-F28377S 开发板。

我修改 了 CAN_EXTERNAL_Transmit 示例、因此仅使用 CANA、因为我打算使用开发板的 CAN 收发器。  

我有一个外部节点(Komodo CAN 控制器)、它每秒定期传输数据、TMS320F8377S 应接收数据。

我将获取 CAN_INT_INT0ID_STATUS 的状态中断 CAN_INT_STS_CAUSE、然后在下面  的 ISR 代码中获取 CAN_ES_ES_RXOK 的 CAN_ES_STS_CONTROL。 但我没有收到 RX_MSG_OBJ_ID 的任何状态中断、因此我无法获取任何接收到的数据。 我的代码可能有什么问题?


void CAN_Init (void)

CANInit (CANA_base);

CANClkSourceSelect (CANA_base、0);// 1000kHz CAN 时钟

CANBitRateSet (CANA_base、50000000、1000000);

CANIntEnable (CANA_base、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);

CANGLALIntEnable (CANA_base、CAN_GLB_INT_CANINT0);

sRXCANMessage.ui32MsgID = 1;
sRXCANMessage.ui32MsgIDMask = 0;
sRXCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE;
sRXCANMessage.ui32MsgLen = 4;
sRXCANMessage.pucMsgData = rxMsgData;
CANMessageSet (CANA_base、RX_MSG_obj_ID、sRXCANMessage、
MSG_OBJ_TYPE_RX);

CANEnable (CANA_base);

_interrupt void canaISR (void)

uint32_t status;

//
//读取 CAN-A 中断状态以查找中断原因
//
状态= CANIntStatus (CANA_base、CAN_INT_STS_CAUST);

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

//
//读取控制器状态。 这将返回状态字段
//可以指示各种错误的错误位。 错误处理
//本示例中不是为了简单起见。 请参阅
// API 文档,了解有关错误状态位的详细信息。
//读取此状态的操作将清除中断。
//
状态= CANStatusGet (CANA_base、CAN_STS_CONTROL);

//
//检查是否发生错误。
//
if (((status &~(CAN_ES_RXOK))!= 7)&&
((STATUS &μ~(CAN_ES_RXOK))!= 0))

//
//设置一个标志来指示可能发生的某些错误。
//
errorFlag = 1;


//
//检查原因是否是 CAN-A 接收报文对象1
//
否则、如果(status == RX_MSG_OBJ_ID)

printf ("主 OBC 读取 CAN 总线\n"\});
//
//获取收到的消息
//
CANMessageGet (CANA_base、RX_MSG_OBJ_ID、&sRXCANMessage、true);

//
//到达这一点意味着 RX 中断发生在上
//报文对象1、报文 RX 完成。 清除
//消息目标中断。
//
CANIntClear (CANA_base、RX_MSG_OBJ_ID);

//
//递增计数器以跟踪已有多少消息
//已收到。 在实际应用中、这可用于将标志设置为
//指示何时接收到消息。
//
rxMsgCount++;

//
//由于接收到消息,请清除所有错误标志。
//
错误标志= 0;

Rcvd_data = 1;

//
//如果发生意外导致中断的情况,这将对中断进行处理。
//
其他

//
//可以在此处执行伪中断处理。
//

//
//清除 CAN 中断线的全局中断标志
//
CANGLALIntClear (CANA_base、CAN_GLB_INT_CANINT0);

//
//确认位于组9中的此中断
//
PieCtrlRegs.PIEACX.ALL = PIEACK_group9;

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

    我浏览了您共享的代码。

    看起来用于接收的消息对象配置不正确、因此您没有收到接收中断。 您是否使用来自外部设备的相同消息对象配置。

    波特率配置相同。

    中断被启用、全局中断也被启用、您将获得状态中断。 因此、看起来接收报文对象配置不正确。

    是否可以检查消息 RAM 是否已正确配置。

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

    似乎我犯了与以下链接中的同事相同的错误:
    e2e.ti.com/.../532996

    因此、我更改了以下行:
    sRXCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE;
    更改为
    sRXCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_EXDED_ID | MSG_OBJ_USE_ID_FILTER;
    它开始工作。

    Delfino 的 CAN 文档很长、很复杂、需要 CAN 初学者的大量耐心。 因此、我们通过犯错和调试控制套件示例来学习。

    谢谢、此致、
    Ankit