0

我在他们的 BOOST 分线板包中有一个德州仪器 DAC8568。DAC8568 是一款带有 SPI 接口的 8 通道 16 位 DAC。BOOST 包有用于将其连接到我的树莓派的接头,并且它的 LED 连接到输出电压,因此您可以轻松检查您的代码是否在执行您认为的操作。到 DAC8568 的 BOOST 包和数据表的链接在我下面的 python 代码中。

我用 3.3V 电源、5V 电源(LED 所需)和接地将封装连接到树莓派。DAC SCLK 进入 Pi SCLK,DAC /SYNC(实际上是芯片选择)进入 Pi CE1,DAC /LDAC 进入 Pi Gnd,DAC MOSI 进入 Pi MOSI。我没有为 DAC / CLR 接线,但如果需要,我可以将其物理地接地以重置芯片。

我相信我的接线很好,因为我可以使用 python 脚本或从终端使用以下命令点亮 LED: sudo echo -ne "\xXX\xXX\xXX\xXX" > /dev/spidev0.1

我从这个视频中学到了终端技巧: https ://www.youtube.com/watch?v=iwzXh2V1SP4

不过,我的问题是 LED 没有像我期望的那样根据数据表点亮。我应该点亮 A,但我点亮 B。我应该点亮 B,但我点亮 D,等等。我试图理解这一切,可以调暗 LED 并打开新的 LED,但从不妨碍我真的希望它按照数据表工作。

下面是我的python脚本。在我提到的数据表中我正在寻找要发送的位的评论中。我对使用模拟组件非常陌生,并且不是 EE,所以也许我没有正确地进行计时,或者犯了一些其他愚蠢的错误。也许有人可以查看数据表并查看我的错误,而不必实际拥有芯片。谢谢您的帮助!

# -*- coding: utf-8 -*-
"""
Created on Sat Jul  8 16:33:05 2017

@author: pi

for texas instruments BOOST DAC8568
for BOOST schematic showing LEDs http://www.ti.com/tool/boost-dac8568
for DAC8568 datasheet:  http://www.ti.com/product/dac8568
"""


import spidev
import time

spi = spidev.SpiDev()  #create spi object
spi.open(0,1)  #open spi port 0, device (CS) 1
#spi.bits_per_word = 8  does not seem to matter
#spi.max_speed_hz = 50000000  #does not seem to matter

#you have to power the DAC, you can write to the buffer and later power on if you like
power_up = spi.xfer2([0x04, 0x00, 0x00, 0xFF]) #p.37 Table11 in datasheet: powers all DACS

voltage_write = spi.xfer2([0x00, 0x0F, 0xFF, 0xFF ]) #p.35 Table11 in datasheet supposed write A--but lights B
voltage_write = spi.xfer2([0x00, 0x1F, 0xFF, 0xFF ]) #supposed write B--but lights D
voltage_write = spi.xfer2([0x00, 0x2F, 0xFF, 0xFF ]) #supposed write C--but lights F
voltage_write = spi.xfer2([0x00, 0x3F, 0xFF, 0xFF ]) #supposed write D--but lights H
voltage_write = spi.xfer2([0x00, 0x4F, 0xFF, 0xFF ]) #supposed write E--but does nothing

spi.close() 

以后的读者请注意,上电需要打开内部参考电源,即

power_up = spi.xfer2([0x08, 0x00, 0x00, 0xFF]) #(p.37 datasheet
4

1 回答 1

0

注释:位移位。...如何...补偿偏移或消除偏移?

SPIDIV.mode如果DAC 与 DAC 不同步 ,可能就是这种情况。

DAC 数据表第 6/7 页:
此输入是输入数据的帧同步信号。
当 SYNC 变低时,它启用输入移位寄存器,并在随后的 SYNC 下降时钟沿采样数据。
DAC 输出在第 32 个时钟之后更新。

参考:时钟极性和相位

根据上述和时序图我得出的结论SPDIV.mode == 2 是正确的。

  1. 检查实际SPDIV.mode
  2. 改成SPDIV.mode = 2

我可以通过阅读第 35 页的表 11 来确认您使用的值。
写入输入寄存器 - DAC 通道 X
我的示例设置功能位 = 0

            3         2         1
           10987654321098765432109876543210
           RXXXCCCCAAAADDDDDDDDDDDDDDDDFFFF
A = 32-bit[00000000000011111111111111110000]:0xffff0 ('0x00', '0x0f', '0xff', '0xf0')
            3         2         1
           10987654321098765432109876543210
           RXXXCCCCAAAADDDDDDDDDDDDDDDDFFFF
B = 32-bit[00000000000111111111111111110000]:0x1ffff0 ('0x00', '0x1f', '0xff', '0xf0')

第 33 页: DB31(MSB) 是加载到 DAC 移位寄存器的第一位,必须始终设置为“0”。

接线看起来简单明了,但值得仔细检查。

来自测试的代码片段:

def writeDAC(command, address, data, feature=0x0):
    address = ord(address) - ord('A')
    b1 = command
    b2 = address << 4 | data >> 12          # 4 address Bits and 4 MSB data Bits
    b3 = data >> 4                          # middle 8 Bits of data
    b4 = 0xF0 & (data << 4) >> 8 | feature  # 4 data Bits and feature Bits
    voltage_write = spi.xfer2([b1, b2, b3, b4])

# Usage:
# Write Command=0 Channel=B Data=0xFFFF Default Features=0x0
writeDAC(0, 'B', 0xFFFF)
于 2017-07-10T17:10:54.717 回答