测试使用MicroPython语言,在Thonny下测试,测试对象为AT24C64模块,地址A0、A1、A2接地。
1、电路连接:

2、代码如下:
from machine import I2C, Pin
import time
class AT24C64:
def __init__(self, i2c, addr=0x50):
"""
初始化 EEPROM
:param i2c: 已经初始化的 I2C 对象
:param addr: 设备地址,默认为 0x50
"""
self.i2c = i2c
self.addr = addr
def write_byte(self, mem_addr, data):
"""
向指定地址写入一个字节
:param mem_addr: EEPROM 内部地址 (0 到 8191)
:param data: 要写入的字节数据 (0-255)
"""
# 将16位内存地址拆分为高8位和低8位
addr_high = (mem_addr >> 8) & 0xFF
addr_low = mem_addr & 0xFF
# 发送数据:设备地址 + 内存地址高位 + 内存地址低位 + 数据
self.i2c.writeto(self.addr, bytes([addr_high, addr_low, data]))
# EEPROM 写操作需要内部写入时间,加个小延时
time.sleep_ms(5)
def write(self, mem_addr, data_buffer):
"""
向指定地址开始连续写入多个字节 (页写入)
:param mem_addr: 起始内存地址
:param data_buffer: 要写入的字节数据 (bytes 或 bytearray)
"""
addr_high = (mem_addr >> 8) & 0xFF
addr_low = mem_addr & 0xFF
# 构建完整的写入数据:地址 + 有效负载
data_to_write = bytes([addr_high, addr_low]) + data_buffer
self.i2c.writeto(self.addr, data_to_write)
time.sleep_ms(5) # 等待写入完成
def read_byte(self, mem_addr):
"""
从指定地址读取一个字节
:param mem_addr: EEPROM 内部地址
:return: 读取到的字节数据 (int)
"""
addr_high = (mem_addr >> 8) & 0xFF
addr_low = mem_addr & 0xFF
# 先发送要读取的内存地址
self.i2c.writeto(self.addr, bytes([addr_high, addr_low]))
# 然后从设备读取1个字节的数据
data = self.i2c.readfrom(self.addr, 1)
return data[0]
def read(self, mem_addr, size):
"""
从指定地址开始连续读取多个字节
:param mem_addr: 起始内存地址
:param size: 要读取的字节数
:return: 读取到的数据 (bytes)
"""
addr_high = (mem_addr >> 8) & 0xFF
addr_low = mem_addr & 0xFF
self.i2c.writeto(self.addr, bytes([addr_high, addr_low]))
data = self.i2c.readfrom(self.addr, size)
return data
# 假设 SCL 和 SDA 分别接在引脚 21 和 20
i2c = machine.I2C(0, scl=machine.Pin(21), sda=machine.Pin(20), freq=100000)
# 2. 扫描 I2C 设备,确认地址
print("扫描设备地址:", [hex(device) for device in i2c.scan()])
# 3. 创建 EEPROM 对象
eeprom = AT24C64(i2c)
# 4. 测试:写入并读取单个字节
test_addr = 0x00
print(f"写入地址00:字节: 0xA5") # 应输出 0xA5
eeprom.write_byte(test_addr, 0xA5) # 在地址0写入 0xA5
read_val = eeprom.read_byte(test_addr) # 从地址0读取
print(f"读取字节: 0x{read_val:02X}") # 应输出 0xA5
# 5. 测试:写入并读取字符串
str_addr = 0x100
test_string = b"Hello RP2040!" # 必须以字节形式写入
print("写入字符串:", test_string.decode('utf-8'))
eeprom.write(str_addr, test_string)
read_string = eeprom.read(str_addr, len(test_string))
print("读取字符串:", read_string.decode('utf-8'))
# 6. 测试:修改一个字符
# 先读取整个数据块
data_block = bytearray(eeprom.read(str_addr, len(test_string)))
# 从第6个字节开始改为 (World! )
data_block[6] = ord('W')
data_block[7] = ord('o')
data_block[8] = ord('r')
data_block[9] = ord('l')
data_block[10] = ord('d')
data_block[11] = ord('!')
data_block[12] = ord(' ')
# 写回
eeprom.write(str_addr, bytes(data_block))
# 再次读取验证
new_string = eeprom.read(str_addr, len(test_string))
print("修改字符串:", new_string.decode('utf-8'))测试使用I2C外设直接驱动,测试结果:

我要赚赏金
