Lines Matching refs:SPI
1 # SPI chapter
7 SPI指串行外设接口(Serial Peripheral Interface),是一种高速的,全双工,同步的通信总线。SPI是由Motorola公司开发,用于在主设备和从设备之间进行通信。
9 SPI接口定义了操作SPI设备的通用方法集合,包括:
11 - SPI设备句柄获取和释放。
13 - SPI读写:从SPI设备读取或写入指定长度数据。
15 - SPI自定义传输:通过消息传输结构体执行任意读写组合过程。
17 - SPI设备配置:获取和设置SPI设备属性。
21 在HDF框架中,SPI的接口适配模式采用独立服务模式,在这种模式下,每一个设备对象会独立发布一个设备服务来处理外部访问,设备管理器收到API的访问请求之后,通过提取该请求的参数,达到调用实际设备对象…
29 **图 1** SPI独立服务模式结构图<a name="fig1"></a>
31 
33 SPI模块各分层作用:
35 - 接口层提供打开SPI设备、SPI写数据、SPI读数据、SPI传输、配置SPI设备属性、获取SPI设备属性、关闭SPI设备的接口。
37 - 核心层主要提供SPI控制器的添加、移除以及管理的能力,通过钩子函数与适配层交互。
41 SPI以主从方式工作,通常有一个主设备和一个或者多个从设备。主设备和从设备之间一般用4根线相连,它们分别是:
53 **图 2** SPI主从设备连接示意图
55 
57 - SPI通信通常由主设备发起,通过以下步骤完成一次通信:
65 - 根据SCLK时钟信号的CPOL(Clock Polarity,时钟极性)和CPHA(Clock Phase,时钟相位)的不同组合,SPI有以下四种工作模式:
77 SPI模块当前只支持主机模式,不支持从机模式。
83 SPI通常用于与闪存、实时时钟、传感器以及模数/数模转换器等支持SPI协议的设备进行通信。
87 SPI模块提供的主要接口如表1所示,具体API详见//drivers/hdf_core/framework/include/platform/spi_if.h。
89 **表 1** SPI驱动API接口功能介绍
93 | DevHandle SpiOpen(const struct SpiDevInfo \*info) | 获取SPI设备句柄 |
94 | void SpiClose(DevHandle handle) | 释放SPI设备句柄 |
97 | int32_t SpiTransfer(DevHandle handle, struct SpiMsg \*msgs, uint32_t count) | SPI数据传输接口 |
98 | int32_t SpiSetCfg(DevHandle handle, struct SpiCfg \*cfg) | 根据指定参数,配置SPI设备 |
99 | int32_t SpiGetCfg(DevHandle handle, struct SpiCfg \*cfg) | 获取SPI设备配置参数 |
103 使用SPI的一般流程如下图所示。
105 **图 3** SPI使用流程图
107 
109 #### 获取SPI设备句柄
111 在使用SPI进行通信时,首先要调用SpiOpen获取SPI设备句柄,该函数会返回指定总线号和片选号的SPI设备句柄。
121 | info | 结构体类型,SPI设备描述符 |
123 | NULL | 获取SPI设备句柄失败 |
124 | 设备句柄 | 获取对应的SPI设备句柄成功 |
126 假设系统中的SPI设备总线号为0,片选号为0,获取该SPI设备句柄的示例如下:
129 struct SpiDevInfo spiDevinfo; // SPI设备描述符
130 DevHandle spiHandle = NULL; // SPI设备句柄
131 spiDevinfo.busNum = 0; // SPI设备总线号
132 spiDevinfo.csNum = 0; // SPI设备片选号
134 // 获取SPI设备句柄
142 #### 获取SPI设备属性
144 在获取到SPI设备句柄之后,需要配置SPI设备属性。配置SPI设备属性之前,可以先获取SPI设备属性,获取SPI设备属性的函数如下所示:
154 | handle | DevHandle类型,SPI设备句柄 |
155 | cfg | 结构体指针类型,SPI设备配置参数 |
162 struct SpiCfg cfg = {0}; // SPI配置信息
163 ret = SpiGetCfg(spiHandle, &cfg); // 获取SPI设备属性
170 #### 配置SPI设备属性
172 在获取到SPI设备句柄之后,需要配置SPI设备属性,配置SPI设备属性的函数如下所示:
182 | handle | DevHandle类型,SPI设备句柄 |
183 | cfg | 结构体指针类型,SPI设备配置参数 |
190 struct SpiCfg cfg = {0}; // SPI配置信息
195 ret = SpiSetCfg(spiHandle, &cfg); // 配置SPI设备属性
202 #### 进行SPI通信
204 - 向SPI设备写入指定长度的数据
206 如果只向SPI设备写一次数据,则可以通过以下函数完成:
216 | handle | DevHandle类型,SPI设备句柄 |
226 // 向SPI设备写入指定长度的数据
234 - 从SPI设备读取指定长度的数据
246 | handle | DevHandle类型,SPI设备句柄 |
256 // 从SPI设备读取指定长度的数据
276 | handle | DevHandle类型,SPI设备句柄 |
302 #### 销毁SPI设备句柄
304 SPI通信完成之后,需要销毁SPI设备句柄,销毁SPI设备句柄的函数如下所示:
316 | handle | DevHandle类型,SPI设备句柄 |
319 SpiClose(spiHandle); // 销毁SPI设备句柄
324 本例拟对Hi3516DV300开发板上SPI设备进行操作。
326 SPI设备完整的使用示例如下所示,首先获取SPI设备句柄,然后配置SPI设备属性,接着调用读写接口进行数据传输,最后销毁SPI设备句柄。
335 struct SpiCfg cfg; // SPI配置信息
336 struct SpiDevInfo spiDevinfo; // SPI设备描述符
337 DevHandle spiHandle = NULL; // SPI设备句柄
343 spiDevinfo.busNum = 0; // SPI设备总线号
344 spiDevinfo.csNum = 0; // SPI设备片选号
345 spiHandle = SpiOpen(&spiDevinfo); // 根据spiDevinfo获取SPI设备句柄
350 // 获取SPI设备属性
358 // 配置SPI设备属性
364 /* 向SPI设备写入指定长度的数据 */
370 /* 从SPI设备读取指定长度的数据 */
390 // 销毁SPI设备句柄