主题中讨论的其他器件: TIDEP-01014、 TCAN4550、 TMS570LS1224、 HALCOGEN
大家好、
如何在 TMS570LC4357中配置 CANFD

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


如果您有适用于 TMS570 MCU 的任何 CANFD 示例代码、请与我分享。
提前感谢。
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中配置 CANFD

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


如果您有适用于 TMS570 MCU 的任何 CANFD 示例代码、请与我分享。
提前感谢。
您好、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
}
提前感谢。
您好、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 以及如何使用它。
提前感谢您。
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 团队。
您好、Santhosh、
这是非常有用的用户指南:
您好、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/