最近遇见一个问题,AM5728的SPI作为主模式,用示波器检测CLK,MISO,MOSI信号都正常,特别是MISO的回读数据在示波器上也正确,但是利用linux内核的spi_write_then_read函数发送命令时,回读数据rxbuf一直是0,有人遇到过这种情况么?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
看下管教的pinmux配置,是否有吧receive的enable状态打开?
SPI的配置部分也一样查一下。
你好,我之前也想过是不是配置的问题,但是在devicetree的配额我感觉应该没啥问题。
devicetree中pinmux的配置代码如下:
...
touch_pins: pinmux_touch_pins {
pinctrl-single,pins = <
0x3A4 (PIN_OUTPUT | MUX_MODE0) /* SPI1_SCLK ==> SPI1_SCLK.spi1_sclk */
0x3A8 (PIN_INPUT | MUX_MODE0) /* SPI1_MISO ==> SPI1_D1.spi1_d1 */
0x3AC (PIN_OUTPUT | MUX_MODE0) /* SPI1_MOSI ==> SPI1_D0.spi1_d0 */
0x3B0 (PIN_OUTPUT | MUX_MODE0) /* SPI1_CS0 ==> SPI1_CS0.spi1_cs0 */
>;
};
...
其中MISO设置为INPUT,spi模式
spi的部分如下:
...
&mcspi1 {
status = "okay";
spi-max-frequency = <200000>;
spi-tx-bus-width = <1>;
spi-rx-bus-width = <4>;
ti,pindir-d0-out-d1-in;
...
其中也设置了 ti,pindir-d0-out-d1-in;
除了这些,还有别的需要配置的地方么?
顺便说下,因为我用的基本都是linux自带内核模块和函数,而且MOSI引脚都没什么问题,所以就感觉很奇怪。
问题解决了,将SPI1_SCLK改为INPUT即可,代码如下:
ouch_pins: pinmux_touch_pins {
pinctrl-single,pins = <
0x3A4 (PIN_INPUT | MUX_MODE0) /* SPI1_SCLK ==> SPI1_SCLK.spi1_sclk */
0x3A8 (PIN_INPUT | MUX_MODE0) /* SPI1_MISO ==> SPI1_D1.spi1_d1 */
0x3AC (PIN_OUTPUT | MUX_MODE0) /* SPI1_MOSI ==> SPI1_D0.spi1_d0 */
0x3B0 (PIN_OUTPUT | MUX_MODE0) /* SPI1_CS0 ==> SPI1_CS0.spi1_cs0 */
>;
};
但是,这是为什么?当SPI引脚设置为MUX_MODE0,即spi模式时,其PIN_INPUT和PIN_OUTPUT理论上是否起作用?
如果起作用,SPI1_SCLK也应该够是PIN_OUTPUT,而不是PIN_INPUT,出现这种情况的可能原因是什么?