![2eccc8d1d2e38cbced27ac8394fdceb6.png](https://img-blog.csdnimg.cn/img_convert/2eccc8d1d2e38cbced27ac8394fdceb6.png)
确认spi是否启用:ls spi*
1、如有对应的文件:spidev0.0、spidev0.1,说明spi已启用。
2、如无对应文件,需运行:raspi-config,在内核启用spi。
3、确认内核已加载模块spidev:lsmod | grep spidev
流程[1]
![3e0921eeaba0c3408e864c6e3c95a691.png](https://img-blog.csdnimg.cn/img_convert/3e0921eeaba0c3408e864c6e3c95a691.png)
实例[2]:
xwsheng:树莓派之SPI显示屏zhuanlan.zhihu.com![dbe140cb4104e67ecfba0de2e8c26317.png](https://img-blog.csdnimg.cn/img_convert/dbe140cb4104e67ecfba0de2e8c26317.png)
需要包含的头文件
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <linux/spi/spidev.h>
open:打开设备
int
IO Control:端口控制
int ioctl(int fd, int cmd, arg)
fd:文件句柄。
cmd:控制类型。
arg:类型参数,根据cmd可变长度和类型。
1、spi驱动数据结构
struct spi_device {
struct device dev;
struct spi_master *master;
u32 max_speed_hz; //通信时钟最大频率
u8 chip_select; //片选信号
u8 mode; //SPI设备的模式
u8 bits_per_word; //每个通信字的字长(比特数)
int irq; //使用到的中断
void *controller_state;
void *controller_data;
char modalias[32]; //设备驱动的名字
};
2、spidev驱动已定义参数(arg)
SPI_MODE_0 //SCLK空闲时为低电平,第一个时间沿采样
SPI_MODE_1 //SCLK空闲时为高电平,第一个时间沿采样
SPI_MODE_2 //SCLK空闲时为低电平,第二个时间沿采样
SPI_MODE_3 //SCLK空闲时为高电平,第二个时间沿采样
SPI_CS_HIGH //片选为高
SPI_LSB_FIRST //低位数据先传输
SPI_3WIRE //三线式,输入输出数据线为一条线
SPI_LOOP //回环模式
SPI_NO_CS //没有片选信号
3、常用端口参数设置
A、设置或读取SPI工作模式:
cmd:SPI_IOC_RD_MODE / SPI_IOC_WR_MODE
arg: uint32_t *mode
eg:
mode = mode | SPI_MODE_0 | SPI_LSB_FIRST | SPI_LOOP;
ioctl(fd, SPI_IOC_RD_MODE, &mode);
ioctl(fd, SPI_IOC_WR_MODE, &mode);
B、设置或读取SPI字节