MaFIA 0 4 октября, 2006 Опубликовано 4 октября, 2006 · Жалоба Понимаю, что этот вопрос надо писать в разделе для чайников, но спрошу здесь. Есть проэкт на данной микросхеме (9959) все сигналы на нее приходят вроде правильно. Клок приходит, на ноге syncclock я, как и написано в glat вижу его, поделенный на 4. теперь пытаюсь ее запрограммировать. Подаю ресет(1мс) для сброса, CS вниз, IO update тоже вниз. передаю 5 байт ( первый байт - номер регистра (0х4) затем 4 байта настройка выходной частоты. затем поднимаю ioupdate и снимаю CS. Все. Но никакой реакции на выходе не получаю. Что я делаб не так??? Уже третий день сижу как дурак, а толку ноль. Любые, пусть даже самые нетривиальные мысли приветствуются. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Михаил М. 0 4 октября, 2006 Опубликовано 4 октября, 2006 · Жалоба 1) После Reset обнуляются ВСЕ регистры, в том числе и регистр управления тактированием Clkmodeselect, который определяет использование внутреннего аппаратного умножителя тактовой и его значение (от 4 до 20) - очень похоже на причину отказа. Попробуйте не сбрасывать, а обходиться IO_Update и CS. 2) Проверьте настройки остальных регистров. 3) Желательно контролировать состояние пинов IO_Update и CS? (кстати, CS инверсный: для передачи данных нужно подавать 0) - логическим анализатором или осциллографом; 4) Сменить интерфейс загрузки - SPI на TWI или наоборот :-)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MaFIA 0 5 октября, 2006 Опубликовано 5 октября, 2006 · Жалоба 1) После Reset обнуляются ВСЕ регистры, в том числе и регистр управления тактированием Clkmodeselect, который определяет использование внутреннего аппаратного умножителя тактовой и его значение (от 4 до 20) - очень похоже на причину отказа. Попробуйте не сбрасывать, а обходиться IO_Update и CS. 2) Проверьте настройки остальных регистров. 3) Желательно контролировать состояние пинов IO_Update и CS? (кстати, CS инверсный: для передачи данных нужно подавать 0) - логическим анализатором или осциллографом; 4) Сменить интерфейс загрузки - SPI на TWI или наоборот :-)) После долгого копания удалось добиться, что pll начала программироваться, могу управлять выдачей всех синкклоков и включать-выключать DAC. Причем при его выключении на его ноге появляется напряжение подтяжки. при включении - ноль. сигнала нет. сдается мне, что дело в регистре амплитуды, но никак не могу с ним разобраться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Михаил М. 0 5 октября, 2006 Опубликовано 5 октября, 2006 · Жалоба Посмотрите настройки Control Function Register 1 (CFR1) - в нем есть 4-й бит "разрешение выхода синуса" (Enable Sine Output - должен быть установлен в 1) и 2-й бит "Очистка аккумулятора фазы" (Clear Phase Accum. - в 0) - проверьте их настройку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MaFIA 0 5 октября, 2006 Опубликовано 5 октября, 2006 · Жалоба Посмотрите настройки Control Function Register 1 (CFR1) - в нем есть 4-й бит "разрешение выхода синуса" (Enable Sine Output - должен быть установлен в 1) и 2-й бит "Очистка аккумулятора фазы" (Clear Phase Accum. - в 0) - проверьте их настройку. Вы ничего не путаете? В регистре CFR есть бит enable sinus output, но он нулевой(по номеру) и определет лишь выдачу либо синуса либо косинуса. Еще вопрос - вы с этой или подобной микросхемой работали или читаете пдф? если работали не осталось ли у вас куска кода? заранее спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Михаил М. 0 6 октября, 2006 Опубликовано 6 октября, 2006 · Жалоба Путаю, видимо - у меня 9951. Код ещё не написал, в процессе. Вы уже пользовались девичей утилитой ADIsimDDS - если нет, посмотрите http://designtools.analog.com/dtDDSWeb/dtD...spx?part=AD9958 Правда, готовый код для мк она не выдаст...( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khach 33 6 октября, 2006 Опубликовано 6 октября, 2006 · Жалоба Тут есть исходники на AD9954, но для PIChttp://www.kd7lmo.net/picobeacon.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MaFIA 0 6 октября, 2006 Опубликовано 6 октября, 2006 · Жалоба 2Миша - эта приблуда от analoga слов нет одни эмоции. когда я год назад делал проэкт на 9834 она была не в пример лучше. все прям по регистрам. красота. 2khach Спасибо. сижу разгребаю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Camelot 0 6 октября, 2006 Опубликовано 6 октября, 2006 · Жалоба Может поможет этот код, здесь описана последовательность как я инициализирую ДДСку и парочка значений. На 3 аргумент функции записи не обращайте внимание //DDS Register Map #define DDS_CSR_REG 0x00 #define DDS_FR1_REG 0x01 #define DDS_FR2_REG 0x02 #define DDS_CFR_REG 0x03 #define DDS_CTW0_REG 0x04 #define DDS_CPW0_REG 0x05 #define DDS_ACR_REG 0x06 #define DDS_LSR_REG 0x07 #define DDS_RDW_REG 0x08 #define DDS_FDW_REG 0x09 #define DDS_CTW1_REG 0x0A #define Chanel0_Select 0x42 #define Chanel1_Select 0x82 #define ChanelS_Select 0xC2 #define Init_Function_Register1 0x00505000&0x83ffff #define Init_Function_Register2 0x0 #define Init_Function_Register3_0 0x00000301 #define Init_Function_Register3_1 0x00000301 #define StartSweep 0x0080E014 #define StopSweep 0x0000000A int DDS_Init (unsigned int qmult) { unsigned char last=1; unsigned int data; unsigned char f; DDS_WriteData (DDS_CSR_REG, Chanel0_Select, 1); data=qmult&0x1f; data=(Init_Function_Register1&0x83ffff)|(data<<18); DDS_WriteData (DDS_FR1_REG, data, 1); DDS_WriteData (DDS_FR2_REG, Init_Function_Register2, 1); DDS_WriteData (DDS_CFR_REG, Init_Function_Register3_0, last); DDS_IO_Update(); f=DDS_ReadData(DDS_CSR_REG, &data); if (((data&0xFF)!=Chanel0_Select)||(f!=1)) { return f; } DDS_WriteData (DDS_CSR_REG, Chanel1_Select, 1); DDS_WriteData (DDS_CFR_REG, Init_Function_Register3_1, last); DDS_IO_Update(); f=DDS_ReadData(DDS_CSR_REG, &data); if (((data&0xFF)!=Chanel1_Select)||(f!=1)) { return f; } return 1; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MaFIA 0 6 октября, 2006 Опубликовано 6 октября, 2006 (изменено) · Жалоба Я так понял, что это под 9958. не помогло. может я не вижу очевидных вещей? Вот мой кусок кода. Посмотрите его, если не сложно. cs1(0); //chipselect =0 spi(0x00); spi (0xF2); //all chanels en spi(0x01); //clock mult x10 spi (0x28); spi (0x00); spi (0x00); iop(); //io update spi (0x03); //CFR spi (0x00); spi (0x03); spi (0x01); iop(); spi(0x04); // freq code spi (0x01); spi (0x40); spi (0xA2); spi (0x14); iop(); cs1(1); Посылки по SPI я вижу. результат - на выходе даков чистый ноль. При этом на ноге sync clock я как и положено вижу опрный клок умноженый на 10 и деленный на 4. Изменено 6 октября, 2006 пользователем MaFIA Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Camelot 0 6 октября, 2006 Опубликовано 6 октября, 2006 · Жалоба Забыл сказать еще одну вещь :) сорри после Init_DDS void DDS_SetStartFreq (unsigned int startfreq, unsigned int chanel) { if (!chanel) DDS_WriteData (DDS_CSR_REG, Chanel0_Select, 1); else DDS_WriteData (DDS_CSR_REG, Chanel1_Select, 1); DDS_WriteData (DDS_CTW0_REG, startfreq, 1); } void DDS_SetStopFreq (unsigned int stopfreq, unsigned int chanel) { if (!chanel) DDS_WriteData (DDS_CSR_REG, Chanel0_Select, 1); else DDS_WriteData (DDS_CSR_REG, Chanel1_Select, 1); DDS_WriteData (DDS_CTW1_REG, stopfreq, 1); } void DDS_ScanPrepare (STData *td) { DDS_WriteData (DDS_CSR_REG, ChanelS_Select, 1); DDS_WriteData (DDS_CFR_REG, Init_Function_Register3_0 | StopSweep, 1); DDS_IO_Update (); DDS_SetStartFreq (td->StartFreq0, 0); DDS_SetStopFreq (td->StopFreq0, 0); DDS_SetStartFreq (td->StartFreq1, 1); DDS_SetStopFreq (td->StopFreq1, 1); DDS_WriteData (DDS_CSR_REG, ChanelS_Select, 1); DDS_WriteData (DDS_LSR_REG, td->RampRate, 1); DDS_WriteData (DDS_RDW_REG, td->DeltaFreq, 1); DDS_WriteData (DDS_CFR_REG, Init_Function_Register3_0 | StartSweep, 1); DDS_IO_Update (); //Здесь на выходе должны появится сигналы } Это я дал пример для моего случая, но порядок записи в регистры лучше придерживаться. И еще кой какие замечания: 1. IOUPDATE не надо делать после каждой записи в регистр Each set of communication cycles does not require an I/O_UPDATE to be issued. The I/O_UPDATE transfers data from the I/O port buffer to active registers. The I/O_UPDATE can be sent for each communication cycle or can be sent when all serial operations are complete. However, data is not active until an I/O_UPDATE is sent, with the exception of the channel enable bits in the Channel Select Register (CSR). These bits do not require an I/O_UPDATE to be enabled. 2. Записали Вы к примеру в DDS_CSR_REG значение F2, пробовали прочитать обратно? (какой результат) 3. Если не читается (п.2), проверте SDIO(0-3) ноги, в моем случае (AD9958) SDIO_3 должно быть на земле, иначе SPI не работает (я о режиме когда SDIO_2=DO, SDIO_0=DI) Успехов!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MaFIA 0 9 октября, 2006 Опубликовано 9 октября, 2006 · Жалоба из всех регистров читается то, что я туда пишу. Если не сложно структуру Td покажите. Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Camelot 0 9 октября, 2006 Опубликовано 9 октября, 2006 · Жалоба В моем случае ДДСка программируется на линейный свип, ноудвелл. Здесь приводится мой расчет, но Вам думаю врядли это поможет, почитайте доку: typedef struct _STData { unsigned int StartFreq0; unsigned int StopFreq0; unsigned int StartFreq1; unsigned int StopFreq1; unsigned int RampRate; unsigned int DeltaFreq; double fstep; double calcspan; double frspan; } STData; .......... double KCoeff=60; double MCoeff=15; unsigned int timer_reg; double dmod32=4294967296.0; double startfreq; double stopfreq; double tspan=*span; ........ timer_reg = 8; td->RampRate = averen? (timer_reg<<avernum) : timer_reg; td->fstep = 4.0*tspan * (double)timer_reg/((double)packlen * KCoeff * (MCoeff+1) * qmult); td->DeltaFreq = (unsigned int)(td->fstep*dmod32/(Synt_clock_freq*qmult) + 0.5); //Delta Freq td->calcspan = (double)td->DeltaFreq*(Synt_clock_freq*qmult)*((double)(packlen*KCoeff*(MCoeff+1)*qmult))/(4.0*dmod32*((double)timer_reg)); *span = td->calcspan; td->frspan=td->calcspan; startfreq = td->BaseFreq - td->calcspan/2.0; stopfreq = td->BaseFreq + td->calcspan/2.0; td->StartFreq0 = (unsigned int)(startfreq/(Synt_clock_freq*qmult)*dmod32+0.5); td->StopFreq0 = (unsigned int)(stopfreq/(Synt_clock_freq*qmult)*dmod32+0.5); td->StartFreq1 = (unsigned int)((startfreq+dfreq)/(Synt_clock_freq*qmult)*dmod32+0.5); td->StopFreq1 = (unsigned int)((stopfreq+dfreq)/(Synt_clock_freq*qmult)*dmod32+0.5); ........... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MaFIA 0 11 октября, 2006 Опубликовано 11 октября, 2006 · Жалоба ВСЕ!!! победил. Дело было не в бобине :) оказалось, что я вместо 50омных резисторов подтяжки выхода запаял 1.8к. вот и все. Огромное спасибо всем откликнувшимся! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться