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 初始化传感器成功
最后附上一张用逻辑分析仪测得的波形图