MAX5825满量程8位



我使用MAX5825作为RPi的外部DAC。
根据数据表,该组件的分辨率为12位。
当我阅读时,我应该写入我想要在CODEn (0x8n)寄存器中设置的值,n是我想要设置的DAC通道,然后在LOADn (0x9n)寄存器中写入任何内容,或者使用CODEn_LOADn (0xBn)寄存器一步完成。请参阅此处的数据摘录。
我正在使用pigpio守护程序库接口I²C通信

void AnalogOutput::updateValue(int value) { 
i2c_write_word_data(my_pi_device, my_handler, 0xB0, value << 4);
} 
这应该将我的CODE0寄存器设置为参数。
然而,我有一个奇怪的行为,所以我试图从CODEn (0x80)寄存器读取数据,以观察我的设置尝试是否正确。
i2c_read_word_data(my_pi_device, my_handler, 0x80);

我不确定我可以从命令寄存器中读取值,但是当我的值超过0xFF时,我从I²C读取得到的返回看起来像值&0 xff。(即当我将寄存器设置为0xFF时,我在寄存器中读取0xFF,当我将寄存器设置为0x100时,我读取0x00)
此外,当CODEn寄存器设置为0xFF时,我的DAC0通道的输出电压处于最大刻度。我使用4.0V内部参考,当我将设置为0xFF时,输出电压为4.0V左右。
我不明白为什么0xFF是12位分辨率DAC的最大比例?我是否错过了配置分辨率或类似的方法?
我已经试过了:

  • 删除<<4 .在设定值上移位:
  • 行为没有变化
  • 反转写到CODEn寄存器的LSByte和MSByte(我见过)在pipid API SMBus标准上,应该先发送LSByte,然后发送MSByte在单词写入程序中):读取CODEn寄存器为跳过0x0FFF值。MAX5825应该兼容
  • 使用i2c_write_block_data代替i2c_write_word_data函数的行为。

感谢您的宝贵时间!

参考资料:
MAX5825 datasheet: https://datasheets.maximintegrated.com/en/ds/MAX5823-MAX5825.pdf
pigpio API: https://abyz.me.uk/rpi/pigpio/pdif2.html

我用i2cget &i2cset,我对LSByte的假设MSByte是对的。
CODEn寄存器被12个MSB填充。这意味着需要通过:0xABC0将设置值0x0ABC存储在CODEn寄存器中。pigpio遵循SMBus标准先用LSByte发送I²C字消息,然后用MSByte发送,所以如果我通过I²C发送0x0ABC消息,它实际上会发送0xBC0A。当我试图反转LSByte和MSByte时,我正在通过I²C发送消息0xBC0A,因此MAX5825内存储的内容是0x0AB。
一个有效的解决方法是:

void AnalogOutput::updateValue(int value) {
int codeRegisterData = (value >> 4) + ((value & 0xF)<<12);
i2c_write_word_data(my_pi_device, my_handler, 0xB0, codeRegisterData);
}

如果value= 0x0ABC,codeRegisterData将= 0xC0AB,因此pigpio将通过I²C总线将消息0xABC0写入CODEn寄存器。

最新更新