问答

汇集网友智慧,解决技术难题

21ic问答首页 - TAG - SPI通讯
  • 使用stm32mp157进行软件模式spi通讯,无法设置为四线模式 赏3000家园币

    [i=s] 本帖最后由 七呀嘛七 于 2024-9-18 10:10 编辑 [/i] 目前使用stm32mp157芯片进行软件模式的spi通讯,设备树内对使用的gpio口定义如下: gpio_spi1: spi[url=home.php?mod=space&uid=2514798]@1[/url] { 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[url=home.php?mod=space&uid=2514928]@0[/url] { reg = <0>; compatible = "linux,spidev"; spi-max-frequency = <200000>; }; spidev[url=home.php?mod=space&uid=2514798]@1[/url] { 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[i]); } printf("\n"); return 0; } 希望各位大神帮忙看看问题出在哪里。 [/i]

    stm32mp157 使用 SPI通讯 嵌入式 单片机 MUC

    5435浏览量 8回复量 关注量