打印
[STM32MP1]

使用stm32mp157进行软件模式spi通讯,无法设置为四线模式

[复制链接]
220|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
七呀嘛七|  楼主 | 2024-9-18 10:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 七呀嘛七 于 2024-9-18 10:10 编辑

目前使用stm32mp157芯片进行软件模式的spi通讯,设备树内对使用的gpio口定义如下:
        gpio_spi1: spi@1 {
                    compatible = "spi-gpio";
                    #address-cells = <1>;
                    #size-cells = <0>;
                    status = "okay";

                    sck-gpios   = <&gpiod 8 0>;
                    mosi-gpios  = <&gpioh 15 0>;
                    miso-gpios  = <&gpioi 4 0>;
                    cs-gpios    = <&gpioi 0 0>, <&gpioe 6 0>;// drv:i0 dac:e6

                    num-chipselects = <2>;
                    /* Clients */
                    spidev@0 {
                        reg = <0>;
                        compatible = "linux,spidev";
                        spi-max-frequency = <200000>;
                    };

                    spidev@1 {
                        reg = <1>;
                        compatible = "linux,spidev";
                        spi-max-frequency = <200000>;
                    };
        };

在使用read或 ioctl函数,通过miso线进行读取时,发现读取到的都是mosi线的数据,也就是运行在三线模式。尝试使用ioctl(fd, SPI_IOC_WR_MODE, &mode)关闭三线模式,但没有产生效果。程序中spi读取的相关代码如下:

int myspi2_write_then_read(int fd, const uint8_t* tx_buf, size_t len_tx, uint8_t* rx_buf, size_t len_rx) {
    struct spi_ioc_transfer transfer[2];  // 两个传输结构,一个用于写入,一个用于读取
    memset(transfer, 0, sizeof(transfer));  // 清空结构体
    // 第一个传输,用于写入
    transfer[0].tx_buf = (unsigned long)tx_buf;  // 发送缓冲区
    transfer[0].rx_buf = 0;                      // 不接收数据
    transfer[0].len = len_tx;                    // 写入数据长度
    transfer[0].speed_hz = 0;                    // 使用当前 SPI 设备的默认速度
    transfer[0].cs_change = 0;                   // 在结束时不改变片选状态
    // 第二个传输,用于读取
    transfer[1].tx_buf = 0;                      // 不发送数据
    transfer[1].rx_buf = (unsigned long)rx_buf;  // 接收缓冲区
    transfer[1].len = len_rx;                    // 读取数据长度
    transfer[1].speed_hz = 0;                    // 使用当前 SPI 设备的默认速度
    transfer[1].cs_change = 0;                   // 完成读写后释放片选
    // 使用 ioctl 进行双向传输(写入+读取)
    int ret = ioctl(fd, SPI_IOC_MESSAGE(2), transfer);
    printf("Wrote %zu bytes and read %zu bytes from SPI\n", len_tx, len_rx);
    return 0;
}


int spi_read(int fd, int read_length) {
    uint8_t buf[read_length];
    ssize_t ret = read(fd, buf, sizeof(buf));
    printf("Read from SPI: ");
    for (int i = 0; i < ret; i++) {
        printf("0x%02X ", buf);
    }
    printf("\n");
    return 0;
}

希望各位大神帮忙看看问题出在哪里。




使用特权

评论回复
沙发
elephant00| | 2024-9-19 10:16 | 只看该作者
如果SPI无法满足你的需求,考虑使用其他通信协议,如I2C、UART或USB

使用特权

评论回复
板凳
两只袜子| | 2024-9-19 10:59 | 只看该作者
你可以使用STM32MP157的硬件SPI来处理标准的SPI通信,同时使用软件SPI(即GPIO模拟)来处理额外的信号线。

使用特权

评论回复
地板
jcky001| | 2024-9-19 14:00 | 只看该作者
如果STM32MP157的SPI硬件接口不支持你需要的特定模式,你可以考虑使用软件来模拟SPI通信,包括任何额外的信号线。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝