nrf52832(nrf52810)之硬件I2C(TWI)驱动B

2019-05-08  本文已影响0人  Mo_辉仔

1.目的:

写一个关于nrf52832的用硬件I2C驱动一个传感器的流程文档

2.分析:

现在用IIC和BMI160六轴传感器通信来读取三轴加速度值和三轴陀螺仪值。TWI(Two Wire Interface)

        2.1  I2C通信需要两条线:SDA,SCL。I2C通信设备有两种角色:master和slave,一般用户开发程序都是开发master端,然后去读写作为slave的外设,比如:eeprom,flash,sensor,display device。

2.2  在通信过程中,有两组特殊控制信号:

start :scl为高电平时,sda由高电平变为低电平。

stop: scl为高电平时,sda由低电平变为高电平。

         (注意在通信过程中,SCL始终由master控制,这句话在做模拟I2C的时候就显得意义非凡了)

       2.3  master做写数据操作时,先是SCL和SDA都处于空闲状态(两者都是高电平),然后SDA由高变低(start信号);变低          后SCL拉低,这个时候SDA就可以变成想要的电平,高电平代表bit为1,低电平代表bit为0;电平稳定后拉高时钟(拉高的目          的是为了让slave读取数据,SCL为高时,SDA要保持不变,slave读取SDA的电平);数据传输完了后要结束:先拉高SCL          ,然后拉高SDA,然后拉低SDA,一个完整的stop信号完成了。

读数据操作时,start和stop这些时序一样,但是主机要去解析slave传来的数据(电平信号), 拉低SCL,然后释放SDA(即拉        高SDA),一段延时之后拉高SCL再去读取SDA电平信号(既然是读取电平,这里必要设置为输入引脚啦),如果是高电平则       记下是一个H_bit,否则是L_bit,读取到8位数据后如果还要继续读取则回复ACK,否则回复NCK。

ACK信号是SCL拉低后给SDA一个低电平,然后拉高SCL;

ANK信号是SCL拉低和给SDA一个高电平,然后拉高SCL;

3.首先硬件IIC的配置

3.1  配置需要用的IIC的通道(nrf52832有3个通道。nrf52810只有1个通道)

3.2  配置IIC的引脚,传输速率,中断优先级等参数,然后初始化配置并且使能

3.3  硬件IIC读写的函数

3.4  配置从机传感器BMI160IIC

  添加上面配置所需要的参数和函数(BMI160有两个器件ID,需要看硬件的接法:SDO接地 ,ID地址 = 0x68;  SDO接VCC, 则ID地址 = 0x69)

3.5  初始化BMI160

4.最后在main函数添加上bmi160初始化函数,运行代码就可以看到 log 初始化传感器成功

最后附上一张用逻辑分析仪测得的波形图

上一篇下一篇

猜你喜欢

热点阅读