在相关帖子中发现启用 CS 并更改 SSI 模式的问题后、我确信我知道如何解决该问题。 想象一下,即使在调用 SSIConfigSetExpClk()之后才激活片选,损坏传输的问题仍然存在,我还是感到惊讶! 我发现了一些有趣的东西、并想分享我的发现、以防以后他人可能会有所帮助。
以下代码将导致与器件 A 的第二次通信会话的0xB0被破坏为0x58、0x00事务:
uint32_t dummy = 0;
//***** 器件 A 写入
SSIDisable (SSI3_base);
SSIConfigSetExpClk (SSI3_base、getSystemClockFreqHz ()、
SSI_FRF_MOTO_MODE_3、
SSI_MODE_MASTER、
2000000L、
8);
GPIOPinWrite (LCD_CSn_PORT、LCD_CSn_PIN、0);//芯片选择低电平
SSIEnable (SSI3_base);
SSIDataPutNonBlocking (SSI3_base、0xB0);
SSIDataGet (SSI3_base、&dummy);
//确保 Rx FIFO 为空
while (0!= SSIDataGetNonBlocking (SSI3_base、&dummy))
{
}
GPIOPinWrite (LCD_CSn_PORT、LCD_CSn_PIN、LCD_CSn_PIN);//芯片选择高电平
//***** 器件 B 写入
SSIDisable (SSI3_base);
SSIConfigSetExpClk (SSI3_base、getSystemClockFreqHz ()、
SSI_FRF_MOTO_MODE_0、
SSI_MODE_MASTER、
500000L、
16);
GPIOPinWrite (AM_CSn_PORT、AM_CSn_PIN、0);//芯片选择低电平
SSIEnable (SSI3_base);
SSIDataPutNonBlocking (SSI3_base、0x1234);
SSIDataGet (SSI3_base、&dummy);
//确保 Rx FIFO 为空
while (0!= SSIDataGetNonBlocking (SSI3_base、&dummy))
{
}
GPIOPinWrite (AM_CSn_PORT、AM_CSn_PIN、AM_CSn_PIN);//芯片选择高电平
//***** 器件 A 写入
SSIDisable (SSI3_base);
SSIConfigSetExpClk (SSI3_base、getSystemClockFreqHz ()、
SSI_FRF_MOTO_MODE_3、
SSI_MODE_MASTER、
2000000L、
8);
GPIOPinWrite (LCD_CSn_PORT、LCD_CSn_PIN、0);//芯片选择低电平
SSIEnable (SSI3_base);
SSIDataPutNonBlocking (SSI3_base、0xB0);
SSIDataGet (SSI3_base、&dummy);
//确保 Rx FIFO 为空
while (0!= SSIDataGetNonBlocking (SSI3_base、&dummy))
{
}
GPIOPinWrite (LCD_CSn_PORT、LCD_CSn_PIN、LCD_CSn_PIN);//芯片选择高电平}
原因是,正如您从下面的逻辑分析器屏幕截图中看到的,当调用 SSIConfigSetExpClk()将模式从0更改为3时,时钟信号极性实际上不会改变,直到调用 SSIEnable(),也就是我的示例是在 CS 被置为有效之后。
但是、如果我在 CS 置为有效之前启用 SSI 来略微更改代码、则在芯片选择变为低电平之前、时钟极性会切换、并且事务看起来正常:
回想一下、对 SSI 配置的更改在外设重新启用之前不会变为有效、这是非常有意义的。 但是,当深入尝试使代码正常工作的过程时,这并不是立即显而易见的--至少对我来说!
此致、
Dave