|
|
  |
Отзовитесь кто работал с ЦАП TLV5638 |
|
|
|
Oct 6 2010, 01:43
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 6-10-10
Пользователь №: 59 954

|
Доброй ночи. Честно говоря, не знаю в тот ли раздел написал (по ЦАП конкретного раздела не нашел)... В общем, нужен человек, руками щупавший сабжевый ЦАП. У меня с ним какие-то большие и очень странные непонятки...
|
|
|
|
|
Oct 6 2010, 21:40
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 6-10-10
Пользователь №: 59 954

|
Блин, ну не просто так же спрашиваю человека, который "щупал". Ибо сам я со стажем и достаточно большим... Ну да ладно, раз так — значит так.
Есть девайсина сабжевая (даташит, кому интересен вопрос, можно найти на сайте TI). Питается от 3.3 вольт, интерфейсится с МК по SPI. Я провожу стандартную по даташиту операцию: 1) конфигурирую опору на 1,024 вольта, используя встроенный опорник 2) пишу значение (пускай будет 2048) в буфер для канала Б 3) пишу значение в канал А (пускай, опять же, 2048) + эта же команда одновременно должна переносить значение из буфера в канал Б (типа, что бы синхронно все было)
В результате имею положенные 1,024 вольта на выходе А и хрен с маслом на выходе Б... Непонятно.
Если использую другую команду, которая выводит сразу в канал Б (плюс должна какбе сохранять это же значение в буфер), то на канале Б все шоколадно, как положено. Если после этого опять пишу в А + в Б из буфера, то снова получается картина описанная выше... Воркэраунд ввиде "сначала записать в А, а потом в Б разными командами" невозможен: при записи в один канал другой сбрасывается.
Все данные вывожу строго по даташиту. Режим вывода пробовал и быстрый, и медленный. Режим SPI правильный (пробовал все 2 возможных), тайминги перемерил осциллографом — все четко, как у пацанов на районе...
Создается впечатление, чо неправильно функционирует буфер на микросхеме (либо не читается, либо не пишется). Перепробовал 3 разных микросхемы из разных магазинов (по 400 рублей каждая + корпус SO, так что назад не вернуть, а ZIF-колодки нет). НО, видимо, толку мало, т.к. реально, походу, поставщик один и серия одна... В службе поддержки TI, мягко говоря, разбираться не сильно хотят — проект не промышленного масштаба, так что им на все это положить, по большому счету (делаю выводы из разговора со "спецом" их службы поддержки).
Заказал в TI сэмплы. Придут нескоро. Проект уже, мягко говоря, подгорает...
Вот такие непонятки.
|
|
|
|
|
Oct 7 2010, 01:14
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(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 работа синхронного вывода в оба канала описана одинаково.
|
|
|
|
|
Oct 7 2010, 06:31
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 6-10-10
Пользователь №: 59 954

|
Хорошо, что же тогда происходит?
Да, про SPI. Два возможных режима, только те, которые можно использовать для работы с этой МС — 2 и 1. Но это не принципиально, пототму, что коммуникации работают нормально (команды-то она принимает).
|
|
|
|
|
Oct 7 2010, 10:39
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(Dark Simpson @ Oct 7 2010, 10:31)  (команды-то она принимает). Из Вашего описания можно сделать вывод что ЦАП принимает команды неправильно или что более вероятно они неправильно передаются. Показывайте код. Анатолий.
|
|
|
|
|
Oct 7 2010, 13:22
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

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

Группа: Участник
Сообщений: 15
Регистрация: 6-10-10
Пользователь №: 59 954

|
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 Я так подозреваю, что следующим пунктом будут попрошены осциллограммы?
|
|
|
|
|
Oct 7 2010, 21:39
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Dark Simpson @ Oct 8 2010, 03:09)  Swordfish Basic  Жесть! Ну да чего в жизни не бывает Цитата(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, если передача еще не завершена?
|
|
|
|
|
Oct 7 2010, 22:14
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 6-10-10
Пользователь №: 59 954

|
Все, нашел косяк. Извиняюсь за возможный излишний гонор и благодарю за то, что заставили меня-таки усомниться в своей правоте  Мой косяк заключался в том, что я совершенно упустил тот момент, что после семплирования АЦПшкой последнего (нулевого) бита по спаду, должен происходить еще один фронт на SCK, перед тем, как поднимется CS... Вот это и было фатально. Получалось, что часть логики АЦПшки отрабатывала (за канал А), а другая часть ожидала фронта, который так и не приходил... Второй косяк заключался в достаточно вольном трактовании разработчиком компилятора режимов SPI. Таким образом, как мне казалось, я пробовал режим 1 и режим 2, а на самом деле вместо режима 2 был режим 3 (а осциллографом в этот момент я, увы, не посмотрел — наблюдал активно и вымерял тайминги только в режиме 1). Почему я выбрал режим 1 не знаю. Видимо, смутило то, что свободное состояние SCK может быть нулевым и семплирование идет по спаду. Но необходимый при этом дополнительный импульс в конце я упустил  В общем, установил я жестко битами в регистрах режим 2 и оно все заработало. Так что, еще раз огромное спасибо! Пойду переписывать штатный модуль SPI по нормальному... Да, за одно уж, на всякий случай: SPI.WriteByte делает первое, т.е. чекает, передает и снова чекает (и только потом передает управление назад). Так что там все стерильно, тем больее, на этот предмнет я осцилом смотрел внимательно (это было у меня самое первое предположение, что что-то, возможно, недопередается).
|
|
|
|
|
Oct 7 2010, 22:28
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 6-10-10
Пользователь №: 59 954

|
Спасибо!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|