FPGA单片机上的IIC总线与24LC04存储实验

版权申诉
1 下载量 97 浏览量 更新于2024-10-02 收藏 11.27MB RAR 举报
资源摘要信息:"iic.rar_24lc04_fpga 24lc04" 在本实验中,使用FPGA单片机与IIC总线接口进行24LC04 EEPROM存储器的读写操作。24LC04是一款电可擦可编程只读存储器EEPROM,具有IIC接口,常用于存储小量数据。以下是关于该实验的主要知识点: ### FPGA单片机 FPGA(Field-Programmable Gate Array)单片机是一种可现场编程的集成电路,它包含大量的可编程逻辑单元以及可编程的互连资源。FPGA具有很强的灵活性和重编程能力,用户可以根据需要实现各种逻辑功能,非常适合进行硬件原型设计、系统集成和快速验证。本实验中,FPGA单片机作为主控制器,通过IIC总线对24LC04进行读写控制。 ### IIC总线 IIC总线(Inter-Integrated Circuit)是Philips公司开发的一种两线制串行总线,广泛应用于微控制器和各种外围设备之间进行通信。IIC总线使用两条线:一条串行数据线(SDA)和一条串行时钟线(SCL)。IIC总线支持多主多从模式,具有地址识别、应答检测等特点,通信速度可高达400kbps。在本实验中,FPGA单片机通过IIC总线接口发送读写命令,并与24LC04 EEPROM进行数据交换。 ### 24LC04 EEPROM 24LC04是一款带有IIC总线接口的串行EEPROM存储器,容量为512 bytes(4 Kbit)。它能够提供低电压和标准电压操作,具有多种写保护特性,非常适合用于存储非易失性数据。在实验中,通过向24LC04写入512字节的数据,然后读取这些数据,并验证数据是否与写入时一致,从而检验FPGA单片机的IIC总线读写功能的正确性。 ### 数据读写实验 实验的步骤包括: 1. 初始化FPGA单片机的IIC接口,设置24LC04的设备地址。 2. 向24LC04写入512字节的数据,具体分为两个阶段: - 第一阶段:写入前256个字节,数字从0到255。 - 第二阶段:写入后256个字节,数据均为1。 3. 从24LC04中读取512字节的数据。 4. 对比写入与读出的数据,确认数据是否一致。 ### 验证数据一致性 通过比较写入24LC04的512字节数据和读取出来的数据,可以验证FPGA单片机通过IIC总线对24LC04进行读写操作的正确性。如果读写的数据一致,说明FPGA成功控制了24LC04 EEPROM进行准确的数据存储和读取;如果数据不一致,则表示在数据传输或存储过程中出现了错误,需要进一步调试和修正。 ### 实验应用意义 通过本次实验,可以加深对FPGA与IIC总线通信协议的理解,掌握如何使用FPGA读写EEPROM存储器。这不仅有助于理解存储器工作原理,而且在实际应用中,FPGA与EEPROM的组合可以用于存储配置信息、系统日志、传感器数据等,对于需要非易失性数据存储的嵌入式系统设计具有重要意义。 通过本实验,还可以进一步探讨IIC总线在实际应用中的电气特性和时序要求,以及如何设计更稳定、高效的数据通信协议。同时,通过分析数据一致性检验过程,能够提升对数据完整性和系统可靠性的重视。

帮我改进一这段代码import machine import time from machine import I2C from machine import Pin from machine import sleep class accel(): def __init__(self, i2c, addr=0x68): self.iic = i2c self.addr = addr self.iic.start() self.iic.writeto(self.addr, bytearray([107, 0])) self.iic.stop() def get_raw_values(self): self.iic.start() a = self.iic.readfrom_mem(self.addr, 0x3B, 14) self.iic.stop() return a def get_ints(self): b = self.get_raw_values() c = [] for i in b: c.append(i) return c def bytes_toint(self, firstbyte, secondbyte): if not firstbyte & 0x80: return firstbyte << 8 | secondbyte return - (((firstbyte ^ 255) << 8) | (secondbyte ^ 255) + 1) def get_values(self): raw_ints = self.get_raw_values() vals = {} vals["AcX"] = self.bytes_toint(raw_ints[0], raw_ints[1]) vals["AcY"] = self.bytes_toint(raw_ints[2], raw_ints[3]) vals["AcZ"] = self.bytes_toint(raw_ints[4], raw_ints[5]) vals["Tmp"] = self.bytes_toint(raw_ints[6], raw_ints[7]) / 340.00 + 36.53 vals["GyX"] = self.bytes_toint(raw_ints[8], raw_ints[9]) vals["GyY"] = self.bytes_toint(raw_ints[10], raw_ints[11]) vals["GyZ"] = self.bytes_toint(raw_ints[12], raw_ints[13]) return vals # returned in range of Int16 # -32768 to 32767 def val_test(self): # ONLY FOR TESTING! Also, fast reading sometimes crashes IIC from time import sleep while 1: print(self.get_values()) sleep(0.05) clk = Pin(("clk", 36), Pin.OUT_OD) sda = Pin(("sda", 37), Pin.OUT_OD) i2c = I2C(-1, clk, sda, freq=100000) #initializing the I2C method for ESP32 #i2c = I2C(scl=Pin(5), sda=Pin(4)) #initializing the I2C method for ESP8266 mpu= accel(i2c) while True: mpu.get_values() print(mpu.get_values()) time.sleep(2)

2023-05-30 上传
2023-05-30 上传

解释这段代码: always@(posedge sys_clk ) begin data_reg0 <= data_reg0_z; data_reg1 <= data_reg1_z; data_reg2 <= data_reg2_z; data_reg3 <= data_reg3_z; data_reg4 <= data_reg4_z; data_reg5 <= data_reg5_z; data_reg6 <= data_reg6_z; end i2c_device_a i2c_device_a( .i2c_sda (f_iic_sda), // .i2c_scl (f_iic_scl), // .sys_rst (sys_rst), .sys_clk (sys_clk), .data_out0 (data_out0), .data_out1 (data_out1), .data_out2 (data_out2), .data_out3 (data_out3), .data_out4 (data_out4), .data_out5 (data_out5), .data_out6 (data_out6), .data_out7 (data_out7), .data_out8 (data_out8), .data_out9 (data_out9), .data_out10 (data_out10), .data_out11 (data_out11), .data_out12 (data_out12), .data_out13 (data_out13), .data_out14 (data_out14), .data_out15 (data_out15), .data_out16 (data_out16), .data_out17 (data_out17), .data_out18 (data_out18), .data_out19 (data_out19), .data_out20 (data_out20), .data_out21 (data_out21), .data_out22 (data_out22), .data_out23 (data_out23), .data_out24 (data_out24), .data_out25 (data_out25), .data_in0 (data_out0), .data_in1 (data_out1), .data_in2 (data_out2), .data_in3 (data_out3), .data_in4 (data_out4), .data_in5 (data_out5), .data_in6 (data_out6), .data_in7 (data_out7), .data_in8 (data_out8), .data_in9 (data_out9), .data_in10 (data_out10), .data_in11 (data_out11), .data_in12 (data_out12), .data_in13 (data_out13), .data_in14 (data_out14), .data_in15 (data_out15), .data_in16 (data_out16), .data_in17 (data_out17), .data_in18 (data_out18), .data_in19 (data_out19), .data_in20 (data_out20), .data_in21 (data_out21), .data_in22 (data_out22), .data_in23 (data_out23), .data_in24 (VERSION0_Y[15:8]), .data_in25 (VERSION0_Y[7:0]), .data_in26 (VERSION0_M_D[15:8]), .data_in27 (VERSION0_M_D[7:0]), .data_in28 (VERSION0_V[15:8]), .data_in29 (VERSION0_V[7:0]) ); wire [7:0] data_out0; wire [7:0] data_out1; wire [7:0] data_out2; wire [7:0] data_out3; wire [7:0] data_out4; wire [7:0] data_out5; wire [7:0] data_out6; wire

2023-05-30 上传