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
相关产品推荐
相关产品推荐

