Other Parts Discussed in Thread: TCAN4550
“线程: 测试”中讨论的其它部件
您好,
我已经设置了多个 CAN 节点,在这些节点上工作了一段时间,但经过一段时间后,其中一些节点停止接收。
在注意到 TCAN 接收到数据但未向 MCU 提供中断(GPIO2配置为向 MCU 提供中断)后,发现 TCAN 接收到数据。
以下是供参考的配置:
MCU 的 SPI 速度设置为6Mbps
/************************* TCAN 配置************** /
TCAN4x5x_Device_ClearSPIERR();//清除由于 MCU 启动期间 PIN mux 发生变化而可能设置的任何 SPI ERR 标志
/*步骤一尝试清除所有中断*/
TCAN4x5x_Device_Interrupt _Enable dev_ie ={0};//初始化为0至所有位均设置为0。
TCAN4x5x_Device_ConfigureInterruptEnable(&DED_IE);//为了简单起见,禁用所有与 MCAN 无关的中断
TCAN4x5x_Device_Interrupts dev_ir ={0};//设置新的 MCAN IR 对象以方便中断检查
TCAN4x5x_Device_ReadInterrupts (/dev/ir);//请求使用当前设备(非 MCAN)中断值更新结构
//printmsg("PWRON %x",dev_ir.PWRON);
如果(dev_ir.PWRON)//设置了“启动中断”标志
TCAN4x5x_Device_ClearInterrupts (/dev/ir);//清除它是因为如果它在~4分钟内未被清除,它将进入睡眠状态
/*配置 CAN 总线速度*/
TCAN4x5x_MCAN_NOMINAL_Timing_Simple TCANNomTiming ={0};// 40 MHz 晶体的500k 仲裁(((40E6 / 2)/(32 + 8)= 500E3)
TCANNomTiming.NominalBitRatePrescaler =2;
TCANNomTime.NominalTqBeforeSamplePoint =32;
TCANNomTime.NominalTqAfterSamplePoint =8;
TCAN4x5x_MCAN_Data_Timing_Simple TCANDataTiming ={0};//具有40 MHz 晶体的500kbps CAN FD (40E6 /(15 + 5)= 2E6)
TCANDataTiming.DataBitRatePrescaler =2;
TCANDataTime.DataTqBeforeSamplePoint =32;
TCANDataTiming.DataTqAfterSamplePoint =8;
/*配置 MCAN 核心设置*/
TCAN4x5x_MCAN_CCCR_Config cccrConfig ={0};//记得初始化到0,否则会出现随机垃圾!
cccrConfig.FDOE = 1;// CAN FD 模式启用
cccrConfig.BRSE = 1;// CAN FD 位速率开关启用
/*配置默认 CAN 数据包过滤设置*/
TCAN4x5x_MCAN_Global_Filter_Configuration GFC ={0};
GFC.RRFE = 1;//拒绝远程帧(TCAN4x5x 不支持此功能)
GFC.RRFS = 1;//拒绝远程帧(TCAN4x5x 不支持此功能)
GFC.ANFE = TCAN4x5x_GFC_reject;//如果传入消息与过滤器不匹配,默认行为是接受 RXFIO0接收扩展 ID 消息(29位 ID)
GFC.ANFS = TCAN4x5x_GFC_reject;//如果传入消息与过滤器不匹配,默认行为是接受标准 ID 消息的 RXFIO0 (11位 ID)
/*
*在下一个配置块中,我们将 MCAN 核心设置为:
*- 1 SID 滤芯
*- 1个 XID 过滤器滤芯
*- 5 RX FIFO 0元件
*- RX FIFO 0支持高达64字节的数据有效负载
*- RX FIFO 1和 RX 缓冲器不会有任何元素,但我们仍会设置它们的数据有效负载大小,即使这不是必需的
*-无发射事件 FIFO
*-2个传输缓冲区,支持多达64字节的数据负载
*
TCAN4x5x_MRAM_Config MRAMConfiguration ={0};
MRAMConfiguration.SIDNumElements = 1;//标准 ID 元素数,您必须为定义的每个元素都有一个写入 MRAM 的过滤器
MRAMConfiguration.XIDNumElements = 1;//扩展 ID 元素数,您必须为定义的每个元素编写一个过滤器到 MRAM
MRAMConfiguration.Rx0NumElement = 16;// RX0元素数
MRAMConfiguration.Rx0元素大小= MRAM_32_Byte 数据;// RX0数据有效负载大小
MRAMConfiguration.Rx1NumElements = 0;// RX1元素数
MRAMConfiguration.Rx1元素大小= MRAM_32_Byte_Data;// RX1数据有效负载大小
MRAMConfiguration.RxBufNumElements = 0;// RX 缓冲区元素数
MRAMConfiguration.RxBufElementSize = MRAM_32_Byte_Data;// RX 缓冲区数据有效负载大小
MRAMConfiguration.TxEventFIFO 元素= 0;// TX 事件 FIFO 元素数
MRAMConfiguration.TxBufferNumElements = 8;// TX 缓冲区元素数
MRAMConfiguration.TxBufferElementSize = MRAM_32_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_i.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_DUALID;// SFT:标准滤波器类型。 配置为经典过滤器
SID_ID.SFEC = TCAN4x5x_SID_SFEC_PRIORITYSTORERX0;//标准滤波器元件配置,将其作为优先信息存储在 RX fifo 0中
SID_ID.SFID1 =唯一 ID;// SFID1 (经典模式筛选器)
SID_ID.SFID2 = global_ID;// SFID2 (经典模式掩码)
TCAN4x5x_MCAN_WriteSIDFilter (0,&SID_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_action_nINT;//看门狗设置中断(默认)
devConfig.WD_bit_reset = 0;//不要重置看门狗
devConfig.nWKRQ_voltage = 0;//将 nWKRQ 设置为内部电压轨(默认)
devConfig.GPO2_config = TCAN4x5x_dev_config_GPO2_MCAN_INT0;// GPO2无行为(默认)
devConfig.CLK_REF = 1;//输入晶体为40 MHz 晶体(默认)
devConfig.wak_config = TCAN4x5x_dev_config_wak_both _edges;//唤醒引脚可由任一边缘触发(默认)
TCAN4x5x_Device_Configure (&devConfig);//使用上述配置配置配置设备
TCAN4x5x_Device_SetMode (TCAN4x5x_device_mode_normal);//配置完成后设置为正常模式。 这条线路将打开收发器
TCAN4x5x_MCAN_ClearInterruptsAll();//重置所有 MCAN 中断(不包括任何 SPIERR 中断)
/************************* TCAN 配置结束************** /
/******************** 接收 停止时注册值*************** /
状态注册0x000C:4000A
中断注册器0x0820:4AA
MCAN 接口注册器0x824:10101
错误计数注册器0x1040:b00000
协议状态注册器0x1044:25300f
中断注册器0x1050:10101
模式控制0x0800:c84004a0
Rx FIFO 0配置0x10A0:8010000c
RX FIFO 0状态0x10A4:3090a
/******************** 接收 停止后注册值***************** /
由于 RX_FIFO 寄存器正在接收数据,但对 MCU 的中断却没有生成级,所以我无法准确找到问题所在。
谢谢
蒂尔特拉伊·索兰基