-
软件模式spi的无法更改通讯速率
使用芯片为stm32mp157,目前尝试更改设备树文件中spi-max-frequency参数,以及在用户空间程序中使用(ioctl(fd,SPI_IOC_WR_MAX_SPEED_HZ,&speed_hz)进行spi通讯速度的修改。无论将频率调高或调低,都未能生效。目前时钟频率被固定在125kHz,请问要如何才能调整这个软件模式spi的时钟频率?设备树节点定义如下gpio_spi_drv_dac:spi@1{compatible="spi-gpio";#address-cells=;#size-cells=;status="okay";sck-gpios=;mosi-gpios=;miso-gpios=;cs-gpios=;num-chipselects=;/*Clients*/spidev@0{reg=;compatible="linux,spidev";spi-max-frequency=;};};用户空间程序中配置spi速率函数如下:intset_spi_speed(intfd,unsignedintspeed_hz){if(ioctl(fd,SPI_IOC_WR_MAX_SPEED_HZ,&speed_hz)<0){perror("FailedtosetSPIspeed");returnerrno;}return0;}
2024-10-14 1 -
使用stm32mp157进行软件模式spi通讯,无法设置为四线模式
本帖最后由七呀嘛七于2024-9-1810:10编辑目前使用stm32mp157芯片进行软件模式的spi通讯,设备树内对使用的gpio口定义如下:gpio_spi1:spi@1{compatible="spi-gpio";#address-cells=;#size-cells=;status="okay";sck-gpios=;mosi-gpios=;miso-gpios=;cs-gpios=,;//drv:i0dac:e6num-chipselects=;/*Clients*/spidev@0{reg=;compatible="linux,spidev";spi-max-frequency=;};spidev@1{reg=;compatible="linux,spidev";spi-max-frequency=;};};在使用read或ioctl函数,通过miso线进行读取时,发现读取到的都是mosi线的数据,也就是运行在三线模式。尝试使用ioctl(fd,SPI_IOC_WR_MODE,&mode)关闭三线模式,但没有产生效果。程序中spi读取的相关代码如下:intmyspi2_write_then_read(intfd,constuint8_t*tx_buf,size_tlen_tx,uint8_t*rx_buf,size_tlen_rx){structspi_ioc_transfertransfer[2];//两个传输结构,一个用于写入,一个用于读取memset(transfer,0,sizeof(transfer));//清空结构体//第一个传输,用于写入transfer[0].tx_buf=(unsignedlong)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=(unsignedlong)rx_buf;//接收缓冲区transfer[1].len=len_rx;//读取数据长度transfer[1].speed_hz=0;//使用当前SPI设备的默认速度transfer[1].cs_change=0;//完成读写后释放片选//使用ioctl进行双向传输(写入+读取)intret=ioctl(fd,SPI_IOC_MESSAGE(2),transfer);printf("Wrote%zubytesandread%zubytesfromSPI\n",len_tx,len_rx);return0;}intspi_read(intfd,intread_length){uint8_tbuf[read_length];ssize_tret=read(fd,buf,sizeof(buf));printf("ReadfromSPI:");for(inti=0;i<ret;i++){printf(
2024-09-18 8