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.

[参考译文] TMS320F280025C:CAN 接收帧配置、发送正常(轮询模式)

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1190425/tms320f280025c-can-receive-frame-configuration-transmit-is-ok-polling-mode

器件型号:TMS320F280025C

各位专家、您好!

我需要您的帮助^对于我的程序、我想配置我目前开发第一个节点的电路板和第二个节点的具有峰值 CAN 探针的 PC 的 CAN 通信。

此时我想发送一个对象并接收第二个对象 、但接下来我需要配置更多对象。 传输很好、我看到我的帧从板到 PC、但 Opposit 在 CAN_IF2DATA /  CAN_IF2DATB 中不起作用 、我从未看到数据。

我正在尝试在传入 ID 上设置一个筛选器、我只想接受我从 PC 发送的 ID、在这种情况下、ID = 0x010为标准格式。

我在您的文档和论坛上做了大量研究、但没有成功。  我尝试通过不加掩码而不成功地在 ID 上进行配置、因此我不确定问题是否来自 ID 的筛选(以查看我是否没有犯错)

因此我配置:  

CANARegs.CAN_IF2MSK.bit.MSK = 0x1FFFFFFF;

CanaRegs.CAN_IF2ARB.bit.ID =(msgid << 18);

CANaRegs.CAN_IF2CMD.bit.DIR = 0;

CANaRegs.CAN_IF2ARB.bit.Dir = 0;

这行是正确的? 对我来说是的,但是……

您可以看到屏幕截图和我的代码:  

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void can_init(void)
{
EALLOW;
/// Configure CANA_RX
GpioCtrlRegs.GPAPUD.bit.GPIO3 = 1; /// Disable the pullup on GPIO3
GpioCtrlRegs.GPAGMUX1.bit.GPIO3 = 3; /// To define mux position, mux position equal GPAGMUX(2bits) - GPAMUX(2bits) 0 to 15 number, here mux position equal 14 so GPAGMUX1 = 11b and GPAMUX1 = 10b.
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 2; /// GPIO3 = CANA_RX, see pin attributes documentation for mux position.
GpioCtrlRegs.GPADIR.bit.GPIO3 = 0; /// GPIO3 = input
GpioCtrlRegs.GPAINV.bit.GPIO3 = 0; /// Not inverted GPIO input
/// Configure CANA_TX
GpioCtrlRegs.GPAPUD.bit.GPIO2 = 1; /// Disable the pullup on GPIO2
GpioCtrlRegs.GPADIR.bit.GPIO2 = 1; /// GPIO2 = output
GpioCtrlRegs.GPAODR.bit.GPIO2 = 0; /// Normal output not open drain
GpioCtrlRegs.GPAQSEL1.bit.GPIO2 = 0; /// Synchronous
GpioCtrlRegs.GPAGMUX1.bit.GPIO2 = 3; /// To define mux position, mux position equal GPBGMUX(2bits) - GPBMUX(2bits) 0 to 15 number, here mux position equal 14 so GPAGMUX1 = 11b and GPAMUX1 = 10b.
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 2; /// GPIO2 = CANA_TX, see pin attributes documentation for mux position.
/// Place CAN controller in init state, regardless of previous state.
/// This will put controller in idle, and allow the message object RAM to be programmed.
/// CAN module ignore bus activity during configuration.
CanaRegs.CAN_CTL.bit.Init = 1;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

谢谢

Damien

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

    尊敬的 Damien:

    您能澄清几个问题吗?  我假设您 没有使用中断来触发帧接收。  上述代码(第55行)中的注释 显示///接收消息、但后续代码似乎正在配置消息对象。  有一个函数 READ_CAN_MESSAGE(),但对 NewDat 的检查注释掉。  您如何检查邮箱2的新数据是否出现?

    此致、

    Joseph

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

    您好、Joseph、  

    您是我希望使用轮询模式触发火焰接收而不是中断的原因。 我在第55行的注释不适合它是用于接收邮件的邮箱配置。 邮箱1我配置用于传输消息、但这里不显示、因为它可以正常工作、邮箱2用于接收。  

    我使用 CAN_ndat_21第113行测试邮件 box2的新数据是否出现,但该寄存器始终为0,因此我认为接收时没有帧会通过掩码过滤器 no 触发?  

    如果我不想使用这一个读功能,只需验证一个邮箱配置的 Candata 寄存器,它将不起作用? 当我配置更多接收邮箱时、将进行此检测。  

    我的邮箱2配置良好,可以接收消息吗?  

    我不明白为什么 CAN_ndat_21等于0? 我认为触发器不起作用。  

    谢谢

    Damien

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

    尊敬的 Damien:

    您能否移动以下语句:

    CANARegs.CAN_IF2CMD.bit.DATA_A = 1;
    CANARegs.CAN_IF2CMD.bit.DATA_B = 1;

    这当前位于先前已定义消息对象2以查看其是否起作用的例程中的 Receive_CAN_message 中?  我在您发送的快照中看不到这些位在 IF2CMD 寄存器中设置。

    此致、

    Joseph

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

    您好、Joseph、

    我正在调试中取得进展、但我遇到了一个问题。 我仍然配置了 ID 为0x100 (µC -> PC)的发送帧和 ID 为0x010 (PC ->µC)的另一帧。 我想在 CAN_IF1DATx 寄存器中查看 ID 为0x100的帧上发送的数据、并在第二个 CAN_IF2DAT 缓冲区中查看 ID 为0x010的 PC 发送的数据。 但在调试器模式下、我在 CAN_IF1DAT 和 CAN_IF2DAT 中看到 Tx 中 ID 0x100上传输的相同数据。 我不访问 CAN_Rx 中帧0x010的数据。
    为什么在 CAN_IF2DAT 中看不到 CAN_Rx 中的数据? 我肯定在配置上犯了错误?
    I defined CAN_IF1CMD.bit.DIR = 1 (发送方向)
                    CAN_IF1ARB.bit.Dir = 1 (发送方向)
                    CAN_IF1ARB.bit.ID = 0x100 << 18
                    CAN_IF1CMD.bit.MSG_NUM = 1

                    CAN_IF1CMD DIR = 0 (接收方向)
                    CAN_IF1ARB.bit.Dir = 0 (接收方向)
                    CAN_IF1ARB.bit.ID = 0x010 << 18
                    CAN_IF1CMD.bit.MSG_NUM = 2

    我看不到问题、可以帮我吗?

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include "f28002x_device.h"
    #include "HPTS100_can.h"
    uint16_t rx_data[8];
    void can_init(void)
    {
    EALLOW;
    /// Configure CANA_RX
    GpioCtrlRegs.GPAPUD.bit.GPIO3 = 1; /// Disable the pullup on GPIO3
    GpioCtrlRegs.GPAGMUX1.bit.GPIO3 = 3; /// To define mux position, mux position equal GPAGMUX(2bits) - GPAMUX(2bits) 0 to 15 number, here mux position equal 14 so GPAGMUX1 = 11b and GPAMUX1 = 10b.
    GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 2; /// GPIO3 = CANA_RX, see pin attributes documentation for mux position.
    GpioCtrlRegs.GPADIR.bit.GPIO3 = 0; /// GPIO3 = input
    GpioCtrlRegs.GPAINV.bit.GPIO3 = 0; /// Not inverted GPIO input
    /// Configure CANA_TX
    GpioCtrlRegs.GPAPUD.bit.GPIO2 = 1; /// Disable the pullup on GPIO2
    GpioCtrlRegs.GPADIR.bit.GPIO2 = 1; /// GPIO2 = output
    GpioCtrlRegs.GPAODR.bit.GPIO2 = 0; /// Normal output not open drain
    GpioCtrlRegs.GPAQSEL1.bit.GPIO2 = 0; /// Synchronous
    GpioCtrlRegs.GPAGMUX1.bit.GPIO2 = 3; /// To define mux position, mux position equal GPBGMUX(2bits) - GPBMUX(2bits) 0 to 15 number, here mux position equal 14 so GPAGMUX1 = 11b and GPAMUX1 = 10b.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    谢谢

    Damien

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

    最佳屏幕截图

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

    尊敬的 Damien:

    很高兴听到您在代码方面取得了良好的进展。  我看到您开始接收 CAN 帧。  在随附的代码上、您可以参考影子寄存器。  我们的 F28002x 示例目前使用 driverlib 代码编写、您似乎使用 了一些旧代码来引用不同类型 CAN (eCAN)的影子寄存器。  F28002x DCAN 中没有影子寄存器。  我只想确保您正在对正确的 CAN 寄存器进行编程。  您能否澄清一下您在 F28002x 上使用过哪些影子寄存器?

    谢谢、

    Joseph

x 出现错误。请重试或与管理员联系。