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: CAN通信邮箱配置问题

Part Number: TMS320F28379D

CAN通信中,只有默认邮箱1在进行通信,其余邮箱无法正常工作。更令人奇怪的是,即使注释掉通信代码后,邮箱1也仍然通信(一个神奇的bug)

在调试CAN通信时,参考C2000example的例程,对1~5号邮箱进行了初始化

以下为初始化代码

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()//CAN
{
GPIO_setPinConfig(GPIO_18_CANRXA);
GPIO_setPinConfig(GPIO_19_CANTXA);
CAN_initModule(CANA_BASE);
// Set up the CAN bus bit rate to 500kHz for each module
// Refer to the Driver Library User Guide for information on how to set
// tighter timing control. Additionally, consult the device data sheet
// for more information about the CAN module clocking.
//
CAN_setBitRate(CANA_BASE, DEVICE_SYSCLK_FREQ, 5000000, 16);//500Khz
// Initialize the transmit message object used for sending CAN messages.
// Message Object Parameters:
// CAN Module: A
// Message Object ID Number: 1
// Message Identifier: 0x01
// Message Frame: Standard
// Message Type: Transmit
// Message ID Mask: 0x0
// Message Object Flags: None
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

随后是通信代码

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void communication(void)
{
// 8416
CanFrame1[0] = ((uint16_t)(Udc * 10) >> 8) & 0xFF;
CanFrame1[1] = (uint16_t)(Udc * 10) & 0xFF;
CanFrame1[2] = ((uint16_t)((Ua + 300) * 10) >> 8) & 0xFF;
CanFrame1[3] = (uint16_t)((Ua + 300) * 10) & 0xFF;
CanFrame1[4] = ((uint16_t)((Ub + 300) * 10) >> 8) & 0xFF;
CanFrame1[5] = (uint16_t)((Ub + 300) * 10) & 0xFF;
CanFrame1[6] = ((uint16_t)((Uc + 300) * 10) >> 8) & 0xFF;
CanFrame1[7] = (uint16_t)((Uc + 300) * 10) & 0xFF;
CAN_sendMessage(CANA_BASE, 1, MSG_DATA_LENGTH, CanFrame1);
// 2 Ia, Ib, Ic, Ipa
CanFrame2[0] = ((uint16_t)((Ia + 40) * 10) >> 8) & 0xFF;
CanFrame2[1] = (uint16_t)((Ia + 40) * 10) & 0xFF;
CanFrame2[2] = ((uint16_t)((Ib + 40) * 10) >> 8) & 0xFF;
CanFrame2[3] = (uint16_t)((Ib + 40) * 10) & 0xFF;
CanFrame2[4] = ((uint16_t)((Ic + 40) * 10) >> 8) & 0xFF;
CanFrame2[5] = (uint16_t)((Ic + 40) * 10) & 0xFF;
CanFrame2[6] = ((uint16_t)((Ipa + 40) * 10) >> 8) & 0xFF;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

以下是实验现象,其中Uabc与Idc(实际为Idc中)能够正常接收(邮箱1),其余部分无法同步,观察can帧信号后也发现邮箱ID始终为1;

即使注释掉communication函数,邮箱1仍然发送。这个是什么原因导致的呢?

  • 需要说明的是  CAN通讯速率的设置应为500000,上面给错了,但是修改为正常后仍然还是上述问题

  • 问题最终定位在

    Fullscreen
    1
    CAN_setBitRate(CANA_BASE, DEVICE_SYSCLK_FREQ, 5000000, 16);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    TI所提供例程中的16bittime  在一个邮箱情况下是可以运行的;

    但不足以支撑多个邮箱的快速发送,详情可见如下函数:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    void
    CAN_setBitRate(uint32_t base, uint32_t clockFreq, uint32_t bitRate,
    uint16_t bitTime)
    {
    uint16_t brp;
    uint16_t tPhase;
    uint16_t phaseSeg2;
    uint16_t tSync = 1U;
    uint16_t tProp = 2U;
    uint16_t tSeg1;
    uint16_t tSeg2;
    uint16_t sjw;
    uint16_t prescaler;
    uint16_t prescalerExtension;
    //
    // Check the arguments.
    //
    ASSERT(CAN_isBaseValid(base));
    ASSERT((bitTime > 7U) && (bitTime < 26U));
    ASSERT(bitRate <= 1000000U);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    bittime决定了brq(波特率预分频值),若配置5个邮箱所计算得到的CAN通信情况下brq将会偏大,从而使得CAN邮箱发送时序被挤占,进一步导致其无法发送。

    后续经过测试  将bittime改为20及以上能够满足多个邮箱发送的需求。

    至此这个问题解决了,希望给后人一点帮助。

    另外值得说明的是,CAN通信需要留够足够的时钟周期,放在中断中如果时钟周期不够   则同样不能工作。

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