确认spi是否启用:ls spi*
1、如有对应的文件:spidev0.0、spidev0.1,说明spi已启用。
2、如无对应文件,需运行:raspi-config,在内核启用spi。
3、确认内核已加载模块spidev:lsmod | grep spidev
实例xwsheng:树莓派之SPI显示屏zhuanlan.zhihu.com
需要包含的头文件
#include
#include
#include
#include
#include
open:打开设备
int open(const char *path, int flags,mode_t mode)
path:文件或设备名
flags:
必选:O_RDONLY/O_WRONLY/O_RDWR
可选:O_APPEND,追加模式。
O_CREAT,如文件不存在,则建立文件。
O_EXCL,如创建文件已存在,返回错误值-1。
O_TRUNC,如以只写或读写方式打开文件,则清空文件内容。
O_NOCTTY,如果路径名指向终端设备,不要把这个设备用作控制终端。
O_NONBLOCK,如果路径名指向 FIFO/块文件/字符文件,则把文件的打开和后继 I/O设置为
非阻塞模式
mode:设置文件访问权限的初始值。当flags有O_CREAT操作时有效。
如果open函数操作成功,将返回一个文件描述符,否则返回-1。
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字节读写方向:从低到高 or 从高到低
cmd:SPI_IOC_RD_LSB_FIRST / SPI_IOC_WR_LSB_FIRST
arg:uint32_t *mode = SPI_LSB_FIRST
eg:
ioctl(fd, SPI_IOC_RD_LSB_FIRST, &mode);
ioctl(fd, SPI_IOC_WR_LSB_FIRST, &mode);
C、设置或读写SPI每字节读写的位数
cmd:SPI_IOC_RD_BITS_PER_WORD / SPI_IOC_WR_BITS_PER_WORD
arg:uint8_t bits = 8;
eg:
ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &