Infineon SLB 9670 TPM寄存器写入失败求助(ADSP-BF607平台)
问题分析与解决方案
额外问题解答
是的,操作码中第2-7位(规范中实际为Bit5~Bit0,见下文位定义修正)的传输大小,仅指后续要传输的字节总数:
- 读操作时:仅包含4字节地址
- 写操作时:包含4字节地址 + 数据字节数
不包含操作码本身的1字节。
核心错误点与修正方案
1. 操作码位定义完全理解错误
你混淆了比特位的编号顺序(高位/低位),这是导致写操作被识别为读操作的根本原因。根据PC Client Platform规范第7.4.6节,操作码字节的正确位定义为:
- Bit7(最高位):读/写标识(1=读,0=写)
- Bit6:保留位,必须设为0
- Bit5~Bit0(低6位):传输长度,即后续要传输的字节总数
你当前的操作码把最低位(Bit0)当成第1位,导致读写位、保留位、长度字段的位置全部错位。比如读操作中你用0b10000011,实际低6位是000011(十进制3),但后续传输了4字节地址,仅靠TPM的容错机制才成功;写操作时容错失效,TPM无法解析指令,默认按读操作处理。
2. 写操作的传输长度设置错误
你的写操作中,操作码0b00000011的低6位是3,但后续实际传输了4字节地址+4字节数据=8字节,长度完全不匹配,TPM无法识别为写操作。
3. 数据字节序错误
规范要求传输采用大端序(Big-Endian),即先传最高有效字节。TPM_STS寄存器的commandReady位在最低有效字节(地址0xFED40018)的Bit6,对应值0x40。你当前传的0x40, 0x00, 0x00, 0x00是小端序,会把0x40写到最高有效字节,而非目标位置,导致写入无效。
修正后的写操作示例代码
uint8_t TxData[] = { 0b00001000, // Bit7=0(写),Bit6=0(保留),低6位=8(后续8字节:4地址+4数据) 0xFE, 0xD4, // 地址高2字节(0xFED4) 0x00, 0x18, // 地址低2字节(0x0018),完整地址0xFED40018 0x00, 0x00, // 数据高2字节(无意义,保持0) 0x00, 0x40 // 数据低2字节,最低字节设为0x40(置位commandReady) };
额外排查建议
- 确认Blackfin的通信接口(SPI/I2C)是MSB优先传输比特位,符合TPM的要求;
- 写操作前检查TPM状态:确保
commandReady位已清零(TPM完成前序命令),否则置位操作可能无效; - 验证SLB9670的电源、复位时序是否符合 datasheet 要求,异常供电会导致TPM指令解析异常。
内容的提问来源于stack exchange,提问作者Lorenz
相关产品推荐
相关产品推荐

