目录
- 项目场景:
-
- TJA1145引脚图
- 问题描述
-
- SPI链路验证
- 休眠唤醒
-
- 休眠唤醒配置
- 唤醒报文配置
- 代码
- 相关寄存器:
-
- 模式寄存器
- 使能CAN唤醒
- 设置唤醒边沿检测
- 事件状态及捕获寄存器
- CANFD报文不会被识别为有效的唤醒帧
项目场景:
最近开发过程中,选择了这颗芯片,踩了很多坑,总算是把这个芯片的休眠唤醒功能pass了,在这里做一个技术总结,希望可以帮到有需要的人!由于时间紧只关注了用到的部分,如有错误还请指正。
TJA1145引脚图
INH:JTA1145 唤醒输出引脚,用于控制开关电源芯片使能
SDO,SDI,SCK,SCSN:通过SPI读写TJA1145寄存器
参考SPI基础知识了解更多SPI知识
WAKE:TJA1145唤醒输入引脚,可配置唤醒信号边沿(上升沿,下降沿)
问题描述
SPI链路验证
TJA1145是通过SPI通信来配置相关寄存器的,所以首先要保证MCU和TJA1145之间的通信正常,这个可以通过读取设备ID来验证,时钟极性和时钟相位为:CPOL = 0 CPHA = 1
CLK空闲时刻为低电平,数据在下降沿采样
需要注意的是,读写数据时:地址字节的最低位:0为写,1为读。
写数据最低位为0
sendBuf[0] = (addr << 1U) | 0U;
sendBuf[1] = data;
读数据最低位为1
sendBuf[0] = (addr << 1U) | 1U;
sendBuf[1] = 0x00;
休眠唤醒
一般来说唤醒有KL15唤醒 和 CAN唤醒:
KL15唤醒:指钥匙点火(ACC)信号,输入高时给MCU供电
CAN唤醒:检测到唤醒报文时 INH引脚拉高,使能电源芯片给MCU供电
CAN唤醒即Normal模式和Sleep模式之间的切换,正常收发报文处于Normal模式,休眠时处于Sleep模式,由于INH引脚在Sleep模式时为低,所以在MCU属于休眠状态时TJA1145也需要在Sleep模式,以防止异常唤醒MCU
根据上图可以看出 Normal模式切换为Sleep模式需要满足三个条件:
1、MC = sleep
2、没有等待的唤醒事件
3、至少要有一个常规唤醒源
即 在切换到睡眠模式前,必须至少启用一个常规唤醒事件,并清除所有事件状态位
休眠唤醒配置
①CAN唤醒需要启用 Partial Networking
②使能CAN选择性唤醒 成功配置部分网络寄存器
③设置数据速率为500k
④配置帧控制寄存器:识别格式为标准帧,不关注数据字段长度和内容
⑤使能CAN唤醒检测、使能唤醒pin脚上升沿检测
⑥清除所有事件状态位
唤醒报文配置
①唤醒ID设置
TJA1145只能标准帧唤醒,所以用到地址0x29、0x2A
②设置唤醒ID为0x7A4
根据文档,0x29的bit7~bit2用来表示标准帧的bit5 ~bit0,
即0x29的bit7~bit2为100100,向0x29写入 100100 00(0x90)
根据文档,0x2A的bit4 ~bit0用来表示标准帧的bit10 ~bit6,
即0x2A的bit4~bit0为11110,向0x29写入 00011110(0x1E)
代码
uint8_t CanTrcv_119_TJA1145_ReadOneReg(uint8_t addr) {
status_t stdRet;
uint8_t sendBuf[2] = {
0};
uint8_t RxBuf[2] = {
0};
sendBuf[0] = (addr << 1U)