实际应用场景是,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改为输出高,退出低功耗后,第一个字节发送正确了。