Перейти к содержанию
    

Отзовитесь кто работал с ЦАП TLV5638

Доброй ночи.

Честно говоря, не знаю в тот ли раздел написал (по ЦАП конкретного раздела не нашел)...

В общем, нужен человек, руками щупавший сабжевый ЦАП. У меня с ним какие-то большие и очень странные непонятки...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Опишите здесь ваши "большие и очень странные непонятки", т.к. опытному человеку не обязательно нужно "щупать вживую" объект исследования.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Блин, ну не просто так же спрашиваю человека, который "щупал". Ибо сам я со стажем и достаточно большим... Ну да ладно, раз так — значит так.

 

Есть девайсина сабжевая (даташит, кому интересен вопрос, можно найти на сайте TI). Питается от 3.3 вольт, интерфейсится с МК по SPI.

Я провожу стандартную по даташиту операцию:

1) конфигурирую опору на 1,024 вольта, используя встроенный опорник

2) пишу значение (пускай будет 2048) в буфер для канала Б

3) пишу значение в канал А (пускай, опять же, 2048) + эта же команда одновременно должна переносить значение из буфера в канал Б (типа, что бы синхронно все было)

 

В результате имею положенные 1,024 вольта на выходе А и хрен с маслом на выходе Б... Непонятно.

 

Если использую другую команду, которая выводит сразу в канал Б (плюс должна какбе сохранять это же значение в буфер), то на канале Б все шоколадно, как положено. Если после этого опять пишу в А + в Б из буфера, то снова получается картина описанная выше...

Воркэраунд ввиде "сначала записать в А, а потом в Б разными командами" невозможен: при записи в один канал другой сбрасывается.

 

Все данные вывожу строго по даташиту. Режим вывода пробовал и быстрый, и медленный. Режим SPI правильный (пробовал все 2 возможных), тайминги перемерил осциллографом — все четко, как у пацанов на районе...

 

Создается впечатление, чо неправильно функционирует буфер на микросхеме (либо не читается, либо не пишется). Перепробовал 3 разных микросхемы из разных магазинов (по 400 рублей каждая + корпус SO, так что назад не вернуть, а ZIF-колодки нет). НО, видимо, толку мало, т.к. реально, походу, поставщик один и серия одна...

В службе поддержки TI, мягко говоря, разбираться не сильно хотят — проект не промышленного масштаба, так что им на все это положить, по большому счету (делаю выводы из разговора со "спецом" их службы поддержки).

 

Заказал в TI сэмплы. Придут нескоро. Проект уже, мягко говоря, подгорает...

 

Вот такие непонятки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все данные вывожу строго по даташиту. Режим вывода пробовал и быстрый, и медленный. Режим SPI правильный (пробовал все 2 возможных), тайминги перемерил осциллографом — все четко, как у пацанов на районе...
Вообще-то у SPI 4 возможных режима, а не 2. Какой именно вы используете?

Создается впечатление, чо неправильно функционирует буфер на микросхеме (либо не читается, либо не пишется). Перепробовал 3 разных микросхемы из разных магазинов (по 400 рублей каждая + корпус SO, так что назад не вернуть, а ZIF-колодки нет). НО, видимо, толку мало, т.к. реально, походу, поставщик один и серия одна...
Т.е. вы грешите на контрафактные м/с? Невероятно, чтобы TI выпускала целую серию м/с которые не работают. И маловероятно, чтобы они работали не так, как это описано в нескольких datasheets. Потому, что во всех datasheets для ЦАП серии TLV56xx работа синхронного вывода в оба канала описана одинаково.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хорошо, что же тогда происходит?

 

Да, про SPI. Два возможных режима, только те, которые можно использовать для работы с этой МС — 2 и 1. Но это не принципиально, пототму, что коммуникации работают нормально (команды-то она принимает).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

(команды-то она принимает).

 

Из Вашего описания можно сделать вывод что ЦАП принимает команды неправильно или что более вероятно они неправильно передаются.

 

Показывайте код.

 

Анатолий.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Два возможных режима, только те, которые можно использовать для работы с этой МС — 2 и 1.
Судя по диаграммам, д.б. режим 2 (SPI mode 2).

Но это не принципиально, пототму, что коммуникации работают нормально (команды-то она принимает).
В этом (правильное восприятие команд) есть некоторые сомнения.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Swordfish Basic

Штатные модули работы с SPI под сомнение не ставим, ибо а) пробовал не использовать модули и делать на асме (с аюсолютно тем же результатом) и б) два других компонента на плате — ОЗУ и SD-карта отлично работают. И вообще все всегда работало. Проблема только с этим ЦАП.

 

Program Test
Device = 18F2550
Clock = 24
Config //8M crystal
  PLLDIV = 2, //4M for PLL
  USBDIV = 2, //48M use PLL/2
  CPUDIV = OSC3_PLL4, //For PLL - 24M
  FOSC = HSPLL_HS, //HS with PLL
  VREGEN = ON,
  MCLRE = OFF,
  PWRT = ON,
  BOR = OFF, //!!!
  BORV = 2, //!!!
  WDT = OFF,
  WDTPS = 32 //128 msec
  
//#option WDT = false
  
Const ipLow = 1
Const ipHigh = 2

#option SPI_SCK = PORTB.1
#option SPI_SDI = PORTB.0
#option SPI_SDO = PORTC.7

Include "System"
Include "Utils"
Include "SPI"

Dim ACT_LED As PORTB.5

Dim ADC_nCS As PORTC.2

//////////////////////////////////////////////////////////

Sub InitHW()
  //Set all ports to digital operation
  SetAllDigital()
  //Set port pins direction
  Output(ACT_LED)
  Output(ADC_nCS)
  //Deselect chip
  ADC_nCS = 1
End Sub

Sub InitSPI()
  SPI.SetAsMaster(spiOscDiv16) //24M/16=1.5Mbps
  SPI.SetSample(spiSampleMiddle) //Default
End Sub

///////////////

Sub ADC_SetSPImode()
  SPI.Enabled = false
  SPI.SetClock(spiIdleLow, spiFallingEdge) //SPI mode 1
  SPI.Enabled = true
End Sub

Sub ADC_Write(Data As Word)
  ADC_nCS = 0
  SPI.WriteByte(Data.Byte1)
  SPI.WriteByte(Data.Byte0)
  ADC_nCS = 1
End Sub

Sub ADC_Init()
  //Set 1.024 volts reference and Fast mode
  ADC_Write(%1001000000000001)
End Sub

Sub ADC_OutAB(A As Word, B As Word)
  Dim Temp As Word
  //
  //Write B to Buffer
  Temp = (B And $0FFF) Or %0001000000000000
  ADC_Write(Temp)
  //Out A as A and Buffer as B
  Temp = (A And $0FFF) Or %1000000000000000 
  ADC_Write(Temp)
End Sub

//***********************************************
//************ Start of program *****************
//***********************************************
InitHW
InitSPI
//
ACT_LED = 0
//
ADC_SetSPImode()
ADC_Init()
//Main loop
While True
  ADC_OutAB(4095, 4095)
  Delayms(100)
Wend

End

 

Я так подозреваю, что следующим пунктом будут попрошены осциллограммы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Swordfish Basic
:07: Жесть! Ну да чего в жизни не бывает :biggrin:

Штатные модули работы с SPI под сомнение не ставим, ибо
А я поставлю под сомнение. Если не сам модуль, то ваше вольное обращение с ним. Вот здесь

Sub ADC_Write(Data As Word)

ADC_nCS = 0

SPI.WriteByte(Data.Byte1)

SPI.WriteByte(Data.Byte0)

ADC_nCS = 1

End Sub

Функция SPI.WriteByte что делает? Проверяет буфер модуля SPI на готовность, при необходимости ждет готовности, затем засылает байт в буфер SPI, ждет окончания передачи его и только затем возвращается? Или только засылает байт в буфер без ожидания его готовности и подтверждения окончания передачи? Если второе, то извините, а какое право вы имеете деактивировать CS, если передача еще не завершена?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все, нашел косяк.

Извиняюсь за возможный излишний гонор и благодарю за то, что заставили меня-таки усомниться в своей правоте :)

Мой косяк заключался в том, что я совершенно упустил тот момент, что после семплирования АЦПшкой последнего (нулевого) бита по спаду, должен происходить еще один фронт на SCK, перед тем, как поднимется CS... Вот это и было фатально. Получалось, что часть логики АЦПшки отрабатывала (за канал А), а другая часть ожидала фронта, который так и не приходил...

Второй косяк заключался в достаточно вольном трактовании разработчиком компилятора режимов SPI. Таким образом, как мне казалось, я пробовал режим 1 и режим 2, а на самом деле вместо режима 2 был режим 3 (а осциллографом в этот момент я, увы, не посмотрел — наблюдал активно и вымерял тайминги только в режиме 1). Почему я выбрал режим 1 не знаю. Видимо, смутило то, что свободное состояние SCK может быть нулевым и семплирование идет по спаду. Но необходимый при этом дополнительный импульс в конце я упустил :(

В общем, установил я жестко битами в регистрах режим 2 и оно все заработало. Так что, еще раз огромное спасибо! Пойду переписывать штатный модуль SPI по нормальному...

 

Да, за одно уж, на всякий случай: SPI.WriteByte делает первое, т.е. чекает, передает и снова чекает (и только потом передает управление назад). Так что там все стерильно, тем больее, на этот предмнет я осцилом смотрел внимательно (это было у меня самое первое предположение, что что-то, возможно, недопередается).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Errare humnnum est - человеку свойственно ошибаться. Совершать ошибки не есть какой-то грех или порок, гораздо важнее уметь признавать их ;) Удачи вам и окончательной победы на этими злосчастными полупроводниками! :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...