我将编写一个基于 I2C 通信的定制引导加载程序。 我的引导加载程序代码位于最后一个闪存页中、并擦除所有其他闪存页。 由于许多 TI 驱动程序函数也使用闪存中的某些器件、因此我无法使用它们。 但我可以使用 ROM 函数和寄存器访问、我会擦除例如闪存页。
FlashSectorErasePonter_t FuncPointer =(uint32_t (*)(uint32_t))(ROM_API_FLASH_TABLE [5]); uint32_t result = FuncPointer (PageAddress);
我意识到、当我调用此函数时、下一个 I2C 帧只会产生一个启动中断。 此时未接收到预期的数据和停止中断。 当不调用 ROM 函数时、即使用延迟替换也不会导致问题。 由于引导加载程序在执行一条命令后无需进行 I2C 通信、因此我不使用中断例程。 我轮询状态寄存器:
uint32_t IntReg = HWREG (I2C0_BASE + I2C_O_SMIS); if (内部注册!= 0) { uint32_t StatusReg = HWREG (I2C0_BASE + I2C_O_SSTAT); HWREG (I2C0_BASE + I2C_O_SICR)= I2C_SRI_STOPRIS + I2C_SRI_STARTRIS + I2C_SRI_DATARIS; IF (内部稳压器和 I2C_SMS_STARTMIS) { //接收到启动中断。 因此启用了数据和停止中断 HWREG (I2C0_BASE + I2C_O_SIMR)|= I2C_SIMR_STOPIM + I2C_SIMR_DATAIM; } 否则、IF (IntReg 和 I2C_SMI_STOPMIS) { //接收到停止中断。 不再使用数据和停止中断 HWREG (I2C0_BASE + I2C_O_SIMR)= I2C_SIMR_STARTIM; } 否则(内部稳压器和 I2C_SMI_DATAMIS) { //数据中断接收 IF (StatusReg & I2C_SSTAT_TREQ) { //主设备要读取数据。 发送一个字节 HWREG (I2C0_BASE + I2C_O_SDR)= 0xFF; } 否则、IF (StatusReg & I2C_SSTAT_RREQ) { //主设备已写入数据。 阅读 uint8_t aByte = HWREG (I2C0_BASE + I2C_O_SDR); } }
我应该提到 CC1352是 I2C 从设备。 此外、我的所有跟踪逻辑和对数据的处理都将从上面的源代码列表中删除。 从跟踪中、我看到(如上所述)数据中断不起作用。 我很确定师父真的想制作一个正确的画面。 但是、我不能仅检测起始条件、而检测不到数据条件。 还是我错了?
此致
Erwin