FPGA开发(十三)----------IIC通信访问eeprom内容

        本次实验我们主要通过实现IIC通信协议,之后完成eeprom芯片内部内容的读取,通过按键每次将芯片内部的前一个字节数据增加一或者减小一,之后保存回芯片的内部,同时增加流水灯指示当前程序运行。

        在开发板上,FPGA 芯片通过 I2C 总线连接 EEPROM 24LC04, I2C 的两根总线各上拉一个 4.7K的电阻到 3.3V,所以当总线上没有输出时会被拉高, 24LC04 的写保护没有使能,不然 FPGA 会无法写入数据。因为在电路上 A0~A2 都为低,所以 24LC04 的设备地址为 0xA0。如下所示

                     

          对24LC04的操作遵循IIC协议,具体的内容见https://blog.csdn.net/qq_34020487/article/details/105437002

          操作主要包括写单个存储字节、写多个存储字节、读单个存储字节、读多个存储字节。各个操作如下图所示。 

         I2C 时序虽然简单,但是写的不好也会出现很多问题,在开源网站 http://opencores.org/上我们可以找到很多非常好的代码,这些代码大部分都提供详细的文档和仿真。

         我们使用几个模块来实现上述四种操作。仍然采用之前的状态机,i2c_master_byte_ctrl 模块主要完成一个字节的读写,我们只需要按照I2C 读写的要求,完成设备地址、寄存器地址、数据等读写即可。

         i2c_master_top 模块是对 i2c_master_byte_ctrl 模块的再次封装,完成一个寄存器的读写,由于不同的设备寄存器可能是 8bit,也可能是 16bit,这里 i2c_addr_2byte 信号来控制寄存器地址是8 位还是 16 位。并在程序中进行了状态机的区分。具体的部分可以见程序的注释。

        i2c_master_top 模块状态机,如果是写寄存器操作,先写一个字节设备地址(写操作),再写 1 个字节或 2 个字节的寄存器地址,再写一个字节的数据;如果是读操作,先写一个字节的设备地址(写操作),再写 1 个字节或 2 字节的寄存器地址,完成地址的写入,再次写设备地址(读操作),然后读取一个字节的数据。

        i2c_eeprom_test 模块完成 EEPROM 的读写,EEPROM 设备地址是 A0,程序中将地址 00 的数据读出,然后通过数码管显示,在 KEY1 按下时,数字加一并再次写入 EEPROM 并显示出来,在 KEY2 按下时,数字减一并再次写入 EEPROM 并显示出来。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页