IIC最常用的通讯协议,但普遍用于单片机、arm这些,用FPGA实现大材小用,但对于菜鸡水平练练手很不错,考验串并转换和时序的控制。今天我就以mpu6050陀螺仪为例,实现FPGA的iic通信。
1.首先我们还是研究mpu6050的datasheet 。mpu6050我就不用介绍了,直接看关键信息
1)mpu6050上电延时至少30ms 。
2)iic最大时钟为400khz。slave address为 b110100 x r/w,x位是mpu6050的sd0引脚。第二张是我使用模块的原理图,很明显能看到sd0引脚被拉低,所以模块sd0管脚悬空就行,因此slave address为 b1101000 r/w。
3)iic的 start 与 stop 信号
4)如图,ack为低电平,nack为高电平。
5)读写的时序,注意一下读写差别很大,datasheet给的图很明白,我就不过多解释
6)实现读操作,以设备验证寄存器为例,这个寄存器不用初始化,默认值为0x68。
2.手册看得差不多了,我先实现读操作。
1.)下图是iic读时序仿真,起始位、ack、nack、停止位以及数据。
一定记得要上电延时至少30ms,我之前没发现上电直接读,数据读不出来,后来怀疑上电的问题,仔细看datasheet才发现有上电延时。
2)最后加入uart模块,将读出的数据通过串口发送显示,如图数据完美正确,说明读没问题,说明我们的时序没问题,下一步就对mpu6050进行初始化
3.读时序都写好了,写时序就没问题了,关键我们还是要认真读datasheet,初始化寄存器和读数据寄存器我总结如下,详细说明建议看英文版的datasheet。
1)初始化仿真与上板验证
仿真如图
2)将原始数据经过uart上传,显示数据不停地被读出,初步判定iic操作成功
今天就完成到这儿,后面继续进行原始数据处理,待续。。。。