引自免费微信小程序:皆我百晓生
在您的问题中,您提到使用英飞凌TC387通过MCAL配置TJA1145(一个CAN收发器)的Mode Control寄存器为Normal模式,并尝试唤醒它,但未能成功,并且SPI读取的数据也有问题。从您提供的代码片段来看,似乎是在通过QSPI接口与TJA1145进行通信以修改其内部寄存器。
为了更准确地解决您的问题,请注意以下几点:
-
初始化和配置:
- 确保QSPI接口已经正确初始化并配置了合适的时钟源、频率、极性和相位等参数。
- TJA1145的SPI模式控制可能需要特定的命令序列或特殊寄存器地址来进入配置模式,然后才能写入Mode Control寄存器。
-
地址确认:
- 根据TJA1145的数据手册检查Mode Control寄存器的地址是否正确。在您给出的代码中,
MCAddr_Buffer[0]
和 MCAddr_Buffer[1]
应该组合成正确的寄存器地址。
-
数据有效性:
- 正确设置要写入Mode Control寄存器以激活Normal模式的值,确保这个值符合TJA1145的数据手册规定。
-
SPI通信流程:
- 您应该首先发送一个使能写操作的命令字节,然后再发送Mode Control寄存器地址和相应的数据。
- 在执行
Spi_WriteIB
之后,确实需要等待传输完成,但请检查Spi_SyncTransmit
函数的参数是否正确指定了整个SPI事务(包括命令、地址和数据)。
-
错误处理:
- 验证SPI传输完成后获取的结果状态,确保
Spi_GetSequenceResult
和Spi_GetJobResult
都返回预期的状态。
-
读回验证:
- 写操作后立即读取Mode Control寄存器以确认写入值是否生效,需要注意的是,读操作可能需要不同的SPI事务序列。
由于没有提供完整的上下文环境和相关库函数的具体实现,无法直接给出修复问题的完整代码。但我建议您按照上述步骤排查,并参考TJA1145的数据手册来确定SPI通信的正确过程。
例如,SPI通信可能需要如下格式的序列(假设相应函数调用存在):
// 正确初始化QSPI并配置好SPI工作模式
// 进入配置模式或选择寄存器
uint8 configCmdBuffer[1] = {CONFIGURATION_COMMAND_BYTE}; // 请替换为实际的配置命令
Spi_WriteIB(SpiConf_SpiChannel_SpiChannel_0, configCmdBuffer);
// 确保写入命令完成
// 写入Mode Control寄存器
uint8 MCControlRegValue = NORMAL_MODE_VALUE; // 替换为正常模式的十六进制值
MCAddr_Buffer[0] = MODE_CONTROL_REG_ADDR_LSB;
MCAddr_Buffer[1] = MODE_CONTROL_REG_ADDR_MSB;
Spi_WriteIB(SpiConf_SpiChannel_SpiChannel_0, (uint8 *) &MCAddr_Buffer[0]);
Spi_TransmitDataByte(SpiConf_SpiChannel_SpiChannel_0, MCControlRegValue);
// 等待写操作完成
while(/* ... */)
{
// ...
}
// 读回Mode Control寄存器验证
readCmdBuffer[0] = READ_COMMAND_BYTE; // 替换为实际的读命令
Spi_WriteIB(SpiConf_SpiChannel_SpiChannel_0, readCmdBuffer);
Spi_ReadIB(SpiConf_SpiChannel_SpiChannel_0, (uint8 *) & Addr_Buffer[0]);
// 检查Addr_Buffer中的值是否与写入的正常模式值相符
请务必查阅具体的芯片数据手册以及MCAL库文档以获得正确的命令和操作顺序。