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:TCAN 4550发送 CANFD 报文错误

Guru**** 2540720 points
Other Parts Discussed in Thread: TCAN4550

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/841309/tcan4550-q1-tcan-4550-transmit-canfd-mess-error

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

我们可以使用 tcan4550成功发送8字节数据,但 canfd 消息无法发送,列表代码

 配置部分  

/*
*配置 TCAN4550
*
void TCAN4550_Init (void)

TCAN4x5x_Device_ClearSPIERR();//清除由于我们的引脚多路复用器在 MCU 启动期间发生变化而可能设置的任何 SPI ERR 标志

/*步骤1尝试清除所有中断*/
TCAN4x5x_Device_Interrupt_Enable DEV_IE ={0};//初始化为0、所有位都设置为0。
TCAN4x5x_Device_ConfigureInterruptEnable (&dev_ie);//为简单起见、禁用所有与 MCAN 无关的中断

TCAN4x5x_Device_Interrupts DEV_ir ={0};//设置一个新的 MCAN IR 对象以方便进行中断检查


TCAN4x5x_Device_ReadInterrupts (&dev_ir);//请求使用当前器件(而非 MCAN)中断值更新结构

if (DEV_ir.PWRON)//如果加电中断标志被置位

TCAN4x5x_Device_ClearInterrupts (&dev_ir);//将其清除、因为如果未在~4分钟内清除、它将进入睡眠状态


/*配置 CAN 总线速度*/
TCAN4x5x_MCAN_Nominal Timing_Simple TCANNomTiming ={0};

TCANNomTiming.NominalBitRatePrescaler = McanArbRateSet[0];
TCANNomTiming.NominalTqBeforeSamplePoint = McanArbRateSet[1];
TCANNomTiming.NominalTqAfterSamplePoint = McanArbRateSet[2];

TCAN4x5x_MCAN_Data_Timing_Simple TCANDataTiming ={0};

TCANDataTiming.DataBitRatePrescaler = McanDatRateSet[0];
TCANDataTiming.DataTqBeforeSamplePoint = McanDatRateSet[1];
TCANDataTiming.DataTqAfterSamplePoint = McanDatRateSet[2];



/*配置 MCAN 内核设置*/
TCAN4x5x_MCAN_CCCR_Config cccrConfig ={0};//请记住初始化为0、否则您将获得随机垃圾!
cccrConfig.FDOE = 1;// CAN FD 模式启用
cccrConfig.BRSE = 1;// CAN FD 比特率开关使能
cccrConfig.NISO = 0;
cccrConfig.DAR = 0;



/*配置默认 CAN 数据包过滤设置*/
TCAN4x5x_MCAN_Global_Filter_Configuration GFC ={0};
GFC.RRFE = 1;//拒绝远程帧(TCAN4x5x 不支持此功能)
GFC.RRFS = 1;//拒绝远程帧(TCAN4x5x 不支持此功能)
GFC.ANFE = TCAN4x5x_GFC_Accept_Int_RXFIFO0;//如果传入消息与过滤器不匹配、则默认行为是接受到 RXFIO0以接收扩展 ID 消息(29位 ID)
GFC.ANFS = TCAN4x5x_GFC_Accept_Int_RXFIFO0;//如果传入的消息与过滤器不匹配、则默认行为是接受到 RXFIO0以接收标准 ID 消息(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};
MRAMConfiguration.SIDNumElements = 16;//标准 ID 元素数量,必须为定义的每个元素将过滤器写入 MRAM
MRAMConfiguration.XIDNumElements= 0;//扩展的 ID 元素数量,必须为每个定义的元素将一个过滤器写入 MRAM

MRAMConfiguration.Rx0NumElements = 16;// RX0元素数量
MRAMConfiguration.Rx0ElementSize = MRAM_64_Byte_Data;// RX0数据有效载荷大小

MRAMConfiguration.Rx1NumElements = 0;// RX1元素数量
MRAMConfiguration.Rx1元件大小= MRAM_64_Byte_Data;// RX1数据有效载荷大小

MRAMConfiguration.RxBufNumElements = 0;// RX 缓冲区元素数量
MRAMConfiguration.RxBufElementSize = MRAM_64_Byte_Data;// RX 缓冲区数据有效载荷大小

MRAMConfiguration.TxEventFIFONUMElements = 4;// TX 事件 FIFO 元素数量

MRAMConfiguration.TxBufferNumElements = 4;// TX 缓冲区元素数量
MRAMConfiguration.TxBufferElementSize = MRAM_64_Byte_Data;// TX 缓冲区数据有效载荷大小


/*使用上述设置配置 MCAN 内核,此块中的更改是写保护寄存器,*
*因此、一次执行所有操作是最有意义的、因此我们只解锁并锁定一次*/

TCAN4x5x_MCAN_EnableProtectedRegisters ();//首先使受保护的寄存器可访问

TCAN4x5x_MCAN_ConfigureCCCRRegister (&cccrConfig);//启用 FD 模式和位速率切换
TCAN4x5x_MCAN_ConfigureGlobalFilter (&GFC);//配置全局过滤器配置(默认 CAN 消息行为)

TCAN4x5x_MCAN_ConfigureNominalTiming_Simple (&TCANNomTiming);//设置标称/仲裁位时序
TCAN4x5x_MCAN_ConfigureDataTiming_Simple (&TCANDataTiming);//设置 CAN FD 时序

TCAN4x5x_MRAM_CLEAR ();//清除所有 MRAM (向所有 MRAM 写入0)
TCAN4x5x_MRAM_Configure (&MRAMConfiguration);//设置与 MRAM 配置相关的适用寄存器

TCAN4x5x_MCAN_DisableProtectedRegisters ();//禁用受保护的写入并使器件退出初始化模式

/*设置我们要为 MCAN 启用的中断*/
TCAN4x5x_MCAN_Interrupt_Enable mCAN_ie ={0};//请记住初始化为0,否则会出现随机垃圾!
mCAN_ie.RF0NE = 1;// RX FIFO 0新消息中断使能
mCAN_e.TCE = 1;//传输完成中断使能
mCAN_ie.BOE = 1;// Bus_Off 状态中断使能
mCAN_ie.TOOE = 1;//发生超时中断使能
mCAN_ie.MRAFE = 1;//消息 RAM 访问失败中断使能
mCAN_ie.TFEE = 1;// Tx FIFO 空中断使能
// mCAN_e.word = 0XFFFFFFFF;

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


/* Setup (设置)过滤器,此过滤器将把 ID 为0x055的任何邮件标记为优先级信息*/
TCAN4x5x_MCAN_SID_Filter SID_ID ={0};
SID_ID.SFT = TCAN4x5x_SID_SFT_Classic;// SFT:标准滤波器类型。 配置为经典滤波器
SID_ID.SFEC = TCAN4x5x_SID_SFEC_PRIORITYSTORERX0;//标准滤波器元件配置,将其作为优先级消息存储在 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_PRIORITYSTORERX0;// 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;// Mirror 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_ACT_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;//输入晶振是一个40MHz 晶振(默认)
devConfig.WAKE_CONFIG = TCAN4x5x_DEV_CONFIG_WAKE_Bot_EDGE;//唤醒引脚可由任一边沿触发(默认)

TCAN4x5x_Device_Configure (&devConfig);//使用上述配置配置配置器件

TCAN4x5x_Device_SetMode (TCAN4x5x_DEVICE_MODE_NORMAL);//设置为正常模式、因为配置已完成。 这条线路将打开收发器

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


 和测试部件



DEVMODE = TCAN4x5x_Device_ReadMode ();
TCAN4550_Init();
DEVMODE = TCAN4x5x_Device_ReadMode ();
TCAN4x5x_MCAN_Interrupt_Enable Int_Config ={0};

TCAN4x5x_MCAN_ReadInterruptEnable (&Int_Config);//读取中断寄存器并确保配置正确


/***/


TCAN4x5x_MCAN_TX_Header 接头={0};//请记住初始化为0、否则您将获得随机垃圾!
标头=标头;

header.ID = 0x0636;//设置 ID
header.DLC = MCAN_DLC_16B;//将 DLC 设置为等于或小于数据有效载荷(如果您的 DLC 是8个字节、则可以将64字节数据数组传递到 WriteTXFIFO 函数中、仅读取前8个字节)

header.FDF = 1;// CAN FD 帧被启用
header.BRS = 1;//位速率开关被启用
header.EFC = 0;
插头.mm = 0;
header.RTR = 0;
header.XTD = 0;//本示例中未使用扩展 ID
header.ESI = 0;//错误状态指示器

uint32 reg = 0;


while (1)

TCAN4x5x_MCAN_ReadInterrupts (&MCAN_IR);//读取中断寄存器
TCAN4x5x_MCAN_ClearInterruptsAll();

TCAN4x5x_MCAN_ReadInterrupts (&MCAN_IR);//读取中断寄存器
TCAN4x5x_MCAN_ReadInterruptEnable (&Int_Config);//读取中断寄存器并确保配置正确


PaloadData[0]=循环控制;
loopctrl ++;
DataNum = TCAN4x5x_MCAN_WriteTXBuffer (0、&HEADER、PaloadData);//此行会将数据和标头写入 TX FIFO 1
SendFlg = TCAN4x5x_MCAN_TransmitBufferContents (0);//请求发送 TX 缓冲区1


osDelay (1000);

是否存在任何错误,请   

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

    您好!

    如果以较低的数据速率运行、CAN FD 是否正常工作? 如果是、则可能存在与物理层信令相关的问题。  如果不是、则更可能是配置问题。  您是否能够在示波器上检查 CANH 和 CANL 信号、以确保它们符合预期? 而且、当通信不起作用时、您会检测到什么类型的错误?

    此致、

    最大

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Max  
    感谢您的帮助和回复  
    我们使用专业设备(我们称为 CANFD Box)接收 tcan4550的消息,但 无法接收。 并将 "NominalBitRatePrescaler"设置 为1000K 、"DataBitRatePrescaler" 设置为2000k
    所有程序都来自 TI 的演示、只是有一点不同。  我在 TDA3X 上工作了几天,从我的角度看  ,他们的 CANFD IP 非常相似,所以一些基本配置不会是错误的。  
     最令人困惑的是,如果我将框更改为标准模式,当我发送16字节时,框可以正确接收前8字节 , DLC 的值是0x0a,而不是0x08。
    请帮我检查最后一封电子邮件的程序,您能找到任何错误吗?
     此致、再次感谢  
    魏旭
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Wei、

    您能否提供配置之后 TCAN4550的实际寄存器值?  通过查看数据传输时的值、可以更轻松地检查配置并确定是否有任何位设置不正确。  由于我没有您的完整源代码、我必须对正在设置的位、在其默认配置中保留的位等进行一些假设、并且这一过程更加困难。

    请提供由微控制器配置的任何寄存器的值。 提供这些值后、我可以查看这些值、甚至可以根据需要尝试复制您的设置。

    此外、如果您的配置正确、读取中断和状态寄存器会很有帮助、以确定是否设置了任何错误或事件代码、以指示您遇到的问题的根源。  我认为最好首先验证器件配置、但如果也可以记录这些寄存器值、这些信息可能对我也很有帮助。

    此致、

    Jonathan Nerger