一. 简介
前面一篇文章学习了SPI设备驱动数据收发过程中,涉及的结构体与函数,文章如下:
SPI 设备驱动编写流程:SPI 设备数据收发处理流程中涉及的结构体与函数-CSDN博客
本文学习SPI设备驱动中数据收发处理过程。
二. SPI 设备驱动编写流程:SPI 设备数据收发处理流程
1. SPI设备数据收发处理流程
经过上一篇文章的学习,总结 SPI数据传输过程如下:
(1) 首先,申请并初始化 spi_transfer结构体,设置 spi_transfer 的 tx_buf 成员变量,然后设置 rx_buf 成员变量最后设置 len 成员变量,,tx_buf 为要发送的数据,rx_buf 保存着接收到的数据。len为要进行数据通信的长度。
(2) 其次,调用 spi_message_init函数对spi_message进行初始化。
(3) 其次,使用spi_message_add_tail函数,将 spi_transfer结构体添加到 spi_message队列中。
(4) 最后,使用 spi_sync 函数完成 SPI 数据同步传输。
2. SPI设备数据传输示例代码
通过 SPI 进行 n 个字节的数据发送和接收的示例代码如下所示:
/*SPI进行多字节发送*/
static int spi_send(struct spi_device* spi_dev, u8* buf, int len)
{int ret = 0;struct spi_message spi_msg;struct spi_transfer spi_t = {.tx_buf = buf,.len = len,};spi_message_init(&spi_msg); //初始化spi_messagespi_message_add_tail(&spi_t, &spi_msg); //将spi_tranfer添加到spi_message队列中ret = spi_sync(spi_dev, &spi_msg); //同步传输return ret;
}/*SPI进行多字节接收*/
static int spi_recv(struct spi_device* spi_dev, u8* buf, int len)
{int ret = 0;struct spi_message spi_msg;struct spi_transfer spi_t = {.rx_buf = buf,.len = len,};spi_message_init(&spi_msg); //初始化spi_mesagespi_message_add_tail(&spi_t, &spi_t); //将spi_transfer添加到spi_message队列中ret = spi_sync(spi_dev, &spi_msg); //同步传输return ret;
}
以上就实现了SPI传输多个字节数据的功能。
接下来进行 ALPHA开发板上的 ICM20608的SPI设备驱动实验。