硬件i2c 重映射在 pb8 和 pb9SMBus system management bus 系统管理总线本质是i2c的一个增强版规范版波特率i2c速度模式大于100kbps快速模式下波特率一定不能大于400kbps因为i2c是开漏高电平靠的是上拉电阻慢慢拉上去而不是MCU主动推上去拉低很快拉高很慢如果过快电压都还没来得及升到高电平下一个数据就来了通信就错了SPI是推挽输出所以能到几十MHzI2C天生适合 板内通信短距离通信而不适合高速长距离大数据量因为传感器每秒几十到几百字节就够了而显示屏flashSD卡每秒可能要传输几M数据I2C就明显不够用只有在快速模式下设置时钟信号的占空比才有效 占空比仅在快速模式下有效占空比 高电平时间 / 总时间为什么要设置占空比到了400kHz频率对了 不代表时序一定满足规范400kHz 》 周期 2.5us 高电平 1.25us 低电平1.25us 频率没问题但是I2C规范要求 T_LOW 1.3us, T_HIGH 0.6us,低电平时间不够 频率正确但是时序不符合规范低电平需要时间准备数据高电平需要去充电容时间不够就会出错设置占空比是为了在同样的频率下让高电平和低电平持续时间满足I2C的时序要求SR1 : status register硬件I2C写起始位 将SDA的start寄存器 写成1 I2C模块就会主动帮我们将SDA下拉从而发送一个起始位发送停止位 将SDA的stop寄存器写成1I2C总线不传输数据的时候就是空闲的 BUSY寄存器为0 总线空闲SB标志位查看起始位是否发送完成start bit 1:表示发送完了 0 未发送发送数据的时候从机会返回ackAF 标志位acknowledge failure 为1 没有收到ack应答失败寻址的时候ADDR标志位address sent /matched:为1 寻址成功 0寻址失败ack寄存器只MPU6050规格书 1101 000 R/W0xD0 AD0 为 00xD2 AD0为11s钟旋转一圈 360度每秒陀螺仪 gyroscope测的是角速度 angular velocity 单位°/s, 每秒转了多少度陀螺仪测转动速度