器件型号: TCAN1145-Q1
尊敬的 TI 团队:
修改该逻辑后、我在局部联网/选择性唤醒测试期间观察到以下行为、我想交叉检查是否预计会出现此行为。
观察结果:
- 我配置了选择性唤醒设置、然后关闭电源。
- 打开电源、然后我从 CAN 总线传输了一个有效的 CAN 唤醒帧。
- 在这种情况下、当 I 发送有效帧时、INH 引脚变为高电平、RXD 引脚变为低电平、表明唤醒事件成功。
然后、我以不同的条件重复了测试:
- 再次关闭电源。
- Re 运行代码并发送了无效的 CAN 帧。
- 在这种情况下、INH 引脚保持低电平、RxD 引脚具有 3.3V。
基于这一观察、我的理解是:
- 配置的有效唤醒帧会正确触发 INH 引脚为高电平和 RXD 引脚为低电平。
- 无效帧不会触发唤醒、并使 INH 保持低电平、RXD 引脚保持高电平。
请确认这是否是局部联网/选择性唤醒操作的正确预期行为?
需要进一步澄清:
我还想了解为什么此流程中不额外需要以下寄存器/配置:
- 模式控制寄存器
- WAKE 引脚配置
- 引脚配置寄存器
目前、在没有明确配置这些寄存器的情况下、选择性唤醒似乎可以正常工作、因此我希望澄清:
- 这些寄存器是在内部默认为所需状态、还是
- 无论它们是否仅用于特定的用例/功能。
遵循的当前序列:
软件中实现的电流大致为:
void TCAN_operationDeviceMode (void)
{
uint8_t reg;
initQSPI_TCAN1145();
tcn_Init();/*在这里我已经为待机设置了配置*/
/*************** 添加了仅用于唤醒帧************** /
/*启用选择性唤醒*/
TCAN_WriteReg (TCAN_REG_INT_ENABLE_1、(1 << 6));//使能位 6 (CANINT)
/*配置唤醒过滤器*/
//与 MODE 相关 (0x11、0x12)--
TCAN_WriteReg (TCAN_WAKE_PIN_CONFIG、0x00);//禁用 0xFFWAKE 引脚/默认值
TCAN_WriteReg (TCAN_REG_PIN_CONFIG、0x00);//0x1c RXD/nINT 默认值
// WUF 过滤器--
TCAN_ConfigWakeUpFilter (0x123、TCAN1145_ID_11BIT、0xFF、NULL、FALSE);
//帧检测(强制)--
TCAN_WriteReg (0x44、0xDC);//0xDC
TCAN_WriteReg (0x45、0x00);
TCAN_WriteReg (0x46、0x1F);//阈值
/*提交 SWCFG */
TCAN_WriteReg (0x47、0x80);
/*清除位*/
TCAN_WriteReg (TCAN_REG_INT_1、0xFF);//清除 INT_1 (0x51) 中的所有位
TCAN_WriteReg (TCAN_REG_INT_2、0xFF);//清除 INT_2 (0x52) 中的所有位
TCAN_WriteReg (TCAN_REG_INT_3、0xFF);//清除 INT_3 (0x53) 中的所有位
TCAN_WriteReg (TCAN_REG_INT_GLOBAL、0xFF);
/*现在进入睡眠*/
TCAN_EnterSelectiveWakeSleepMode ();
/*等待*/
delay_sec (0.01f);
}
void TCAN_ConfigWakeUpFilter (uint32_t can_id、uint8_t id_len、uint8_t DLC、uint8_t * data_pattern、bool mask_enable)
{
int i;
uint8_t WUF_cfg = 0x00;
if (id_len = TCAN1145_ID_11BIT)
{
uint8_t SW_ID3;
uint8_t SW_ID4;
SW_ID3 =(uint8_t)((can_id >> 6)& 0x1F);
SW_ID4 =(uint8_t)((can_id << 2)& 0xFC);
TCAN_WriteReg (TCAN_REG_SW_ID1、0x00);
TCAN_WriteReg (TCAN_REG_SW_ID2、0x00);
TCAN_WriteReg (TCAN_REG_SW_ID3、SW_ID3);
TCAN_WriteReg (TCAN_REG_SW_ID4、SW_ID4);
}
暴露
{
uint8_t ID3 =(can_id >> 16)& 0xFF;
ID3 |=(1 << 5);
TCAN_WriteReg (TCAN_REG_SW_ID1、(CAN_id >> 0)& 0xFF);
TCAN_WriteReg (TCAN_REG_SW_ID2、(CAN_id >> 8)& 0xFF);
TCAN_WriteReg (TCAN_REG_SW_ID3、ID3);
TCAN_WriteReg (TCAN_REG_SW_ID4、(CAN_id >> 24)& 0xFF);
}
uint16_t std_MASK = 0x000;//完全匹配
uint8_t mask4;
uint8_t MASK_DLC_BITS;
mask4 =(std_MASK >> 3)& 0xFF;
MASK_DLC_BITS =(std_MASK << 5) 且 0xE0;
TCAN_WriteReg (TCAN_REG_SW_ID_MASK1、0x00);
TCAN_WriteReg (TCAN_REG_SW_ID_MASK2、0x00);
TCAN_WriteReg (TCAN_REG_SW_ID_MASK3、0x00);
TCAN_WriteReg (TCAN_REG_SW_ID_MASK4、mask4);
WUF_cfg |= MASK_DLC_bits;
if (DLC != 0xFF)
{
WUF_Cfg |=((DLC 和 0x0F)<< 1);
}
if (MASK_ENABLE && DATA_PATTERN!= NULL)
{
WUF_Cfg |= 0x01;
}
TCAN_WriteReg (TCAN_REG_SW_ID_MASK_DLC、WUF);
if (MASK_ENABLE && DATA_PATTERN!= NULL)
{
对于 (I = 0;I < 8;I++)
{
TCAN_WriteReg (TCAN_REG_DATA0 + I、DATA_PATTERN[i]);
}
}
}
您是否还可以回顾一下、对于局部联网实施、此整体顺序是否正确?
此致、
Anil Kumar