这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 树莓派RP2040测试AT24C64

共1条 1/1 1 跳转至

树莓派RP2040测试AT24C64

专家
2026-05-15 21:59:21     打赏

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

1、电路连接:

24C64.png

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外设直接驱动,测试结果:

u.png






关键词: 大懒猫的试用笔记     RP2040     AT24C64    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]