本帖最后由 七呀嘛七 于 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;
}
希望各位大神帮忙看看问题出在哪里。
|