一句话
SA47301 的 SPI 是 16 位定长帧:1 位读写命令 + 6 位地址 + 8 位数据 + 1 位奇偶校验。格式错、位数错、校验错都会被抓住并报中断——车规芯片连通信都要防比特翻转。

帧结构
SDI(MCU→芯片): [CMD][A5~A0][D7~D0][T]
SDO(芯片→MCU): [ 1 ][S5~S0][D7~D0][T]
- CMD:0=读,1=写
- A5~A0:寄存器地址(0x00~0x3F)
- D7~D0:数据(读命令时建议填 0)
- T(奇偶位):对自己那 15 位里「1 的个数」做偶校验——1 的个数为奇则 T=1,否则 T=0
- 采样规则:SCL 上升沿采样、下降沿翻转;SCS 拉低选中、拉高结束

写操作回环
写命令时,SDI 收到的内容会原样从 SDO 回读出来——MCU 可以借此实时校验「芯片到底收到了什么」。
三种 SPI 错误(都会置标志 + 报中断)
- 帧超时:SCS 拉低超过 tSPI_fl——写数据作废
- 时钟数错误:一帧不是 16 个 SCL 周期——写数据作废
- 奇偶校验错:T 位对不上——写数据作废
铁律
所有三类错误都只「拒收」而不「执行一半」——写操作要么完整生效要么完全忽略,不存在写错一个 bit 的中间态。这是功能安全通信设计的基本要求。
SLEEP 态注意
SLEEP 下 SPI 仍可通信(用于唤醒后交互),但最大时钟频率降低——驱动里要按状态切换 SPI 速率。
自测一下
要写寄存器 0x17=0x01,CMD=1,地址 0x17=0010111,数据 00000001。这 15 位里 1 的个数是多少?奇偶位 T 应该填几?
答案:CMD 1 个 + 地址 4 个 + 数据 1 个 = 6 个「1」,偶数 → T=0。若算出来是奇数则 T=1,保证全帧 16 位中 1 的个数为偶数。