Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Отзовитесь кто работал с ЦАП TLV5638
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры
Dark Simpson
Доброй ночи.
Честно говоря, не знаю в тот ли раздел написал (по ЦАП конкретного раздела не нашел)...
В общем, нужен человек, руками щупавший сабжевый ЦАП. У меня с ним какие-то большие и очень странные непонятки...
rezident
Опишите здесь ваши "большие и очень странные непонятки", т.к. опытному человеку не обязательно нужно "щупать вживую" объект исследования.
Dark Simpson
Блин, ну не просто так же спрашиваю человека, который "щупал". Ибо сам я со стажем и достаточно большим... Ну да ладно, раз так — значит так.

Есть девайсина сабжевая (даташит, кому интересен вопрос, можно найти на сайте TI). Питается от 3.3 вольт, интерфейсится с МК по SPI.
Я провожу стандартную по даташиту операцию:
1) конфигурирую опору на 1,024 вольта, используя встроенный опорник
2) пишу значение (пускай будет 2048) в буфер для канала Б
3) пишу значение в канал А (пускай, опять же, 2048) + эта же команда одновременно должна переносить значение из буфера в канал Б (типа, что бы синхронно все было)

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

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

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

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

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

Вот такие непонятки.
rezident
Цитата(Dark Simpson @ Oct 7 2010, 03:40) *
Все данные вывожу строго по даташиту. Режим вывода пробовал и быстрый, и медленный. Режим SPI правильный (пробовал все 2 возможных), тайминги перемерил осциллографом — все четко, как у пацанов на районе...
Вообще-то у SPI 4 возможных режима, а не 2. Какой именно вы используете?
Цитата(Dark Simpson @ Oct 7 2010, 03:40) *
Создается впечатление, чо неправильно функционирует буфер на микросхеме (либо не читается, либо не пишется). Перепробовал 3 разных микросхемы из разных магазинов (по 400 рублей каждая + корпус SO, так что назад не вернуть, а ZIF-колодки нет). НО, видимо, толку мало, т.к. реально, походу, поставщик один и серия одна...
Т.е. вы грешите на контрафактные м/с? Невероятно, чтобы TI выпускала целую серию м/с которые не работают. И маловероятно, чтобы они работали не так, как это описано в нескольких datasheets. Потому, что во всех datasheets для ЦАП серии TLV56xx работа синхронного вывода в оба канала описана одинаково.
Dark Simpson
Хорошо, что же тогда происходит?

Да, про SPI. Два возможных режима, только те, которые можно использовать для работы с этой МС — 2 и 1. Но это не принципиально, пототму, что коммуникации работают нормально (команды-то она принимает).
aesok
Цитата(Dark Simpson @ Oct 7 2010, 10:31) *
(команды-то она принимает).


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

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

Анатолий.
rezident
Цитата(Dark Simpson @ Oct 7 2010, 12:31) *
Два возможных режима, только те, которые можно использовать для работы с этой МС — 2 и 1.
Судя по диаграммам, д.б. режим 2 (SPI mode 2).
Цитата(Dark Simpson @ Oct 7 2010, 12:31) *
Но это не принципиально, пототму, что коммуникации работают нормально (команды-то она принимает).
В этом (правильное восприятие команд) есть некоторые сомнения.
Dark Simpson
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


Я так подозреваю, что следующим пунктом будут попрошены осциллограммы?
rezident
Цитата(Dark Simpson @ Oct 8 2010, 03:09) *
Swordfish Basic
07.gif Жесть! Ну да чего в жизни не бывает biggrin.gif
Цитата(Dark Simpson @ Oct 8 2010, 03:09) *
Штатные модули работы с 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, если передача еще не завершена?
Dark Simpson
Все, нашел косяк.
Извиняюсь за возможный излишний гонор и благодарю за то, что заставили меня-таки усомниться в своей правоте smile.gif
Мой косяк заключался в том, что я совершенно упустил тот момент, что после семплирования АЦПшкой последнего (нулевого) бита по спаду, должен происходить еще один фронт на SCK, перед тем, как поднимется CS... Вот это и было фатально. Получалось, что часть логики АЦПшки отрабатывала (за канал А), а другая часть ожидала фронта, который так и не приходил...
Второй косяк заключался в достаточно вольном трактовании разработчиком компилятора режимов SPI. Таким образом, как мне казалось, я пробовал режим 1 и режим 2, а на самом деле вместо режима 2 был режим 3 (а осциллографом в этот момент я, увы, не посмотрел — наблюдал активно и вымерял тайминги только в режиме 1). Почему я выбрал режим 1 не знаю. Видимо, смутило то, что свободное состояние SCK может быть нулевым и семплирование идет по спаду. Но необходимый при этом дополнительный импульс в конце я упустил sad.gif
В общем, установил я жестко битами в регистрах режим 2 и оно все заработало. Так что, еще раз огромное спасибо! Пойду переписывать штатный модуль SPI по нормальному...

Да, за одно уж, на всякий случай: SPI.WriteByte делает первое, т.е. чекает, передает и снова чекает (и только потом передает управление назад). Так что там все стерильно, тем больее, на этот предмнет я осцилом смотрел внимательно (это было у меня самое первое предположение, что что-то, возможно, недопередается).
rezident
Errare humnnum est - человеку свойственно ошибаться. Совершать ошибки не есть какой-то грех или порок, гораздо важнее уметь признавать их wink.gif Удачи вам и окончательной победы на этими злосчастными полупроводниками! smile.gif
Dark Simpson
Спасибо!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.