一. 简介
前面文章介绍了SPI设备数据收发处理流程,后面几篇文章实现了SPI设备驱动框架,加入了字符设备驱动框架代码。文章如下:
SPI 设备驱动编写流程:SPI 设备数据收发处理流程中涉及的结构体与函数-CSDN博客
SPI 设备驱动编写流程:SPI 设备数据收发处理流程-CSDN博客
Linux下SPI设备驱动实验:SPI设备驱动框架编写-CSDN博客
Linux下SPI设备驱动实验:向SPI驱动框架中加入字符设备驱动框架代码-CSDN博客
本文在此基础上,编写向SPI设备发送数据的函数,从SPI设备接收数据的函数。
二. Linux下SPI设备驱动实验:实现SPI发送/接收数据的函数
1. 读写SPI设备中数据的实现思路
向SPI设备中发送数据,从SPI设备接收数据的实现,需要使用内核提供的结构体与 API函数。
涉及的结构体为 spi_transfer 与spi_message。
涉及的API函数如下:
void spi_message_init(struct spi_message *m) //初始化spi_message
//添加spi_transfer到spi_message队列中
void spi_message_add_tail(struct spi_transfer *t, struct spi_message *m)
//同步传输数据
int spi_sync(struct spi_device *spi, struct spi_message *message)
//异步传输数据
int spi_async(struct spi_device *spi, struct spi_message *message)
实现思路
(1) 构造spi_transfer结构体,初始化 spi_message结构体(使用spi_message_init 函数来初始化spi_message)。
(2) 将spi_transfer 添加到 spi_message队列中,使用 spi_message_add_tail函数。
(3) 进行数据传输(调用 spi_sync 或者 spi_async函数)。
三. 向SPI驱动框架中添加读写SPI设备中数据的函数
通过阅读 ICM20608数据手册可知,如下信息:
可以看出,第一字节为SPI设备地址,后面的多个字节为SPI数据。而第一个字节中第一位为读/写标志位,后面七位为SPI设备地址。
打开 18_spi工程,icm20608.c文件中添加 读/写SPI设备中数据的函数后,内容如下:
编译驱动
对上面驱动代码进行模块化编译:
可以看出,驱动模块正常编译通过。
接下来读取SPI设备中数据,即读取 ICM20608设备中的数据。