2过程贴——IIC和MCP4725的使用
计划使用DAC来生成不同的波形,供ADC来采集,刚好手边有MCP4725的小板子,使用IIC来驱动,所以第一步要搞定IIC驱动。

根据原理图可知在P12接口的7,9引脚分别是SCL引脚和SDA引脚,虽然原理图上标识的是I3C,但是实际用下来IIC也是可以的。
IIC要先安装smbus库,其实可以选smbus2 或 python-periphery 库,但是相比python-periphery,smbus2更轻量(因为它只支持iic),功能却不差。
pip3 install smbus2 #安装smbus2
使用ai糊了一个测试代码
import time
from smbus2 import SMBus, i2c_msg
# ================= 配置区域 =================
I2C_BUS_ID = 0 # 你的开发板使用的是 i2c-0
DEVICE_ADDR = 0x62 # MCP4725默认地址是0x62
REGISTER_ADDR = 0x00 # 目标寄存器或内存地址
# ===========================================
def scan_i2c_bus(bus):
"""扫描当前 I2C 总线上挂载的所有设备地址"""
print("正在扫描 I2C 总线上的设备...")
found_devices = []
for address in range(128):
try:
# 尝试向该地址发送一个空字节,如果有 ACK 响应则说明设备存在
bus.write_byte(address, 0)
found_devices.append(address)
print(f" 发现设备地址: 0x{address:02X}")
except Exception:
pass
if not found_devices:
print(" 未找到任何 I2C 设备,请检查硬件连线!")
return found_devices
def test_standard_rw(bus, addr):
"""测试标准的寄存器读写 (SMBus 协议)"""
print(f"\n[测试 1] 标准寄存器读写 (目标地址: 0x{addr:02X})")
try:
# 1. 向指定寄存器写入一个字节
write_value = 0xAA
bus.write_byte_data(addr, REGISTER_ADDR, write_value)
print(f" 成功向寄存器 0x{REGISTER_ADDR:02X} 写入数据: 0x{write_value:02X}")
# 注意:如果是 EEPROM 等设备,写入后可能需要短暂延时等待内部写周期完成
time.sleep(0.01)
# 2. 从指定寄存器读取一个字节
read_value = bus.read_byte_data(addr, REGISTER_ADDR)
print(f" 成功从寄存器 0x{REGISTER_ADDR:02X} 读取数据: 0x{read_value:02X}")
except Exception as e:
print(f" 标准读写失败: {e}")
def test_custom_transfer(bus, addr):
"""测试高度自定义的 I2C 消息传输 (底层 i2c_msg)"""
print(f"\n[测试 2] 自定义 I2C 消息传输 (目标地址: 0x{addr:02X})")
try:
# 场景:先写入寄存器地址,再连续读取多个字节 (常用于读取传感器数据或 EEPROM)
# 1. 构造写入消息(告诉设备我们要读哪个地址)
write_msg = i2c_msg.write(addr, [REGISTER_ADDR])
# 2. 构造读取消息(准备接收 4 个字节的数据)
read_msg = i2c_msg.read(addr, 4)
# 3. 组合发送 (Repeated Start 时序)
bus.transfer(write_msg, read_msg)
# 4. 将读取到的结果转换为列表并打印
data_read = list(read_msg)
print(f" 通过自定义时序成功读取 4 字节数据: {[hex(d) for d in data_read]}")
except Exception as e:
print(f" 自定义传输失败: {e}")
def main():
# 使用 with 语句自动管理总线打开与关闭,即使程序报错也能安全释放资源
with SMBus(I2C_BUS_ID) as bus:
print(f"成功打开 I2C-{I2C_BUS_ID} 总线\n")
# 1. 先扫描总线,看看设备是否在
devices = scan_i2c_bus(bus)
# 2. 如果扫描到了我们配置的目标设备,则进行读写测试
if DEVICE_ADDR in devices:
test_standard_rw(bus, DEVICE_ADDR)
test_custom_transfer(bus, DEVICE_ADDR)
else:
print(f"\n警告:配置的目标设备地址 0x{DEVICE_ADDR:02X} 未在总线上找到,跳过读写测试。")
print("请修改代码中的 DEVICE_ADDR 为你实际扫描到的地址!")
if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
print("\n程序已被用户手动终止。")
except Exception as e:
print(f"\n程序运行出现严重错误: {e}")
print("提示:请确保使用 sudo 权限运行此脚本 (例如: sudo python3 i2c_demo.py)")将逻辑分析仪连好后,就可以看到开发板成功发出IIC消息了。

测试后,i2c-0可以发出iic消息了。
接下来就该驱动MCP4725了,但不幸的是发生了悲惨的事,模块电源接反了,驱动MCP4725变成点亮MCP4725了。。。。直接冒烟,悲桑。还好开发板没事。
附上测试环境和MCP4725的尸体。

我要赚赏金
