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
это право.
- Проверьте фактическое
SPDIV.mode
- Изменить на
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)