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.

[参考译文] TMS570LC4357:如何在 TMS570LC4357中配置 CANFD

Guru**** 2454880 points
Other Parts Discussed in Thread: TMS570LC4357, TIDEP-01014, TCAN4550, TMS570LS1224, HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1014838/tms570lc4357-how-to-configure-canfd-in-tms570lc4357

器件型号:TMS570LC4357
主题中讨论的其他器件: TIDEP-01014TCAN4550TMS570LS1224HALCOGEN

大家好、  

如何在 TMS570LC4357中配置 CANFD

不能将 DLC 增加超过8个。 对于 CANFD、我需要64字节。

如果您有适用于 TMS570 MCU 的任何 CANFD 示例代码、请与我分享。

提前感谢。

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

    您好、Santhosh、

    TMS570LC43x 不支持 CANFD。 它仅支持传统 CAN。

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

    是 QJ Wang、感谢您的反馈。  

    我们计划使用 TCAN4550 SPI 转 CANFD 进行通信。 我已经厌倦了代码"TIDEP-01014 - Node1和 Node2"、但它是中断方法。  

    您能不能为我介绍一下 TMS570LC4357 MCU 的 TCAN4550 CANFD 代码的轮询方法。

    CANFD 配置的发送和接收器代码。

    谢谢你。

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

    您好、Santhosh、

    您可以在 Rx FIFO 状态寄存器和 Tx 事件 FIFO 状态中使用 TX 和 RX 状态。   

     RX FIFO 状态寄存器显示 FIFO 中有多少条新消息、以及开始读取的索引。  

    存储 CAN 消息发送事件消息的 FIFO。 这些元件由 TCAN4x5x 在发送消息时生成、并由微控制器读取以查看已发送消息的状态。  

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

    您好、QJ Wang、

    我已经使用 TCAN4550 SPI 转 CANFD 尝试过 TMS570LS1224 Launchpad、它工作正常、但 TMS570LC4357 Launchpad 中的问题

    TMS570LS1224

    SPI.c

    uint32 spiTransmitData (spiBASE-t * SPI、spiDAT1_t *数据通信 fu_t、uint32块大小、uint8 * srcbuff)

    uint32 spiTransmitAndReceiveData (spiBASE-t * SPI、spiDAT1_t * dataconfi_t、uint32 blocksize、uint8 * srcbuff、uint8 * destbuff)

    TMS570LC4357  

    hL_spi.c   

    uint32 spiTransmitData (spiBASE-t * SPI、spiDAT1_t *数据通信 fu_t、uint32块大小、uint16 * srcbuff)

    uint32 spiTransmitAndReceiveData (spiBASE-t * SPI、spiDAT1_t * dataconfi_t、uint32 blocksize、uint16 * srcbuff、uint16 * destbuff)

    spi.c 具有用于 srcbuff 和 destbuff 的 uint8、但在用于 LC43x 库的 uint16中具有 uint8。  

    那么、如何在 TMS570_TCAN45x.c 文件中进行修改

    AHB_READ_B_FL_32 API 调用  spiTransmitData 和 spiTransmitAndReceiveData?

    在这种情况下、如何制作该数组?

    txData[0]= AHB_READ_B_FL_Ocode;
    txData[1]=(地址和0xFF00)>> 0x8;
    txData[2]=(地址& 0x00FF)>>0x0;
    txData[3]= DataLength;
    txData[4]= 0x00;
    txData[5]= 0x00;
    txData[6]= 0x00;
    txData[7]= 0x00;

    请在该阵列构成中为我提供指导。  

    提前感谢。

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

    请在 TM、s570lc43x spi.c 中修改 HALCOGen 生成的函数:

    uint32 spiTransmitData (spiBASE-t * SPI、spiDAT1_t *数据通信 fu_t、uint32块大小、uint8 * srcbuff)

    uint32 spiTransmitAndReceiveData (spiBASE-t * SPI、spiDAT1_t * dataconfi_t、uint32 blocksize、uint8 * srcbuff、uint8 * destbuff)

    对于 TMS570LS1224中使用的示例代码、我   手动修改了 spiTransmitData()和 spiTransmitAndReceiveData()。

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

    您好、QJ Wang、

    是的、它现在已经工作了。  

     我在 SPI 至 CANFD 代码中有一些查询  

    1.我需要修改基于中断的 CANFD 轮询方法。  

    2.TCAN45x_devConfig CANFD 通信的轮询方法是否需要此 API?

    这些是将在我的代码中使用的引脚。

    nINT -- N2HET1[23]

    CAN_RST -  N2HET1[11]

    SPI3_NCS0

    SPI3_SIMO

    SPI3_SOMI

    SPI3_CLK

    我已经为  我的定制板修改了 TCAN45x_Reset API。

    void TCAN45x_Reset()
    {
        static volatile unsigned int delayval;
        delayval = 10000;   //1ms
    
        //reset TCAN4550 device. GIOB[3] is connected to nRST of TCAN4550 device
        hetREG1->PULDIS |= (0x00000800); //gioPORTB->PULDIS |= (0x1<<3);
        gioSetDirection(hetPORT1, (0x00000800)); //gioSetDirection(gioPORTB, 0x1 << 3);
        //gioSetBit(gioPORTB, 3, 1);
        gioSetBit(hetPORT1,11,1);
        while(delayval--);
        //release the TCAN4550 nRST
        //gioSetPort(hetPORT1, gioGetPort(hetPORT1) ^ 0x00000000);
        //gioSetBit(gioPORTB, 3, 0);
        gioSetBit(hetPORT1,11,0);
        delayval = 10000;
        while(delayval--);          //is requires. otherwise it doesn't work. QJ 2019
    }

    请支持我修改 TCAN45x_devConfig API。

    void TCAN45x_devConfig()
    {
        gioPORTA->DIR     = (uint32)((uint32)0U << 0U);     /* Bit 0/1/2/7 */
        gioPORTB->DIR     = (uint32)((uint32)0xFB);         /* Bit 2 as input */
        gioREG->POL       = (uint32)((uint32)0x0U << 0U);   /* Bit 0/1, falling edge */
        gioREG->LVLSET    = (uint32)((uint32)(0x13U | 0x400));   /* GIOA Bit 0/1/2/7, GIOB Bit 2, high priority interrupt */
        gioPORTA->PULDIS  = 0x87; /* Bit 0/1/2/7, disable the pull */
        gioPORTB->PULDIS  = 0x04; /* Bit 2, disable the pull */
        gioEnableNotification(gioPORTA, 0x87); //enable the INT on GIOA0,GIOA1,GIOA2,GIOA7
        gioEnableNotification(gioPORTB, 0x04); //enable the INT on GIOB2, user button input
    }

    提前感谢。

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

    您好!

    您是否未将 TCAN45x CAN_GPIO1和 CAN_GPIO2连接到 TMS570 MCU 引脚?

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

    您好、QJ Wang、

    我没有将  TCAN45x  CAN_GPIO1和 CAN_GPIO2连接 到 TMS570 MCU 引脚。 是最多的吗?

    我正在寻找 Tx 和 Rx 的轮询方法。  

    while(1)
    	{
    	        MCAN_WriteTXFIFO(0, &header, &g_ucADC1Data[g_ucCurrentAdcDataIndex][0]);    
    			// This function actually writes the header and data payload to the specified TX Fifo number. It returns the bit necessary to write to TXBAR,
                //retVal = MCAN_WriteTXFIFO(0, &header, &td[0]);    // This function actually writes the header and data payload to the specified TX Fifo number. It returns the bit necessary to write to TXBAR,
                // This line writes the data and header to TX FIFO 1 and it will write the return value (corresponding to the
                // FIFO bit number in TX BAR
    	        MCAN_WriteTXFIFO(1, &header1, &g_ucADC1Data[g_ucCurrentAdcDataIndex][0]);
    	        MCAN_WriteTXFIFO(2, &header2, &g_ucADC1Data[g_ucCurrentAdcDataIndex][0]);
    	        MCAN_WriteTXFIFO(3, &header3, &g_ucADC1Data[g_ucCurrentAdcDataIndex][0]);
    	        MCAN_WriteTXFIFO(4, &header4, &g_ucADC1Data[g_ucCurrentAdcDataIndex][0]);
    
                AHB_WRITE_B_FL_32(M_CAN_TXBAR, 0x0000001F);     // Now we can send the TX FIFO element 1 data that we had queued up earlier but didn't send.
               // TCAN45x0_CAN_Interrupt_Register MCAN_IR = {0};  // Setup a new MCAN IR object for easy interrupt checking
               // MCAN_ReadInterruptRegister(&MCAN_IR);           // Read the interrupt register
    			//if (MCAN_IR.RF0N) {                     // If a new message in RX FIFO 0
                    TCAN45x0_RX_HEADER MsgHeader = {0}; // Initialize to 0 or you'll get garbage
                    uint8_t numBytes = 0;
                    uint8_t dataPayload[64] = {0};
    				numBytes = MCAN_ReadNextFIFO( RXFIFO0, &MsgHeader, dataPayload);    // This will read the next element in the RX FIFO 0
    
                    //Toggle NHET pin to check how long tit takes to receive the CAN-FD data
                    //gioSetBit(hetPORT1, 9, 1);
    
                    //for(i=0; i<numBytes/2; i++){
                    //   receivedAdcData = dataPayload[i] << 8 | dataPayload[i+1];
                    //}
                    //cmpB = (etpwmREG6->TBPRD * receivedAdcData*2/numBytes)/0xFFF;
                    //etpwmSetCmpB(etpwmREG6, cmpB);
                    if (MsgHeader.ID == 0x55C) {     // #1 board use 0x158, #2 board use 0x128
                       // Do something
                       TMS570_DEBUGF(("Received CAN-FD Data: 0x%x bytes\n", numBytes));
                       for(i=0; i<numBytes; i++){
                           TMS570_DEBUGF(("  0x%X     ", dataPayload[i]));
                       }
                       TMS570_DEBUGF(("  \n\n "));
                    }
              //  }
    
    	
    	}

    当没有 Rx 输入信号时、TX 工作正常。

    RX 接收报文只有第一次得到是因为 RXFIFO0 - RxFIFO0是第0个缓冲区正在读取?

    请指导我使用5个 Tx FIFO 消息的轮询方法、类似地、使用中断方法来轮询5个 Rx FIFO 消息。

    AHB_WRITE_B_FL_32 (M_CAN_TXBAR、0x0000001F);  

    此地址 0x0000001F 是否表示 FIFO 缓冲区中的总消息?  

    因为我使用了5个 FIFO、所以我提到 了0x0000001F。

    同样、我需要它用于调用接收 API 以及如何使用它。  

    提前感谢您。

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

    您好、QJ Wang、

    SPI3数据格式为波特率(KHz)= 8000

    Charlen 是8岁吗? 只有第一个数据格式是8还是所有数据格式都应该是8?

    我需要检查配置的任何其他设置?

    提前感谢。

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

    CAN_GPIO1和 CAN_GPIO2用于在发送报文或 FIFOx 接收新报文时中断 MCU。 CAN_GPIO1/2连接到支持外部中断的 MCU GPIO 引脚。

    配置中断的过程:

    GPIO1_GPO_CONFIG :MCAN_INT 1 (01)、用于中断线路 m_CAN_int0

      GPIO2_GPO_CONFIG:MCAN_INT 0 (01)、用于中断线路  m_CAN_INT1

    2.启用中断:RF0NE -- RX FIFO 0新消息中断

                    Tce --传输完成中断

    3.选择中断线路:TCL = 0 -- 传输完成中断使用线路0:M_CAN_int0 --> GPIO1

                          RF0NL = 1 -  RX FIFO 0新消息中断使用第1行:M_CAN_INT1-->GPIO2

    有关其他 TCAN 配置、请咨询 TCAN 团队。

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

    是的、字符长度为8位。

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

    您好、Santhosh、

    这是非常有用的用户指南:

    https://www.ti.com/lit/ug/sllu270/sllu270.pdf?ts=1625861842957&ref_url=https%253A%252F%252Fwww.google.com%252F

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

    您好、QJ Wang、

    在我的情况  下、我不使用 CAN_GPIO1_INT 和 CAN_GPIO2_INT。 因此、我需要使用无中断的轮询方法配置接收。

      --- CAN_nINT-- N2HET1[23]、CAN_RST --  N2HET1[11]、 SPI3_NCS0、SPI3_SIMO、SPI3_SOMI、 SPI3_CLK

    如何从 MCAN_ReadNextFIFO 或 MCAN_ReadRXBuffer、 MCAN_ReadTXFIFO 读取接收 CAN ID 而不产生中断

    提前感谢

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

    您好、Santhosh、

    由于不 使用 CAN_GPIO1_IN 和 CAN_GPIO2_IN、我不确定何时读取 MCAN RX 缓冲器。 您是否会咨询 接口论坛的 TCAN4550专家?

    https://e2e.ti.com/support/interface-group/interface/f/interface-forum/

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

    您好、QJ Wang、

    我有三个来自 MCU 的中断引脚作为 GIOA0、GIOA1和 GIOB6、我可以将其与 TCAN4550中的 CAN_GPIO1_IN、CAN_GPIO2_IN 和 nINT 搭配使用。 请使用 TCAN45x_devConfig API 指导我

    如何配置该 LVLSET 寄存器 GIOA 0和 GIOA 1、即0x03、GIOB6为0x4000

      gioREG->LVLSET  =(uint32)((uint32)(0x03|0x4000);  // GIOA 位0/1、GIOB 位6、高优先级中断*/

    但在示例中、只有 CAN_GPIO1_IN 配置为接收 RX 中断、只有 RXFIFO0用于接收 CAN 信号。  

    如何配置为在 RXFIFO1和 RX 缓冲器中接收 CAN 信号。 因为我已经为 RXFIFO 0和 RXFIFO 1配置了 SFD 滤波器、但无法从 RF1N 接收任何 CAN 信号为1、只有在 RF0N 中接收1并接收 CAN 信号。

    如何配置这个 MRAM 配置是 SID 和 XID 用于发送和接收 CAN 信号吗?

    Rx0NumElements 用于接收 CAN 信号的数量。  

    Rx0ElementSize 为48字节是否可以分配第1个 CAN 信号从 Rx0ElementSize 的这个0位置开始、第2个 CAN 信号从 Rx0ElementSize 的这个第8个位置开始?

    类似地、在 RxBufNumElements 中要配置。

    RXFIFO1缓冲器中的 RF1N 没有更新  

    请与我分享 RXFIFO1缓冲区的配置以进行更新?

    是否可以同时配置 RXFIFO 和 RXbuffer?

    请引导我解决上述疑问。  

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

    您好、Santhosh、

    我很高兴回答有关 Hercules 器件的任何问题。 但我不是 TCAN45x 器件的专家、请从 TCAN45x 团队获得更多帮助。 谢谢

    https://e2e.ti.com/support/interface-group/interface/f/interface-forum/