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.

[参考译文] TMS320F28379D:CCS

Guru**** 2538950 points
Other Parts Discussed in Thread: TMS320F28379D

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1550687/tms320f28379d-ccs

部件号:TMS320F28379D


工具/软件:

大家好!

我正在使用两个 TMS320F28379D DSP (DSP1 和 DSP2) 通过 CANB 通道进行通信、并且我面临一个问题、即从 DSP2 到 DSP1 的数据传输没有收到、而反向 (DSP1 到 DSP2) 运行良好。

我的问题是 :“为什么 DSP1 无法从 DSP2 接收数据,即使反向工作?“ 。 请建议如何解决此问题。 随附屏幕截图以供您参考 。

谢谢、此致、

Sameer

e2e.ti.com/.../CAN-Transmission.pptx

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

    您好、 Sameer、

    DSP2 端的 CAN 错误状态是什么? 是否已启用自动重新传输?

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

    您好、

    分配给 sys_mode_int.u8[0]和  sys_mode_int.u8[1]的值是多少?  

    2.只需要传输 2 个字节的数据 (txMsgData[1:0])、但代码中的 MSG_DATA_LENGTH=8。 DLC 编程到 IFxCTL 寄存器是什么? 如果 DLC 与 MSG_DATA_LENGTH 不匹配、则可能无法传输消息。

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

    尊敬的 Wang:

    感谢您的及时答复。  

    1. DSP2 端的 CAN 错误状态是什么?

    最后一个错误状态为 111。

    2.是否已启用自动重新传输?

    是的。 自动重新发送已启用。

    分配给 sys_mode_int.u8[0]和 sys_mode_int.u8[1]的值是多少?
    SYS_MODE_int 是一个包含一个 16 位变量和一个由两个 8 位变量组成的数组的联合体。
    在这种联合体中、sys_mode_int.u8[0]存储低 8 位 (LSB)、sys_mode_int.u8[1]存储高 8 位 (MSB)。
    sys_mode 变量的值为 200、首先存储为 16 位值、然后分为其 LSB 和 MSB 分量

    4.只需传输 2 个字节的数据 (txMsgData[1:0])、但代码中的 MSG_DATA_LENGTH=8。 DLC 编程到 IFxCTL 寄存器是什么? 如果 DLC 与 MSG_DATA_LENGTH 不匹配、则可能无法传输消息

    DLC 是 1000、它与 MSG_DATA_LENGTH (8) 相同。

    随附的屏幕截图供您参考。

    谢谢、此致、

    Sameer

    e2e.ti.com/.../CAN-Transmission_2D00_1.pptx

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

    谢谢你。  

    屏幕截图中的 TxOK 为 0、这意味着自 CPU 上次读取该位以来、没有成功发送消息。

    当 DSP2 向 DSP1 传输消息时、您是否测量了 CAN 总线上的信号波形?  任何 CAN 控制器都可以在检测到空闲总线时启动传输。 这可能导致 DSP1 和 DSP2 上的两个控制器(几乎)同时启动一条消息。  由于总线是“线与“、显性位为逻辑 0、因此具有数字最低仲裁字段的消息将赢得仲裁。 DSP1 上的 MSG ID 为 0x1 (DSP2 上为 0x2)、因此将传输 DSP1 上的 MSG。

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

    尊敬的 Wang:

    感谢您澄清基础知识。 在 DSP2 上的传输代码中、我使用变量 (TX_COMPLETE) 来监控传输状态、但它保持为零。 这似乎表明传输未完成。 如果我错了、请纠正我。 我随附了屏幕截图以供您参考。

    谢谢、此致、

    Mohammad Sameer Irfan

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

    正确、传输未完成。 是否设置了 errorFlag?  

    您能否注释掉 canbSIR () 中的代码(下面突出显示),因为读取 LEC 会将该字段重置为 0x7 ?

    您可以在 canbisr () 中添加断点,以确保发生中断。 谢谢

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


    尊敬的 Wang:

    感谢您的帮助—问题现已解决。 不过、我想澄清一点。

    最初、对于 DSP1、我使用的是组合了基于寄存器和基于 DriverLib 的代码的项目模板、而 DSP2 仅使用基于 DriverLib 的代码实现。 在此设置中、可以在 DSP1 中接收 ISR 是通过基于寄存器的代码调用的、而在 DSP2 中、接收 ISR 是通过 DriverLib 函数触发的。 在这些情况下、DSP2 能够从 DSP1 接收数据、但 DSP1 没有从 DSP2 接收任何数据。

    随后、我修改了设置、以便 DSP1 和 DSP2 使用相同的混合方法(基于寄存器和 DriverLib)。 然后我观察到在 DSP1 中、CAN 接收 ISR 仍然未被调用。 但是、一旦我使用 DriverLib 函数注册 ISR、它就会开始正确执行。

    您能否解释一下为什么会出现这种行为差异?

    随附的屏幕截图供您参考。

    谢谢、此致、

    Sameer

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

    您是否意味着在屏幕截图中启用基于寄存器的代码(不更改其他代码)会使 canbisr () 停止工作?

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

    是的,启用基于寄存器的代码并禁用 driverlib(如下面的屏幕截图所示), canbisr () 停止工作。

    谢谢、此致、

    Sameer

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

    您好、

    基于寄存器的代码中未启用中断。 编译器内在函数__ enble_interrupt () 是为了启用所有中断。