Infineon SLB9670 TPM执行TPM_GETRANDOM时出现TPM_RC_COMMAND_SIZE错误
分析SLB9670 TPM SPI接口TPM_RC_COMMAND_SIZE错误的原因
从你提供的事务序列和错误码来看,TPM_RC_COMMAND_SIZE(0x0142)错误表明TPM接收到的命令帧大小不符合规范,以下是具体的可能原因及验证方向:
1. 命令帧的字节序不匹配
TPM 2.0规范要求命令帧的多字节字段(TAG、Command Size、Command Code、参数)采用大端字节序传输,但从你写入0x24(DATA_FIFO)的输入数据来看,存在明显的字节序错误:
- 你构造的命令帧是
0x80010000 000c0000 017b0010,拆分后Command Size字段为0x000c0000(对应十进制786432),这与实际命令总长度12字节(0x0000000c)完全不符。 - 正确的
Command Size字段应为大端的0x0000000c,对应字节序列是0x00 0x00 0x00 0x0c,而非你当前的0x00 0x0c 0x00 0x00。 - 这种错误会让TPM认为需要接收786432字节的命令数据,但实际仅收到12字节,直接触发大小校验错误。
2. SPI命令启动操作错误
SLB9670的命令执行需要通过STATUS寄存器(0x18)的SET_GO位触发,你的操作流程存在问题:
- 写完命令帧到DATA_FIFO后,你向0x18写入了
0x20(对应ACK_DATA_AVAILABLE位),但这并非启动命令的正确操作。 - 正确的步骤应该是向0x18写入
0x40(SET_GO位),通知TPM开始处理已写入FIFO的命令数据。 - 错误的启动操作可能导致TPM未完整解析命令帧,进而误判命令大小。
3. FIFO写入完整性问题
虽然你声明写入了12字节数据,但SPI传输过程中可能存在丢字节的情况:
- 检查写入DATA_FIFO时的MISO反馈,其中出现的
0x80可能是TPM的错误反馈,提示当前FIFO状态不允许写入。 - 写入前需确认STATUS寄存器的
TRANSMIT_FIFO_NOT_FULL位(Bit2)为1,确保每一字节都被正确写入FIFO。
修复建议
- 修正命令帧字节序:重新构造符合大端规范的TPM_GETRANDOM命令帧,正确的12字节序列应为:
0x80 0x01 0x00 0x00 0x00 0x0c 0x00 0x00 0x01 0x7b 0x00 0x10 - 调整命令启动流程:写完命令帧后,向STATUS寄存器(0x18)写入
0x40触发命令执行,而非0x20。 - 增加FIFO状态校验:每次写入DATA_FIFO前,读取STATUS寄存器确认
TRANSMIT_FIFO_NOT_FULL位为1,避免写入失败。
内容的提问来源于stack exchange,提问作者Bar K
相关产品推荐
相关产品推荐

