大家好,今天小白给大家介绍一下,关于mdm9206 threadx_os的spi操作相关的API,希望能和大家一起交流学习。
一. SPI简介
SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议, SPI驱动程序API提供高级别接口,公开SPI主控的功能。
二. 相关枚举变量
enum qapi_SPIM_Instance_t //SPI实例枚举
enum qapi_SPIM_Shift_Mode_t //SPI相位类型,主要包括时钟相位和时钟极性
enum qapi_SPIM_CS_Polarity_t //SPI芯片选择极性类型,空闲态期间,CS保持高或是低电平
enum qapi_SPIM_Byte_Order_t // 来自Tx / Rx缓冲字的字节放在总线上的顺序,大端或者小端
enum qapi_SPIM_CS_Mode_t //此类型定义了如何在N个字周期之间配置芯片选择线。
三. SPI相关接口定义
1. qapi_Status_t qapi_SPIM_Open ( qapi_SPIM_Instance_t instance, void ∗∗spi_Handle )
功能:此函数初始化内部数据结构以及关联的静态数据。 在任何操作模式下,应在调用任何其他SPI主API之前调用此函数。
参数:
in :instance, 是由qapi_SPIM_Instance_t指定的实例。
out:spi_Handle, 指向存储驱动程序句柄的位置的指针。
返回值:
类型:qapi_Status_t, 返回QAPI_OK - 调用成功,其他表示调用出错。
2. qapi_Status_t qapi_SPIM_Close ( void ∗ spi_handle )
功能:此函数释放所有内部数据结构并关闭SPI主接口。 然后qapi_SPIM_Open()返回的句柄无效。
参数:
in:spi_Handle, qapi_SPIM_Open()返回的驱动程序句柄。
返回值类型同上。
3. qapi_Status_t qapi_SPIM_Power_On ( void ∗ spi_Handle )
功能:此功能启用成功SPI事务所需的所有资源。 这包括时钟,电源和引脚多路复用功能。 应在传输或批量传输SPI之前调用此函数。
参数:
in:spi_Handle, qapi_SPIM_Open()返回的驱动程序句柄。
返回值:同上。
4. qapi_Status_t qapi_SPIM_Power_Off ( void ∗ spi_Handle )
作用:该函数关闭SPI主控器使用的所有资源。 这包括时钟,电源和GPIO。 应调用此函数以将SPI主控器置于其可能的最低功耗状态。
5. qapi_Status_t qapi_SPIM_Full_Duplex ( void ∗ spi_Handle, qapi_-SPIM_Config_t ∗ config, qapi_SPIM_Descriptor_t ∗ desc, uint32_t num_Descriptors, qapi_SPIM_Callback_Fn_t c_Fn, void ∗ c_Ctxt, qbool_t get_timestamp )
功能:该函数通过SPI总线执行异步传输。 转移可以是单向或双向的。 传输完成后会调用回调。
入参:
in:spi_Handle, qapi_SPIM_Open()返回的驱动程序句柄。
in:config,指向qapi_SPIM_Config_t描述的SPI配置结构的指针。
关于类型:qapi_SPIM_Config_t,定义如下:
typedef struct
{
qapi_SPIM_Shift_Mode_t SPIM_Mode;
qapi_SPIM_CS_Polarity_t SPIM_CS_Polarity;
qapi_SPIM_Byte_Order_t SPIM_endianness;
uint8_t SPIM_Bits_Per_Word; //数据位数,3~31任意数
uint8_t SPIM_Slave_Index; //表示第几个从设备
uint32_t Clk_Freq_Hz; //设置SPI时钟
uint32_t CS_Clk_Delay_Cycles; //不关心,设置为0就行
uint32_t Inter_Word_Delay_Cycles; //不关心,设置为0就行
qapi_SPIM_CS_Mode_t SPIM_CS_Mode;
qbool_t loopback_Mode; //通常为0.如果置位,SPI控制器将启用环回模式; 主要用于测试
} qapi_SPIM_Config_t;
in:desc,指向qapi_SPIM_Descriptor_t描述的结构的指针。如果选择半双工传输,则描述符可以具有NULL Tx OR Tx缓冲区。
关于类型:qapi_SPIM_Descriptor_t,定义如下:
typedef struct
{
uint8_t *tx_buf; //发送数据的缓冲区地址
uint8_t *rx_buf; //接收数据的缓冲区地址
uint32_t len; //传输的数据长度
}qapi_SPIM_Descriptor_t;
in:num_Descriptors, 表示客户端想要处理的描述符指针数。
in:c_Fn, SPI传输成功完成或出错时要调用的回调函数。
in:c_Ctxt, 指向将作为参数返回的客户端对象的指针c_Fn。
in:get_timestamp, 数据传输的时间戳。
四. SPI的简单用法
大致流程可以参考:
qapi_SPIM_Open() - 获取SPI实例的句柄。
qapi_SPIM_Power_On() - 打开成功SPI事务所需的所有资源。
qapi_SPIM_Full_Duplex() - 用于在SPI总线上执行传输的通用传输API。
qapi_SPIM_Power_Off() - 关闭qapi_SPIM_Power_On()设置的所有资源。
qapi_SPIM_Close() - 销毁SPI句柄创建的所有对象。
五. 总结
本篇主要介绍了基于mdm9206平台的threadx_os的spi操作相关的api,欢迎一起交流学习。