学习目标:
1.软件IIc
2.硬件IIc
学习内容:
IIC通信
1.I2C(Inter IC Bus)是由Philips公司开发的一种通用数据总线
2.两根通信线:SCL(Serial Clock)、SDA(Serial Data)
3.同步,半双工
4.带数据应答
5.支持总线挂载多设备(一主多从、多主多从)
硬件电路:
1.所有I2C设备的SCL连在一起,SDA连在一起
2.设备的SCL和SDA均要配置成开漏输出模式
3.SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右
IIC的时序单元
起始条件:SCL高电平期间,SDA从高电平切换到低电平
终止条件:SCL高电平期间,SDA从低电平切换到高电平
相当于起始位和停止位
主机发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节
主机接受一个字节
SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)
应答机制
发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
接收应答:主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)
IIC时序
指定地址写 对于指定设备(Slave Address),在指定地址(Reg Address)下,写入指定数据(Data)
发送到指定模块的内部
发送数据
发送完成,停止
当前地址读的时序
当读写操作后,地址指针会自动加+1;读的失手想要结束读,主机最后给个非应答。
对于指定设备(Slave Address),在当前地址指针指示的地址下,读取从机数据(Data)
显示模块地址+写 然后模块内部地址+重新开始+模块地址+读+指定地址的内容
MP6050
MPU6050是一个6轴姿态传感器,可以测量芯片自身X、Y、Z轴的加速度、角速度参数,通过数据融合,可进一步得到姿态角,常应用于平衡车、飞行器等需要检测自身姿态的场景
3轴加速度计(Accelerometer):测量X、Y、Z轴的加速度
3轴陀螺仪传感器(Gyroscope):测量X、Y、Z轴的角速度
9轴(10轴)指3轴加速度,3轴角速度,3轴磁场强度,(1轴气压强度)
参数
16位ADC采集传感器的模拟信号,量化范围:-32768~32767
加速度计满量程选择:±2、±4、±8、±16(g)
陀螺仪满量程选择: ±250、±500、±1000、±2000(°/sec)
可配置的数字低通滤波器
可配置的时钟源
可配置的采样分频 I2C从机地址:1101000(AD0=0)
1101001(AD0=1)
软件iic读写MP6050(软件iic可以是gpio的任何两个引脚不一定非要是指定的)
1.写iic的初始化
1)先将GPIO初始化
模式设置为开漏模式
2.写iic的开始条件
void myiic_w_scl(uint8_t bitvalue)
{
GPIO_WriteBit(GPIOB,GPIO_Pin_10,(BitAction)bitvalue);//强转为bitaction类型
}
对scl操作进行封装
将读写sda,写scl进行封装
myiic_w_sda(byte&0x80);//取出最高位,用与的方法
取出某一位,用与的方法。
可以用for循环与0x80>>i的方式
主机发送 是接受应答,主机接收,发送应答
对与两个8位数据转化为16位的方法
用移位和或的方法
int16_t *accx
uint8_t datah=mpu_readreg(MPU6050_ACCEL_XOUT_H);
uint8_t datal=mpu_readreg(MPU6050_ACCEL_XOUT_L);
*accx=(datah<<8)|datal;
对于需要多返回值的函数,我们可以使用用结构体打包的方法