这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【FRDMDEVBOARDFORI.MX91测评】过程贴——IIC和MCP472

共1条 1/1 1 跳转至

【FRDMDEVBOARDFORI.MX91测评】过程贴——IIC和MCP4725的使用

菜鸟
2026-05-09 15:15:54     打赏

2过程贴——IIC和MCP4725的使用

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

image.png

根据原理图可知在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消息了。

image-20260509110013362.png

测试后,i2c-0可以发出iic消息了。

接下来就该驱动MCP4725了,但不幸的是发生了悲惨的事,模块电源接反了,驱动MCP4725变成点亮MCP4725了。。。。直接冒烟,悲桑。还好开发板没事。

附上测试环境和MCP4725的尸体。

707b1e8eaa01d07fd5ebd57ed6c37f0e_compress.jpg




共1条 1/1 1 跳转至

回复

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