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.

[参考译文] TCAN4550-Q1:CAN 传输、不显示任何数据

Guru**** 1460770 points
Other Parts Discussed in Thread: TCAN4550-Q1, AWRL1432, TCAN4550
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1328557/tcan4550-q1-can-transmits-not-showing-any-data

器件型号:TCAN4550-Q1
主题中讨论的其他器件: AWRL1432TCAN4550

大家好!

我正在使用适用于汽车应用的 TCAN4550-Q1在毫米波雷达 SoC (AWRL1432)上实现 SPI 到 CAN-FD。

到目前为止、我们已在 TCAN4x5x_SPI 中实现功能、并验证了它可以通过 SPI 读取/写入 TCAN4550寄存器。  

但是、当我使用 TCAN4550_demo 中提供的参考代码尝试通过 CAN-FD 传输输出时、不会发送任何数据;只能看到 ID、Ctrl 和 CRC、之后不会确认。

请参阅下面的传输波形:

在 PCAN-Pro 上进行的测试也显示了类似的结果:虽然发送是注册的、但仅显示 ID、数据显示为0。

请参阅以下代码中的 TCAN4550_Initialization:

void TCAN4550_Initialize (void)
{
TCAN4x5x_SPI_ERR();//清除在启动期间因引脚多路复用器更改而可能设置的任何 Device_Clear ERR 标志

TCAN4x5x_TCAN4x52 Device_Enable 模式(TCAN4x5x_DEVICE_TEST_MODE_CONTROLLER);
int32_t debugVal = AHB_READ_32 (REG_DEV_MODES_AND_PINS);

//第一步尝试清除所有中断
TCAN4x5x_TCANDEV_ie Device_Interrupt_Enable ={0};//初始化为0、所有位均设置为0。
TCAN4x5x_MCAN ruptEnable (&DEV_ie);//为简单起见、禁用所有与 Device_Configure 相关的非中断

TCAN4x5x_MCAN DEV_ir ={0};//设置新的 Device_Interrupts IR 对象以轻松进行中断检查
TCAN4x5x_MCAN crupts (&DEV_ir);//请求使用当前器件(非 Device_Read)中断值更新结构

如果(dev_ir. PWRON)//如果设置了上电中断标志
TCAN4x5x_TCAN45x_ Device_Clear rupts (&DEV_ir);//清除它,因为如果它在~4分钟内没有清除,它就会进入睡眠状态

//配置 CAN 总线速度
TCAN4x5x_MCAN_TCANNomTiming Nominal_Timing_Simple ={0};//带有40 MHz 晶体的500k 仲裁((40E6 / 2)/(32 + 8)= 500E3)
TCANNomTiming。 NominalBitRatePrescaler = 2;
TCANNomTiming。 NominalTqBeforeSamplePoint = 32;
TCANNomTiming。 NominalTqAfterSamplePoint = 8;

TCAN4x5x_MCAN_TCANDataTiming ={0};// 2Mbps Data_Timing_Simple、带40 MHz 晶体(40E6 /(15 + 5)= 2E6)
TCANDataTiming。 DataBitRatePrescaler = 1;
TCANDataTiming。 DataTqBeforeSamplePoint = 15;
TCANDataTiming。 DataTqAfterSamplePoint = 5;


TCAN4x5x_MCAN_CCCR_Config cccrConfig ={0};//请记住要初始化为0、否则将导致随机垃圾!
if (frametype == CANFDLD_MCANFrameType_FD)
{
cccrConfig。 FDOE = 1;//启用 CAN FD 模式
cccrConfig。 BRSE = 1;// CAN FD 比特率开关启用

否则
{
cccrConfig。 FDOE = 0;//启用 CAN 模式
cccrConfig。 BRSE = 0;// CAN FD 位速率切换禁用


//cccrConfig。 DAR = 1;//禁用自动变速器

/*配置默认的 CAN 数据包过滤设置*/
TCAN4x5x_MCAN_GFC Global_Filter_Configuration ={0};
GFC。 RRFE = 1;//拒绝远程帧(TCAN4x5x 不支持此功能)
GFC。 RRFS = 1;//拒绝远程帧(TCAN4x5x 不支持此功能)
GFC。 ANFE = TCAN4x5x_GFC_ACCEP_TO_RXFIFO0;//如果传入消息与不匹配、则默认行为过滤器是接受扩展 ID 消息的 RXFIO0 (29位 ID)
GFC。 ANFS = TCAN4x5x_GFC_ACCEP_TO_RXFIFO0;//如果传入消息与不匹配、则默认行为过滤器是接受标准 ID 消息的 RXFIO0 (11位 ID)

*******************
*在下一个配置块中,我们将 MCAN 内核设置为:
*- 1 SID 过滤器滤芯
*- 1个 XID 滤芯
*- 5个 RX FIFO 0单元
*- RX FIFO 0支持高达64字节的数据有效负载
*- RX FIFO 1和 RX 缓冲区将不会有任何元素,但我们仍然设置了它们的数据有效负载大小,即使不是必需的
*-无 TX 事件 FIFO
*- 2个发送缓冲器、支持高达64字节的数据有效载荷
*/
TCAN4x5x_MRAM_Config MRAMConfiguration ={0};
MRAM 配置。 SIDNumElements = 1;//元素的标准 ID 数
MRAM 配置。 XIDNumElements = 1;//扩展的元素 ID 数量
MRAM 配置。 Rx0NumElements = 5;// RX0元素数量
MRAM 配置。 Rx0ElementSize = MRAM_64_RX0;// Byte_Data 数据有效载荷大小(使用定义)
MRAM 配置。 Rx1NumElements = 0;// Rx1元素数量
MRAM 配置。 Rx1ElementSize = MRAM_64_Rx1;// Byte_Data 数据有效载荷大小(使用定义)
MRAM 配置。 RxBufNumElements = 0;// RX 缓冲区元素数量
MRAM 配置。 RxBufElementSize = MRAM_64_Rx;// Byte_Data 缓冲区数据有效载荷大小(使用定义)
MRAM 配置。 TxEventFIFONumElements = 0;// TX 事件 FIFO 元素数
MRAM 配置。 TxBufferNumElements = 2;// TX 缓冲器元素数量
MRAM 配置。 TxBufferElementSize = MRAM_64_TX Byte_Data 缓冲区数据有效载荷大小(使用定义)


//使用上述设置配置 MCAN 内核,该块中的这些更改都是受保护的写入寄存器,因此我们只需一次性将其淘汰
TCAN4x5x_MCAN_EnableProtectedRegisters ();//开始设置可访问受保护的寄存器
TCAN4x5x_MCAN_ConfigureCCCRRegister (&cccrConfig);//启用 FD 模式和位速率切换
TCAN4x5x_MCAN_ConfigureNominNoi Timing_Simple (&TCANNomTiming);//设置标称/仲裁位时序
TCAN4x5x_MCAN_ConfigureFD Timing_Simple (&TCANDataTiming);//设置 CAN FD 时序
TCAN4x5x_MRAM_CLEAR ();//清除所有 MRAM (将0写入所有 MRAM)
TCAN4x5x_MRAM_Configure (&MRAMConfiguration);//设置与 MRAM 配置相关的适用寄存器
TCAN4x5x_MCAN_DisableProtectedRegisters ();//禁用受保护的写入并使器件退出初始化模式

//设置要为 MCAN 启用的中断
TCAN4x5x_MCAN_MCAN_ie Interrupt_Enable ={0};//请记住要初始化为0、否则将得到随机垃圾!
例如、CAN_ie。 RF0NE = 1;// RX FIFO 0新消息中断启用

TCAN4x5x_MCAN_ConfigureInterruptEnable (&mcan_ie);//启用相应的寄存器

//设置过滤器,此过滤器会将 ID 为0x055的任何消息标记为优先级消息
TCAN4x5x_MCAN_SID_Filter SID_ID ={0};
SID_ID。 SFT = TCAN4x5x_SID_SFT_CLASSIC;// SFT:标准滤波器类型。 配置为经典滤波器
SID_ID。 SFEC = TCAN4x5x_SID_SFEC_PRIORITYSTORX0;//标准滤波器元件配置、将其作为优先级消息存储在 RX FIFO 0中
SID_ID。 SFID1 = 0x055;// SFID1 (经典模式滤波器)
SID_ID。 SFID2 = 0x7FF;// SFID2 (经典模式屏蔽)
TCAN4x5x_MCAN_WriteSIDFilter (0、&SID_ID);//写入 MRAM


//将 ID 0x12345678存储为优先级消息
TCAN4x5x_MCAN_XID_Filter XID_ID ={0};
XID_ID。 EFT = TCAN4x5x_XID_EFT_CLASSIC;// EFT
XID_ID。 EFEC = TCAN4x5x_XID_EFEC_PRIORITYSTORX0;// EFEC
XID_ID。 EFID1 = 0x12345678;// EFID1 (经典模式滤波器)
XID_ID。 EFID2 = 0x1FFFFFFF;// EFID2 (经典模式掩码)
TCAN4x5x_MCAN_WriteXIDFilter (0、&XID_ID);//写入 MRAM

/*配置 TCAN4550非 CAN 相关功能*/
TCAN4x5x_DEV_CONFIG devConfig ={0};//请记住初始化为0、否则将获得随机垃圾信息!
devConfig。 SWE_DIS = 0;//保持睡眠唤醒错误启用(它是禁用位、而不是启用)
devConfig。 DEVICE_RESET = 0;//未请求软件复位
devConfig。 WD_EN = 0;//看门狗已禁用
devConfig.nWKRQ_config = 0;//镜像 INH 函数(默认)
devConfig。 INH_DIS = 0;// INH 已启用(默认设置)
devConfig。 GPIO1_GPO_CONFIG = TCAN4x5x_DEV_CONFIG_GPO1_MCAN_INT1;// MCAN nINT 1 (默认)
devConfig。 FAIL_SAFE_EN = 0;//失效防护已禁用(默认设置)
devConfig。 GPIO1_CONFIG = TCAN4x5x_DEV_CONFIG_GPIO1_CONFIG_GPO;// GPIO 设置为 GPO (默认)
devConfig。 WD_ACTION = TCAN4x5x_DEV_CONFIG_WDT_ACTION_nINT;//看门狗设置中断(默认)
devConfig。 WD_BIT_RESET = 0;//不复位看门狗
devConfig.nWKRQ_VOLTAGE = 0;//将 nWKRQ 设置为内部电压轨(默认值)
devConfig。 GPO2_CONFIG = TCAN4x5x_DEV_CONFIG_GPO2_NO_ACTION;// GPO2没有行为(默认)
devConfig。 CLK_REF = 1;//输入晶体为40 MHz 晶体(默认)
devConfig。 WAKE_CONFIG = TCAN4x5x_DEV_CONFIG_WAKE_Both_EDGE;//唤醒引脚可由任一边沿触发(默认值)
TCAN4x5x_TCAN10x Device_Configure (&devConfig);//使用上述配置配置器件

TCAN4x5x_CCAN4x5x_T Device_Set (TCAN4x5x_DEVICE_MODE_NORMAL);//由于配置已完成、因此设置为正常模式。 这条线路将通过上拉电阻器

TCAN4x5x_MCAN_ClearInterruptsAll ();//重置所有 MCAN 中断(不包括任何 SPIERR 中断)

请参阅下面的我如何发送 CAN-FD 消息:  

void TCAN4550_Uint32_t Transmit_Schedule msg_id (uint32_t、
uint8_t * txmsg、
uint32_t len)
{
易失性 uint32_t index = 0;

TCAN4x5x_MCAN_TX_Header ={0};//请记住初始化为0、否则将实现随机垃圾!
标头。 ID = msg_id;//设置 ID

标头。 EFC = 0;
标头。 MM = 0;
标头。 RTR = 0;
标头。 XTD = 0;//我们在此示例中未使用扩展 ID
标头。 ESI = 0;//错误状态指示器

if (frametype == CANFDLD_MCANFrameType_FD)
{
标头。 FDF = 1;// CAN FD 帧已启用
标头。 BRS = 1;//位速率开关启用

标头。 DLC = mcan_dlc_64b;// DLC 是剩余的长度?
TCAN4x5x_MCAN_WriteTXBuffer (0、&HEADER、txmsg);
TCAN4x5x_MCAN_TransmitBufferContents (0);
uint32_t debugValue = AHB_READ_32 (REG_DEV_IR);

...

*我尝试将 DLC 设置为64B ,因为当我发送 txmsg 的长度(以字节为单位)时,我得到相同的错误。

我读取 REG_DEV_IR 时得到:0x00000E0

您能否建议可能是什么问题?

谢谢!

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

    尊敬的 Jin:

    在您共享的代码中、我没有看到您创建要发送的消息数据的部分。  您写入 TX 缓冲器的实际消息内容是什么?

    演示代码使用以下代码来创建待发送的消息。  您将需要创建一个用于保存消息数据内容的数据缓冲区、然后根据要发送的数据字节数将 DLC 设置为正确的大小。

       /
       *目前所有内容都是针对 TCAN4550 *
       * /
       init_can();                               //运行主 MCAN 配置序列。 大部分的配置都在这里!

       /*定义要发送的 CAN 消息*/
       TCAN4x5x_MCAN_TX_Header ={0};         //请记住初始化为0、否则将实现随机垃圾!
       uint8_t data[4]={0x55、0x66、0x77、0x88};      //定义数据有效载荷
       标头。 DLC = MCAN_DLC_4B;                   //将 DLC 设置为等于或小于数据有效载荷(如果您的 DLC 是8个字节、则可以将64字节的数据数组传递到 WriteTXFIFO 函数中、但只会读取前8个字节)
       标头。 ID = 0x144;                         //设置 ID
       标头。 FDF = 1;                            // CAN FD 帧已启用
       标头。 BRS = 1;                            //位速率切换启用
       标头。 EFC = 0;
       标头。 MM = 0;
       标头。 RTR = 0;
       标头。 XTD = 0;                            //在此示例中,我们没有使用扩展 ID
       标头。 ESI = 0;                            //错误状态指示符


       TCAN4x5x_MCAN_WriteTXBuffer (0、&HEADER、DATA);   //此函数实际上将标头和数据有效载荷写入指定 TX 队列编号中的 TCAN 的 MRAM。 它返回写入 TXBAR 所需的位、
                                           //但不一定需要您使用它。 在此示例中不会这样做、这样我们就可以在稍后点发送排队的数据。

       /*让我们制作一条不同的 CAN 消息*/
       DATA[0]= 0x11;
       data[1]= 0x22;
       data[2]= 0x33;
       DATA[3]= 0x44;                            //定义数据有效载荷

       标头。 DLC = MCAN_DLC_4B;                   //将 DLC 设置为等于或小于数据有效载荷(如果您的 DLC 是8个字节、则可以将64字节的数据数组传递到 WriteTXFIFO 函数中、但只会读取前8个字节)
       标头。 ID = 0x123;                         //设置 ID
       标头。 FDF = 1;                            // CAN FD 帧已启用
       标头。 BRS = 1;                            //位速率切换启用
       标头。 EFC = 0;
       标头。 MM = 0;
       标头。 RTR = 0;
       标头。 XTD = 0;                            //在此示例中,我们没有使用扩展 ID
       标头。 ESI = 0;                            //错误状态指示符

       TCAN4x5x_MCAN_WriteTXBuffer (1、&HEADER、DATA);   //此行将数据和标头写入 TX FIFO 1
       TCAN4x5x_MCAN_TransmitBufferContents (1);      //请求发送 TX 缓冲器1


       TCAN4x5x_MCAN_TransmitBufferContents (0);      //现在我们可以发送之前排队但未发送的 TX FIFO 元素0数据。

    此致、

    乔纳森

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

    尊敬的 Jonathan:

    感谢您的支持。 我目前正像在 TCAN4550_demo 中一样、使用预设数据(在经典 CAN 中)进行测试、并获得相同的 CAN 错误:

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

    尊敬的 Jin:

    您的标头结构中的其他位是什么?  您只会显示标题。 DLC 和报头。 ID 字段。  您设置 FDF、BRS、EFC、MM、RTR 将接头的 XTD 和 ESI 位更改成了?

    我想知道您看到的"NAK"是否真的是一个错误标志、因为某些不兼容的标头或协议设置、或者由于某些位时序配置与 TCAN4550和总线上的其他 CAN 器件不匹配而引发。

    此致、

    乔纳森

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

    尊敬的 Jonathan:  

    其余标头位的设置如上所示在 TCAN4550_TRANSMIT Schedule ()中:

    标头。 EFC = 0;
    标头。 MM = 0;
    标头。 RTR = 0;
    标头。 XTD = 0;//我们在此示例中未使用扩展 ID
    标头。 ESI = 0;//错误状态指示器

    标头。 FDF = 0;// CAN FD 帧被禁用
    标头。 BRS = 0;//位速率开关被禁用

    我正在测试的只是将 TCAN4550连接到 PCAN-Pro/LOGIC 分析仪、如果这有任何帮助的话。

    我目前还正在设置外部环回模式、以在末端进行进一步测试。  

    谢谢!

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

    尊敬的 Jin:

    这与您的控制字段类似、并且 DLC 值没有针对4字节数据字段进行正确设置。  

    如何设置外部回送?  您要配置哪些寄存器位?

    此致、

    乔纳森