大家好,今天小白给大家介绍一下,关于mdm9206 threadx_os的I2c操作相关的API,希望能和大家一起交流学习。
一:I2C简介
I2C是一种2线总线,用于将低速外设连接到处理器或微控制器。常见的I2C外设包括触摸屏控制器,加速度计,陀螺仪以及环境光和温度传感器。
2线总线包括数据线,时钟线和基本的START,STOP和确认信号,以驱动总线上的传输。 I2C外设也称为I2C从器件。 处理器或微控制器实现I2C规范中定义的I2C主设备。 本篇介绍了访问I2C主实现的软件接口。
二:相关宏定义
#define QAPI_I2C_FLAG_START 0x00000001 //指定传输以START位开始 - S.
#define QAPI_I2C_FLAG_STOP 0x00000002 //指定传输以STOP位结束 - P.
#define QAPI_I2C_FLAG_WRITE 0x00000004 //必须设置为表示WRITE转移。
#define QAPI_I2C_FLAG_READ 0x00000008 //必须设置为表示READ传输。
.....
三:I2C相关接口定义
1. qapi_Status_t qapi_I2CM_Open ( qapi_I2CM_Instance_t instance, void ∗∗i2c_Handle )
2. qapi_Status_t qapi_I2CM_Close ( void ∗ i2c_Handle )
功能:由客户端代码调用以初始化相应的I2C实例。 成功时,i2c_Handle指向I2C实例的句柄。 API分配资源以供客户端句柄和I2C实例使用。这些资源在qapi_I2CM_Close()调用中释放。 API还可以为I2C硬件实例供电。 要禁用实例的电源,必须进行相应的qapi_I2CM_Close()调用。
参数:
in :instance, 客户端打算初始化的I2C实例;
out:i2c_Handle, 指针位置由驱动程序填充,带有句柄实例。
关于instance,类型是:qapi_I2CM_Instance_t ,定义如下:
enum qapi_I2CM_Instance_t,客户端想要使用的I2C内核的实例。 此实例在qapi_I2CM_Open()中传递。
返回值:
QAPI_OK - 调用成功
其他返回值代表不同的失败原因。
3. qapi_Status_t qapi_I2CM_Transfer ( void ∗ i2c_Handle, qapi_I2CM_Config_t
∗ config, qapi_I2CM_Descriptor_t ∗ desc, uint16_t num_Descriptors,
qapi_I2CM_Transfer_CB_t CB_Function, void ∗ CB_Parameter, uint32_t delay_us )
功能:执行I2C传输。 如果传输已由另一个客户端进行,则此调用将对传输进行排队。 如果传输返回失败,则传输尚未排队,并且不会发生回调。 如果传输返回QAPI_OK,则传输已排队,并且只有在调用回调时才能获得传输的进一步状态。
注意:在客户端调用此API之后,它必须等待完成回调才能再次调用API。 如果客户端希望对多个传输进行排队,则必须使用qapi_I2CM_Descriptor_t类型的描述符数组,而不是多次调用API。
参数:
in:i2c_Handle //处理I2C实例。
In:config //从属配置。 有关详细信息,请参阅qapi_I2CM_Config_t。
关于config参数,类型是:qapi_I2CM_Config_t,详细定义如下:
typedef struct
{
uint32_t bus_Frequency_KHz; // I2C总线速度,单位为kHz。
uint32_t slave_Address; //I2C设备地址
qbool_t SMBUS_Mode; //SMBUS模式配置参数,true设置为SMBUS模式
uint32_t slave_Max_Clock_Stretch_Us; //最大从时钟延时数
uint32_t core_Configuration1; //核心特定配置。 推荐是0。
uint32_t core_Configuration2; // 核心特定配置。 推荐是0。
} qapi_I2CM_Config_t
in:desc //I2C传输描述符。 请参阅qapi_I2CM_Descriptor_t
细节。 这可以是描述符数组。
in:num_Descriptors //描述符数组中的描述符数。
in:CB_Function //在传输完成时调用的回调函数发生在中断上下文中。 调用必须进行最少的处理,不得调用此处定义的任何API。
关于CB_Function参数, 类型如下:
4. typedef void( ∗ qapi_I2CM_Transfer_CB_t)(const uint32_t status, void
∗ CB_Parameter) //声明由客户端定义的回调函数的类型。
out:status, 传输的的完成状态
out:CB_Parameter, 回调函数的一个参数,被在qapi_I2CM_Transfer中传入。
in:CB_Parameter //客户端在此处传递的上下文将按原样返回回调函数。
in:delay_us //延迟以微秒为单位。
返回值:
QAPI_OK - 调用成功
其他返回值代表不同的失败原因。
5. qapi_Status_t qapi_I2CM_Power_On ( void ∗ i2c_Handle )
功能:为I2C事务开启I2C硬件资源。
参数:
in:i2c_Handle, 是qapi_I2CM_Open返回的驱动程序句柄。
返回值:
QAPI_OK - 调用成功
其他返回值代表不同的失败原因
6. qapi_Status_t qapi_I2CM_Power_Off ( void ∗ i2c_Handle )
功能:禁用I2C硬件资源。
参数:
in: i2c_Handle,是qapi_I2CM_Open返回的驱动程序句柄。
返回值:
QAPI_OK - 调用成功
其他返回值代表不同的失败原因
四:关于IIC接口使用的参考代码
void sample (void)
{
qapi_Status_t status = QAPI_OK;
qapi_I2CM_Config_t config;
uint32_t transferred1;
uint8_t buffer[4] = { 1, 2, 3, 4 };
qapi_I2CM_Descriptor_t desc[2];
status = qapi_I2CM_Open(QAPI_I2CM_INSTANCE_004_E, &i2c_handle); //获得操作句柄
config.bus_Frequency_KHz = 100; //config参数初始化
config.slave_Address = device_Address;
config.SMBUS_Mode = 0;
config.slave_Max_Clock_Stretch_Us = 100000;
config.core_Configuration1 = 0;
config.core_Configuration2 = 0;
desc[0].buffer= buffer; //desc参数初始化
desc[0].length= 4;
desc[0].transferred = &transferred1;
desc[0].flags= QAPI_I2C_FLAG_START | QAPI_I2C_FLAG_WRITE |
QAPI_I2C_FLAG_STOP;
res = qapi_I2CM_Transfer (client_handle, &config, &desc[0], 1,
client_callback, NULL); //数据传输
res = qapi_I2CM_Close (client_handle); //关闭I2C通道
}
void client_callback (uint32_t status, void *ctxt) //数据传输完成后调用的回调。
{
// Transfer completed
}
五 总结:
本篇主要介绍了基于mdm9206平台的threadx_os的I2C操作相关的api,欢迎一起交流学习。
---------------------
作者:weixin_38498942
来源:优快云
原文:https://blog.youkuaiyun.com/weixin_38498942/article/details/86002613
版权声明:本文为博主原创文章,转载请附上博文链接!