SPIDEV на Raspberry Pi для TI DAC8568 не работает, как ожидалось

У меня есть Texas Instruments DAC8568 в их упаковке BOOST. DAC8568 - это 8-канальный 16-битный ЦАП с интерфейсом SPI. В пакете BOOST есть заголовки для подключения к моему raspberry pi, а также светодиодные индикаторы, подключенные к выходному напряжению, так что вы можете легко проверить, выполняет ли ваш код то, что вы думаете. Ссылки на пакет BOOST и таблицу данных DAC8568 находятся в моем коде Python ниже.

У меня есть пакет, подключенный к Raspberry Pi с источником питания 3,3 В, источником питания 5 В (необходим для светодиодов) и заземлением. DACs SCLK переходит к Pi SCLK, DAC /SYNC (который на самом деле является выбором микросхемы) - к Pi CE1, DAC /LDAC - к Pi Gnd, а DAC MOSI - к Pi MOSI. Я не подключаю ЦАП /CLR, но я могу физически подключить его к земле, чтобы сбросить чип, если мне нужно.

Я считаю, что у меня хорошая проводка, потому что я могу зажечь светодиоды либо скриптом на питоне, либо из терминала, используя: sudo echo -ne "\xXX\xXX\xXX\xXX" > /dev/spidev0.1

Из этого видео я узнал о терминальном трюке: https://www.youtube.com/watch?v=iwzXh2V1SP4

Моя проблема, однако, заключается в том, что светодиоды не горят так, как я ожидал, согласно спецификации. Я должен был зажечь A, но вместо этого я зажег B. Я должен зажечь B, но вместо этого я зажег D и т. Д. Я попытался все это осмыслить и могу затемнить светодиоды и включить новые, но не так, как я действительно ожидал бы, что это будет работать в соответствии с таблицей.

Ниже мой скрипт на 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

1 ответ

Решение

Комментарий: биты сдвинуты.... как... компенсировать сдвиг или устранить сдвиг?

Это может быть в случае, если SPIDIV.mode не синхронизирован с ЦАП.

Страница данных DAC 6/7:
Этот вход является сигналом синхронизации кадра для входных данных.
Когда SYNC становится низким, он включает регистрацию сдвига на входе, и данные выбираются по последующим падающим фронтам синхронизации SYNC.
Выход ЦАП обновляется после 32 часов.

Справка: полярность и фаза часов

В соответствии с вышеизложенным и временной диаграммой я прихожу к выводу, что SPDIV.mode == 2это право.

  1. Проверьте фактическое SPDIV.mode
  2. Изменить на SPDIV.mode = 2

Я могу подтвердить ваши использованные ценности, прочитав таблицу 11.
Запись во входной регистр - ЦАП канал X
Мой пример установлен Feature Bits = 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) - это первый бит, который загружается в регистр сдвига ЦАП и всегда должен быть установлен в "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)
Другие вопросы по тегам