RT_thread I2C设备(手把手教学)

一、I2C介绍

I2C总线是一种半双工、双向二线制同步串行总线。

全双工:两条线可以同时收发; 半双工:两条线不可以同时收发。同步通信:同步通信就是主机在进行通信前要先建立同步,即要使用相同的时钟频率,发送方的发送频率和接受方的接受频率要同步。除了时间频率的不同外,异步通信和同步通信之间的区别还是发送数据的表示形式,异步通信一般发送单位是字符,同步通信发送单位是比特流(数据帧),但是这不是绝对的,异步通信有时也使用帧来通信。

I2C 总线传输数据时只需两根信号线:双向数据线 SDA、双向时钟线 SCL

二、连接方式:

注:通过上拉电阻拉高,两根线默认状态下都是高电平。

三、时序:

起始条件:时钟线(SCL)电平保持高电平不变,数据线(SDA)从高电平向低电平跳变;

停止条件:时钟线(SCL)电平保持高电平不变,数据线(SDA)从低电平向高电平跳变;

周期:两条红线之间的部分为一个周期,在SCL为高电平的时段,读取SDA的数据;

ACK(应答位):SDA低电平为应答信号。因为SDA默认是高电平信号,应答为将高电平拉低。

四、协议

1、单字节读:(读是1,写是0)

主机发送一个起始信号,然后发送一个七位的设备地址和一个写的方向位。因为一个设备有很多寄存器,要告诉设备读哪个寄存器。等从机设备应答(ACK)后,主机在发送一个八位的寄存器地址,从机在进行应答。之后,主机发送起始信号和七位的设备地址+读的方向位,从机给一个应答和八位的数据。最后,主机回一个非应答和停止信号。

2、多字节读

多字节读与单字节读的区别在于:读完一个字节之后主机给一个应答信号,直到主机发一个非应答和停止信号之后结束。

3、单字节写

前面部分和“读单字节”类似,主机先发送一个起始信号,然后发送一个七位的设备地址和一个写的方向位。从机给一个应答之后,主机发送一个寄存器地址(八位),从机进行应答。之后(有区别的部分),主机写入八位数据,从机进行应答,然后主机发送停止信号后结束。

4、多字节写:

多字节写与单字节写的区别在于:多字节写一个字节之后,从机进行应答,直到主机发送停止信号之后结束。

注:一般情况下地址都会递增,比如第一次写入的地址是01,那么下次就是02,接下来就03……

五、RTT访问I2C总线设备

1、查找 I2C 总线设备

2、数据传输

#define RT_I2C_WR 0x0000    
#define RT_I2C_RD (1u << 0)

struct rt_i2c_msg
{
    rt_uint16_t addr;//从机地址
    rt_uint16_t flags;//读1,写0
    rt_uint16_t len;//传递数据的长度
    rt_uint8_t  *buf;//传递数据的首地址
};
rt_size_t rt_i2c_transfer(struct rt_i2c_bus_device *bus,
                          struct rt_i2c_msg         msgs[],
                          rt_uint32_t               num)//num是指msgs[]数组的个数。

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值