IIC最常用的通讯协议,但普遍用于单片机、arm这些,用FPGA实现大材小用,但对于菜鸡水平练练手很不错,考验串并转换和时序的控制。今天我就以mpu6050陀螺仪为例,实现FPGA的iic通信。

1.首先我们还是研究mpu6050的datasheet 。mpu6050我就不用介绍了,直接看关键信息

  1)mpu6050上电延时至少30ms 。

iic通讯 FPGA实现 mpu6050为例-LMLPHP

  2)iic最大时钟为400khz。slave address为 b110100 x r/w,x位是mpu6050的sd0引脚。第二张是我使用模块的原理图,很明显能看到sd0引脚被拉低,所以模块sd0管脚悬空就行,因此slave address为 b1101000 r/w。

iic通讯 FPGA实现 mpu6050为例-LMLPHP

iic通讯 FPGA实现 mpu6050为例-LMLPHP

  3)iic的 start 与 stop 信号

iic通讯 FPGA实现 mpu6050为例-LMLPHP

  4)如图,ack为低电平,nack为高电平。

iic通讯 FPGA实现 mpu6050为例-LMLPHP

  5)读写的时序,注意一下读写差别很大,datasheet给的图很明白,我就不过多解释

iic通讯 FPGA实现 mpu6050为例-LMLPHP

iic通讯 FPGA实现 mpu6050为例-LMLPHP

  6)实现读操作,以设备验证寄存器为例,这个寄存器不用初始化,默认值为0x68。

iic通讯 FPGA实现 mpu6050为例-LMLPHP

2.手册看得差不多了,我先实现读操作。

  1.)下图是iic读时序仿真,起始位、ack、nack、停止位以及数据。

一定记得要上电延时至少30ms,我之前没发现上电直接读,数据读不出来,后来怀疑上电的问题,仔细看datasheet才发现有上电延时。

iic通讯 FPGA实现 mpu6050为例-LMLPHP

  2)最后加入uart模块,将读出的数据通过串口发送显示,如图数据完美正确,说明读没问题,说明我们的时序没问题,下一步就对mpu6050进行初始化

iic通讯 FPGA实现 mpu6050为例-LMLPHP ⅠⅠⅡⅢⅣⅤⅥⅦⅠⅡ

3.读时序都写好了,写时序就没问题了,关键我们还是要认真读datasheet,初始化寄存器和读数据寄存器我总结如下,详细说明建议看英文版的datasheet。

iic通讯 FPGA实现 mpu6050为例-LMLPHP

  1)初始化仿真与上板验证

    仿真如图

iic通讯 FPGA实现 mpu6050为例-LMLPHP

  2)将原始数据经过uart上传,显示数据不停地被读出,初步判定iic操作成功

iic通讯 FPGA实现 mpu6050为例-LMLPHP

  今天就完成到这儿,后面继续进行原始数据处理,待续。。。。

05-21 06:24