cs-gpios 极性反转问题
SPI片选的驱动有两种写法,cs-gpios和nss native, 但是Linux 内核主线在高版本有一个变更,通过 cs-gpios 分配的 GPIO 作为 CS)会被 gpiolib(GPIO 子系统)自动反转极性,这会导致CS被永久拉低。有些芯片如触屏AD采样TS2046,在通信时会关闭检测,被“锁定”在 SPI 通信模式,无法进入 power-down 状态(PD=00),从而 PENIRQ 的检测电路失效(Y- 不接 GND,按下屏无电流路径,无法拉低 PENIRQ)。
STM32的spi设备树绑定见: https://github.com/digi-embedded/linux/blob/v6.6/stm/dey-5.0/maint/Documentation/devicetree/bindings/spi/spi-controller.yaml 和 https://github.com/digi-embedded/linux/blob/v6.6/stm/dey-5.0/maint/Documentation/devicetree/bindings/spi/st%2Cstm32-spi.yaml
注意官方的原始定义中:
spi3_pins_a: spi3-0 {
pins1 {
pinmux = <STM32_PINMUX('B', 7, AF1)>, /* SPI3_SCK */
<STM32_PINMUX('B', 8, AF1)>; /* SPI3_MOSI Master output slave Input*/
drive-push-pull;
bias-disable;
slew-rate = <1>;
};
pins2 {
pinmux = <STM32_PINMUX('B', 10, AF1)>; /* SPI3_MISO */
bias-disable;
};
};
MOSI处理器需要drive-push-pull,并定义slew-rate,而输入则不需要。因为配置为推挽输出,使引脚在主动驱动时(无论是高电平还是低电平)都具有低阻抗和强驱动能力,确保信号边沿陡峭,适用于SCK、MOSI等主机输出信号。
几个问题: 1、Pinctrl配置 MISO被smartIOMX也配置成推挽输出,包括片选信号也放在MISO一组,这应该是错误的。需报告修正。
另外,片选信号可以是drive-push-pull,也可以不定义。原始cs-gpio是不定义的,因为原理图中有10K上拉,但原理图中把SCLK给下拉了,这适合从设备工作在CPOL=0的模式。
2、极性反转问题处理办法: 不可使用平台自带的NSS片选,这更容易出问题,原因是ST平台这个不稳定,参考:https://efton.sk/STM32/gotcha/g21.html 。 解决办法是把极性反转过来,只要原来是低电平使能的片选,在slave节点内配置一下“spi-cs-high; ”,这样就可以了