Dark Simpson 0 6 октября, 2010 Опубликовано 6 октября, 2010 · Жалоба Доброй ночи. Честно говоря, не знаю в тот ли раздел написал (по ЦАП конкретного раздела не нашел)... В общем, нужен человек, руками щупавший сабжевый ЦАП. У меня с ним какие-то большие и очень странные непонятки... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 6 октября, 2010 Опубликовано 6 октября, 2010 · Жалоба Опишите здесь ваши "большие и очень странные непонятки", т.к. опытному человеку не обязательно нужно "щупать вживую" объект исследования. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dark Simpson 0 6 октября, 2010 Опубликовано 6 октября, 2010 · Жалоба Блин, ну не просто так же спрашиваю человека, который "щупал". Ибо сам я со стажем и достаточно большим... Ну да ладно, раз так — значит так. Есть девайсина сабжевая (даташит, кому интересен вопрос, можно найти на сайте TI). Питается от 3.3 вольт, интерфейсится с МК по SPI. Я провожу стандартную по даташиту операцию: 1) конфигурирую опору на 1,024 вольта, используя встроенный опорник 2) пишу значение (пускай будет 2048) в буфер для канала Б 3) пишу значение в канал А (пускай, опять же, 2048) + эта же команда одновременно должна переносить значение из буфера в канал Б (типа, что бы синхронно все было) В результате имею положенные 1,024 вольта на выходе А и хрен с маслом на выходе Б... Непонятно. Если использую другую команду, которая выводит сразу в канал Б (плюс должна какбе сохранять это же значение в буфер), то на канале Б все шоколадно, как положено. Если после этого опять пишу в А + в Б из буфера, то снова получается картина описанная выше... Воркэраунд ввиде "сначала записать в А, а потом в Б разными командами" невозможен: при записи в один канал другой сбрасывается. Все данные вывожу строго по даташиту. Режим вывода пробовал и быстрый, и медленный. Режим SPI правильный (пробовал все 2 возможных), тайминги перемерил осциллографом — все четко, как у пацанов на районе... Создается впечатление, чо неправильно функционирует буфер на микросхеме (либо не читается, либо не пишется). Перепробовал 3 разных микросхемы из разных магазинов (по 400 рублей каждая + корпус SO, так что назад не вернуть, а ZIF-колодки нет). НО, видимо, толку мало, т.к. реально, походу, поставщик один и серия одна... В службе поддержки TI, мягко говоря, разбираться не сильно хотят — проект не промышленного масштаба, так что им на все это положить, по большому счету (делаю выводы из разговора со "спецом" их службы поддержки). Заказал в TI сэмплы. Придут нескоро. Проект уже, мягко говоря, подгорает... Вот такие непонятки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 7 октября, 2010 Опубликовано 7 октября, 2010 · Жалоба Все данные вывожу строго по даташиту. Режим вывода пробовал и быстрый, и медленный. Режим SPI правильный (пробовал все 2 возможных), тайминги перемерил осциллографом — все четко, как у пацанов на районе...Вообще-то у SPI 4 возможных режима, а не 2. Какой именно вы используете? Создается впечатление, чо неправильно функционирует буфер на микросхеме (либо не читается, либо не пишется). Перепробовал 3 разных микросхемы из разных магазинов (по 400 рублей каждая + корпус SO, так что назад не вернуть, а ZIF-колодки нет). НО, видимо, толку мало, т.к. реально, походу, поставщик один и серия одна...Т.е. вы грешите на контрафактные м/с? Невероятно, чтобы TI выпускала целую серию м/с которые не работают. И маловероятно, чтобы они работали не так, как это описано в нескольких datasheets. Потому, что во всех datasheets для ЦАП серии TLV56xx работа синхронного вывода в оба канала описана одинаково. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dark Simpson 0 7 октября, 2010 Опубликовано 7 октября, 2010 · Жалоба Хорошо, что же тогда происходит? Да, про SPI. Два возможных режима, только те, которые можно использовать для работы с этой МС — 2 и 1. Но это не принципиально, пототму, что коммуникации работают нормально (команды-то она принимает). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aesok 0 7 октября, 2010 Опубликовано 7 октября, 2010 · Жалоба (команды-то она принимает). Из Вашего описания можно сделать вывод что ЦАП принимает команды неправильно или что более вероятно они неправильно передаются. Показывайте код. Анатолий. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 7 октября, 2010 Опубликовано 7 октября, 2010 · Жалоба Два возможных режима, только те, которые можно использовать для работы с этой МС — 2 и 1.Судя по диаграммам, д.б. режим 2 (SPI mode 2). Но это не принципиально, пототму, что коммуникации работают нормально (команды-то она принимает).В этом (правильное восприятие команд) есть некоторые сомнения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dark Simpson 0 7 октября, 2010 Опубликовано 7 октября, 2010 · Жалоба 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 0 7 октября, 2010 Опубликовано 7 октября, 2010 · Жалоба Swordfish Basic :07: Жесть! Ну да чего в жизни не бывает Штатные модули работы с 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 0 7 октября, 2010 Опубликовано 7 октября, 2010 · Жалоба Все, нашел косяк. Извиняюсь за возможный излишний гонор и благодарю за то, что заставили меня-таки усомниться в своей правоте :) Мой косяк заключался в том, что я совершенно упустил тот момент, что после семплирования АЦПшкой последнего (нулевого) бита по спаду, должен происходить еще один фронт на SCK, перед тем, как поднимется CS... Вот это и было фатально. Получалось, что часть логики АЦПшки отрабатывала (за канал А), а другая часть ожидала фронта, который так и не приходил... Второй косяк заключался в достаточно вольном трактовании разработчиком компилятора режимов SPI. Таким образом, как мне казалось, я пробовал режим 1 и режим 2, а на самом деле вместо режима 2 был режим 3 (а осциллографом в этот момент я, увы, не посмотрел — наблюдал активно и вымерял тайминги только в режиме 1). Почему я выбрал режим 1 не знаю. Видимо, смутило то, что свободное состояние SCK может быть нулевым и семплирование идет по спаду. Но необходимый при этом дополнительный импульс в конце я упустил :( В общем, установил я жестко битами в регистрах режим 2 и оно все заработало. Так что, еще раз огромное спасибо! Пойду переписывать штатный модуль SPI по нормальному... Да, за одно уж, на всякий случай: SPI.WriteByte делает первое, т.е. чекает, передает и снова чекает (и только потом передает управление назад). Так что там все стерильно, тем больее, на этот предмнет я осцилом смотрел внимательно (это было у меня самое первое предположение, что что-то, возможно, недопередается). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 7 октября, 2010 Опубликовано 7 октября, 2010 · Жалоба Errare humnnum est - человеку свойственно ошибаться. Совершать ошибки не есть какой-то грех или порок, гораздо важнее уметь признавать их ;) Удачи вам и окончательной победы на этими злосчастными полупроводниками! :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dark Simpson 0 7 октября, 2010 Опубликовано 7 октября, 2010 · Жалоба Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться