OrangePi3 LTS 驱动开发-读写W25Q32
kernel版本:orange-pi-5.10-media
5.1x版本,spi1默认是关闭的,需要在orangepiEnv.txt中添加overlays=spi-spidev1字样开启spi1。如果不添加,默认设置为开,需要更改dts中的配置。
1、修改sun50i-h6-orangepi-3-lts.dts文件
aliases {serial0 = &uart0;serial1 = &uart1;serial3 = &uart3;serial9 = &r_uart;i2c0 = &i2c0;spi1 = &spi1;ethernet0 = &emac;};&spi1{status = "okay";#address-cells = <1>;#size-cells = <0>;spidev@0 {compatible = "spidev";reg = <0x0>;spi-max-frequency = <10000000>;status = "okay";};
};
其实这个spidev的节点是内核给应用层的一种无驱动设备用的一种形式,跟iic一样,注册后在生成/dev/spidev1.0 这么个设备节点。WiringPi库中的spi操作,就是跟这个节点交互。
编译dts导入后会查看有无此节点。
手头正好有个w25q32的spi flash,接上线后用wiringPi验证下是否能正常通讯。
App代码如下,就获取一下spi的设备id,如果能返回,说明线没接错,spi通讯正常
#include "stdio.h"
#include "wiringPi.h"
#include "wiringPiSPI.h"
#include <string.h>
typedef unsigned char uint8_t;#define CMD_READ_UNIQUE_ID 0x4B
#define CMD_JEDEC_ID 0x9fvoid spcDump(char *id,int rc, uint8_t *data,int len) {int i;printf("[%s] = %d\n",id,rc);for(i=0;i<len;i++) {printf("%0x ",data[i]);if ( (i % 10) == 9) printf("\n");}printf("\n");
}void W25Q64_readManufacturer(int fd,uint8_t* d) {uint8_t data[4];int rc;memset(data,0,sizeof(data));data[0] = CMD_JEDEC_ID;rc = wiringPiSPIDataRW (fd,data,sizeof(data));spcDump("readManufacturer",rc,data,4);memcpy(d,&data[1],3);
}int main(int argc,char *argv[])
{int fd = 0;char data[4] = {0}fd = wiringPiSPISetup(1,1000 * 1000);W25Q64_readManufacturer(fd,data);return 0;
}