You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

12位DAC MAX5825满量程仅为8位0xFF异常问题咨询

问题根因分析

1. 核心问题:I2C字传输字节序不匹配

MAX5825的16位寄存器写操作要求先传输高8位,再传输低8位,而pigpio库的i2c_write_word_data遵循SMBus标准规范,默认传输顺序是先传低字节(LSB)、后传高字节(MSB),二者字节序完全相反,导致你写入的12位数值被错误拆分传输。
你测试时写入8位值0xFF时输出接近满量程,刚好是字节序反转的典型现象:

  • 假设写入value=0xFF,按你原代码左移4位得到0x0FF0,pigpio先传低字节0xF0、再传高字节0x0F
  • MAX5825把先收到的0xF0识别为高8位、后收到的0x0F识别为低8位,拼接后得到0xF00F,取高12位有效位为0xF00,输出电压为4V * 0xF00/0xFFF ≈ 3.75V;如果没做移位操作直接写0xFF,pigpio传输的字节是0xFF(低字节)、0x00(高字节),MAX5825拼接得到0xFF00,高12位为0xFF0,输出接近4V,完全符合你观察到的现象。

2. 寄存器读取结果无效

MAX5825的CODEn、CODEn_LOADn寄存器均为只写寄存器,不支持读操作,你调用i2c_read_word_data读到的结果是I2C总线的残留值,不代表实际写入的寄存器内容,不能用作校验依据。


解决方法

调整写入数值的字节序,把待写入的12位值左移4位后,交换高低字节再传入写接口即可,代码示例:

void AnalogOutput::updateValue(int value) { 
    // value为0~4095的12位待设置值
    uint16_t raw_val = (uint16_t)value << 4;
    // 交换高低字节适配pigpio的SMBus字节序
    uint16_t swap_val = (raw_val >> 8) | (raw_val << 8);
    i2c_write_word_data(my_pi_device, my_handler, 0xB0, swap_val);
}

验证方案

直接测量DAC输出电压校验即可:

  • 写入value=0时输出接近0V
  • 写入value=2048(0x800)时输出约2V
  • 写入value=4095(0xFFF)时输出约4V

内容的提问来源于stack exchange,提问作者buloz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 09:21:00