TI论坛
直播中

张鑫

8年用户 1131经验值
私信 关注
[问答]

DAC8760输出数据最高位发送问题如何解决


      DAC8760输出数据最高位发送问题

DAC8760再次麻烦大家帮帮忙。
在大伙的帮忙下,DAC8760终于可以输出了,但是有遇到了奇怪的问题,当我发送数据寄存器的时候,当发送的数据的最高位为1时,输出值就错了,而且是非常小。比如我用0至20mA档,当发送的数据为0~0x7fff 时,输出正确,当发送大于等于0x8000时,输出都很小,1mA左右。
麻烦大家帮帮,谢谢
写程序:
void DAC8760_write_byte(unsigned char com, unsigned int dat)
{
unsigned char i=0;
    unsigned char h_8bit, l_8bit;
    h_8bit=(uchar)(dat>>8)&0x00FF;//取高8位数据
        l_8bit=(uchar)dat&0x00FF;     //取低8位数据

DAC8760_LATCH_0;

for(i=8;i>0;i--)
{
  DAC8760_SCLK_0;
  if(com&0x80)
  {
   DAC8760_DIN_1;
  }
  else
  {
   DAC8760_DIN_0;
  }
  DAC8760_SCLK_1;
  com<<=1;
}
DAC8760_SCLK_0;
  delay_us(2);
for(i=8;i>0;i--)
{
  DAC8760_SCLK_0;
  if(h_8bit&0x80)
  {
   DAC8760_DIN_1;
  }
  else
  {
   DAC8760_DIN_0;
  }
  DAC8760_SCLK_1;
  h_8bit<<=1;
}
for(i=8;i>0;i--)
{
  DAC8760_SCLK_0;
  if(l_8bit&0x80)
  {
   DAC8760_DIN_1;
  }
  else
  {
   DAC8760_DIN_0;
  }
  DAC8760_SCLK_1;
  l_8bit<<=1;
}
DAC8760_SCLK_0;
DAC8760_LATCH_1;
DAC8760_DIN_1;
}


回帖(2)

张坤

2025-1-20 17:15:33
 你好,
能否将你写入的数据再读出来验证一下?特别是在写入的数据  大于等于0x8000时。
另外,能否将SCLK,DIN,LATCH这几个引脚的时序上传一下? 谢谢!
举报

陈杰

2025-1-20 18:10:04
DAC8760输出数据最高位发送问题可能是由于数据格式不正确或者通信协议问题导致的。以下是一些建议和解决方案:

1. 检查数据格式:确保你发送的数据格式与DAC8760的要求一致。DAC8760通常使用16位数据格式,其中最高位是符号位。如果你的数据最高位为1,那么它将被视为负数,导致输出值变小。你可以尝试将数据转换为补码格式,以确保最高位为1时输出正确的值。

2. 检查通信协议:确保你使用的通信协议(如SPI或I2C)与DAC8760兼容。检查你的通信代码,确保数据传输过程中没有错误。

3. 检查硬件连接:检查DAC8760与微控制器之间的连接,确保所有引脚都正确连接。特别是Vout引脚,确保它没有受到干扰。

4. 检查电源:确保DAC8760的电源电压稳定且在规定的范围内。不稳定的电源可能导致输出值不稳定。

以下是修改后的DAC8760_write_byte函数,用于将数据转换为补码格式:

```c
void DAC8760_write_byte(unsigned char com, unsigned int dat) {
    unsigned char i = 0;
    unsigned char h_8bit, l_8bit;

    // 将数据转换为补码格式
    if (dat & 0x8000) {
        dat = ~dat + 1;
        dat |= 0x8000;
    }

    h_8bit = (unsigned char)(dat >> 8);
    l_8bit = (unsigned char)(dat & 0xFF);

    // 发送控制字节
    for (i = 0; i < 8; i++) {
        // 根据你的通信协议发送控制字节的每一位
    }

    // 发送数据的高8位
    for (i = 0; i < 8; i++) {
        // 根据你的通信协议发送数据的高8位的每一位
    }

    // 发送数据的低8位
    for (i = 0; i < 8; i++) {
        // 根据你的通信协议发送数据的低8位的每一位
    }
}
```

请注意,这个函数只是一个示例,你需要根据你的通信协议(如SPI或I2C)和硬件连接来修改它。希望这些建议能帮助你解决问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分