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.

[参考译文] CCS/TMS320F2.8379万D:CAN_External_Transmit源代码问题

Guru**** 2576195 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/642003/ccs-tms320f28379d-can_external_transmit-source-code-issues

部件号:TMS320F2.8379万D

工具/软件:Code Composer Studio

大家好,

     我正在调试 F2837x控制卡中用于数据传输的CAN_External_Transmit源代码。 如果在单个卡的2个CAN端口之间进行测试,则源代码工作正常,但无法在2个不同控制卡的类似CAN端口上运行。  在2个CAN端口之间执行数据传输时,我想分享有关Cana和CANB寄存器状态的更多信息:

在Cana寄存器中:

1)最后一个错误代码(LEC)= 111,TxRqstReg1 = 01,消息有效注册器1 = 01,访问数据字节(0-3)= 1,

2)访问数据字节(4-7)= 1,发射中断启用= 1,发射请求= 1,块结束= 1,

3)数据长度代码= 1000,  

4) CAN_IF1DATB和CAN_IF1DATA

数据字节0 = 111.11万,  
Data_1 = 1000万,
DATA_2 = 111.101万,
DATA_3 = 1000.101万,
DATA_4 = 1000.001万,
DATA_5 = 1000.001万,
DATA_6 = 111.0101万,
DATA_7 = 1000万,

在CANb寄存器中,几乎所有参数的值都为零。

任何人是否可以根据上述参数建议一些信息,以找出CAN端口之间数据传输不正确的原因。

提前感谢。


此致
Sumanta

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

    根据您的查询,如果您在使用外部CAN收发器的同一控制卡上使用CAN收发器,CAN_External_Transmit将正常工作。
    您现在尝试拆分示例并使用两个不同的控制卡进行通信。 CAN A正在传输数据,CAN B正在接收数据。

    如果您从CAN A传输数据,则在数据成功发送且CAN B接收数据时,应获得中断。
    需要正确配置用于传输的CAN A和用于接收的CAN B。

    CAN A开始传输数据时,CAN B应等待接收数据。 您是否可以检查配置是否正确以及数据是否写入到消息RAM中。

    如果您可以提供更多示例的详细信息,也许会更容易获得帮助。

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

     Harshmeet,您好!

                感谢您的回答,您能否消除我对CAN A开始传输数据和CAN B等待接收数据的配置设置的困惑。 请展示一些有关检查正在写入消息RAM的数据的过程的见解。

    提前感谢。

    此致

    Sumanta   

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

    您好,Sumanth:

    对于发射器端,您需要设置比特率并启用中断。 设置消息对象进行传输后,您需要进入循环以传输数据,直到接收端收到消息并发生传输中断。

    对于接收端,您还需要设置比特率并启用中断,然后设置用于接收的消息对象并进入循环,直到收到发送的数据并发生中断。

    消息RAM只能在调试模式下访问。 信息RAM基本地址是高于CAN外围设备基本地址的0x1000。

    您能否分享一些有关您的使用情况的详细信息,以便我能提供更好的帮助,否则这可能有助于您进行调试。

    谢谢,此致

    Harshmeet Singh

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

    Harshmeet,您好!

                正如您所建议的,我在我的代码中实现了如下所示的相同内容:

    发射器侧

    1)设置比特率-  CANBitRateSet (Cana_base,2000万0,50万)

      启用中断- CANIntEnable (Cana_base,CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS)

    2) 设置消息对象以进行传输:

    sTXCANMessage.ui32MsgID = 0x5555;
    sTXCANMessage.ui32MsgIDMask = 0;
    sTXCANMessage.ui32Flags = 0;
    sTXCANMessage.ui32MsgLen = MSG_DATA_LENG;
    sTXCANMessage.pucMsgData = txMsgData

     

    3)进入循环传输数据,直到接收端收到消息并发生传输中断

    用于(I = 0;I < TXCOUNT;I++)

    //
    //检查错误标志以查看是否发生错误
    //
    /* IF (errorFlag)

    ASM (" ESTOP0");
    }
    */
    //
    //验证已传输消息的数量是否等于的数量
    //在发送新邮件之前收到的邮件
    //
    IF (txMsgCount == rxMsgCount)

    //
    //传输消息
    //
    CANMessageSet (Cana_base,TX_MSG_OBJ_ID,&sTXCANMessage,MSG_OBJ_TYPE_TX);

    txMsgCount++;
    }
    否则

    errorFlag = 1;
    }

    //
    //在继续前延迟0.25 秒
    //
    DELAY _US (1000 * 250);

    //
    //增加传输的消息数据中的值。
    //
    txMsgData[0]+= 0x01;
    txMsgData[1]+= 0x01;
    txMsgData[2]+= 0x01;
    txMsgData[3]+= 0x01;
    }

     

    接收器侧

    1)设置比特率-  CANBitRateSet (CANB_BASE,2000万0,50万) 和

      启用中断-  CANIntEnable (CANB_BASE,CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS)

    2) 设置消息对象以进行传输:

    sRXCANMessage.ui32MsgID = 0x5555;
    sRXCANMessage.ui32MsgIDMask = 0;
    sRXCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE;
    sRXCANMessage.ui32MsgLen = MSG_DATA_length;
    sRXCANMessage.pucMsgData = rxMsgData

     

    3)进入循环传输数据,直到接收到消息并且发生传输中断为止

    __interrupt void canbISR(void)

    UINT32_t状态;

    //
    //读取CAN-B中断状态以查找中断原因
    //
    状态= CANIntStatus (Cana_base,CAN_INT_STS_Cause);

    //
    //如果原因是控制器状态中断,则获取状态
    //
    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-B接收消息对象1
    //
    否则,如果(status == RX_MSG_OBJ_ID)

    //
    //获取收到的消息
    //
    CANMessageGet (Cana_base,RX_MSG_OBJ_ID,&sRXCANMessage,TRUE);

    //
    //达到此点意味着RX中断发生在上
    //消息对象1,消息RX已完成。 清除
    //消息对象中断。
    //
    CANIntClear (Cana_base,RX_MSG_OBJ_ID);

    //
    //递增计数器以跟踪已收到的邮件数
    //已收到。 在实际应用程序中,可以将标志设置为
    //指明何时收到消息。
    //
    rxMsgCount++;

    //
    //自从收到邮件后,清除所有错误标志。
    //
    errorFlag = 0;
    }
    //
    //如果出现意外原因导致中断,这将处理中断。
    //
    否则

    //
    //假中断处理可以在此处进行。
    //
    }

    //
    //清除CAN中断线的全局中断标志
    //
    CANGlobalIntClear (Cana_base,CAN_GLB_INT_CANINT0);

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

     

    在以上代码中,数据传输失败。  

    如果源代码中有任何错误,请提出建议。

    提前感谢。

    此致

    Sumanta

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

    您共享的代码看起来正确,发射器侧看起来正确。

    但接收器端存在一些问题。 是因为CAN收发器存在而使用Cana从其他板接收,还是您将外部CAN收发器连接到CANB?
    因为我看到您在接收器端设置CANB和从CANA接收的比特率。 所以那里有一些不正确的地方。 您能否看看并纠正这一问题。

    还可以检查GPIO配置并根据您正在使用的CAN控制器进行初始化。 希望这有所帮助。


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

    Harshmeet,您好!

                我目前工作的基本结构图如下:

    因此,目前仅使用来自两个MCU的单个CAN端口进行基于CAN的数据传输。 在运行源代码时,可以在以下端子处获得脉动正信号:

    1) CAN总线,2)发射器MCU接收器和3)接收器MCU的发射器和接收器端子。

    但问题在于如何在Watch Window的Receiver变量中获取数据。 请给出建议。

    提前感谢。

    此致

    Sumanta

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

     Harshmeet,您好!

                实际上,通过观察单个MCU的接收器和发送器终端以及CAN总线的波形,可以确认两个CAN端口的发送和接收功能均已启用, 因此,从一个MCU传输的数据出现在CAN总线上,该总线再次由同一MCU的接收器终端接收,并存储在公共 消息框中。 因此,您是否可以建议对源代码进行修改,以便MCU1中的数据在MCU2中传输和接收,然后将MCU2存储在单独的消息框中。

    提前感谢。

    此致

    Sumanta  

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

    当我说“进入循环传输数据,直到接收到消息并发生传输中断”时,循环必须在主循环中,如果数据传输成功,它应该得到传输中断。

    那么,如果您在接收器端获取数据,那么您是否会收到传输中断? 是否可以在传输端的消息RAM中看到数据?

    在接收器端,您还必须在主端放置一个循环,等待数据出现并检查接收中断。 您需要检查从中获取数据的消息框是否是您正在初始化的消息框。

    检查消息RAM中是否有数据。

    谢谢,此致,
    Harshmeet Singh