RTT设备与驱动之I2C:

I2C主从结构(可以有多个主机,但同一时间只能有一个):I2C有两种地址结构7位/10位

  

总线空闲时,SDA 和 SCL 都处于高电平状态。

开始信号: SCL 为高电平时,主机将 SDA 拉低

结束信号: 在 SDA 为低电平时,主机将 SCL 拉高并保持高电平,然后在将 SDA 拉高,表示传输结束

API函数:

rt_device_t rt_device_find(const char* name);查找设备
读写信息

rt_size_t rt_i2c_transfer(struct rt_i2c_bus_device *bus, struct rt_i2c_msg msgs[], rt_uint32_t num);
 struct rt_i2c_msg 
{
  rt_uint16_t addr; /* 从机地址 */

  rt_uint16_t flags; /* 读、写标志等 */

  rt_uint16_t len; /* 读写数据字节数 */

  rt_uint8_t *buf; /* 读写数据缓冲区指针 */

}
读写寄存器示例:
#include <rtthread.h>
#include <rtdevice.h> #define AHT10_I2C_BUS_NAME "i2c1" /* 传感器连接的I2C总线设备名称 */ #define AHT10_ADDR 0x38 /* 从机地址 */ #define AHT10_CALIBRATION_CMD 0xE1 /* 校准命令 */ #define AHT10_NORMAL_CMD 0xA8 /* 一般命令 */ #define AHT10_GET_DATA 0xAC /* 获取数据命令 */ static struct rt_i2c_bus_device *i2c_bus = RT_NULL; /* I2C总线设备句柄 */ static rt_bool_t initialized = RT_FALSE; /* 传感器初始化状态 */ /* 写传感器寄存器 */ static rt_err_t write_reg(struct rt_i2c_bus_device *bus, rt_uint8_t reg, rt_uint8_t *data) { rt_uint8_t buf[3]; struct rt_i2c_msg msgs; buf[0] = reg; //cmd buf[1] = data[0]; buf[2] = data[1]; msgs.addr = AHT10_ADDR; msgs.flags = RT_I2C_WR; msgs.buf = buf; msgs.len = 3; /* 调用I2C设备接口传输数据 */ if (rt_i2c_transfer(bus, &msgs, 1) == 1) { return RT_EOK; } else { return -RT_ERROR; } } /* 读传感器寄存器数据 */ static rt_err_t read_regs(struct rt_i2c_bus_device *bus, rt_uint8_t len, rt_uint8_t *buf) { struct rt_i2c_msg msgs; msgs.addr = AHT10_ADDR; msgs.flags = RT_I2C_RD; msgs.buf = buf; msgs.len = len; /* 调用I2C设备接口传输数据 */ if (rt_i2c_transfer(bus, &msgs, 1) == 1) { return RT_EOK; } else { return -RT_ERROR; } }

转载于:https://www.cnblogs.com/jieruishu/p/10271992.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值