LoRa 无线对讲机-按键2-解决按键唤醒屏幕bug

实际应用场景是,7个按键,无论按哪个按键,按下就可以唤醒屏幕

出现了bug, 发现进入低功耗后,按键无法唤醒屏幕

用逻辑分析仪抓了一下数据,发现DIN 和 CLK 都是低电平。

看GPIOB3,GPIOB5的moder寄存器,发现

是 输出模式。明明退出低功耗后,设置成spi模式了呀。咋还是输出模式?

原因:在低功耗的时候,为了减少功耗,将DIN,CLK设置为输出低。

在退出低功耗后,虽然执行了void MX_SPI3_Init(void),但是因为hspi->State != HAL_SPI_STATE_RESET,所以没有执行HAL_SPI_MspInit(hspi);也就是没有对io重新设置为SPI模拟功能。

为什么hspi->State != HAL_SPI_STATE_RESET,因为在进入功耗的时候,我在调试时候,一不小心注释了 spi的关闭函数,hspi->State=HAL_SPI_STATE_READY。

特别注意:

进入低功耗时,关闭spi ,执行HAL_SPI_DeInit(&hspi3);

退出低功耗是,打开spi, 执行MX_SPI3_Init();

按这个改后,退出低功耗后,可以抓到数据,但是第一个字节总是错。提示如下:

18.5273998200,5,The initial (idle) state of the CLK line does not match the settings,

原因是,低功耗时,我设置CLK为低,但是在正常工作时,我们设置spi的模式是:

hspi3.Init.CLKPolarity = SPI_POLARITY_HIGH;

hspi3.Init.CLKPhase = SPI_PHASE_2EDGE;

问题出在 SPI 空闲电平(CPOL)在唤醒瞬间不对,导致 第一个字节采样错位。

CLK应该是高。

将低功耗时候,CLK改为输出高,退出低功耗后,第一个字节发送正确了。