реклама на сайте
подробности

 
 
> программирование AD9954 через SPI посредством ADSP21364
WreWolf
сообщение Aug 25 2009, 16:16
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 10-11-07
Пользователь №: 32 211



В каком формате данные должны посылаться в ДДС,
и что необходимо для начала генерации.

ставлю I/O Synk в 1
Посылаю в MSBF
данные по 3-Wire в CFR1
I/O Update
данные PLL в CFR2
I/O Update
Записываю FTW0
снова I/O Update

где ошибка?
пробовал предварительно записать во все регистры 0x00
не помогло.

Смотрел времянку по которой с ДДС общаеться родной софт от АД. ничего нового не вижу.
Go to the top of the page
 
+Quote Post
3 страниц V  < 1 2 3 >  
Start new topic
Ответов (15 - 29)
WreWolf
сообщение Sep 16 2009, 08:24
Сообщение #16


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 10-11-07
Пользователь №: 32 211



Т.е. вы имеете в виду перед программирование выставлять и SCLK и CS в 1
затем опускать CS в 0 и дергать iosync чтобы начать новый цикл программирования.
единственное еще не пробовал перед циклом программирования дергать iosync
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Sep 16 2009, 08:33
Сообщение #17


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



iosync один раз после завешения переключения интерфейсных частей на свою программу.
Go to the top of the page
 
+Quote Post
WreWolf
сообщение Sep 19 2009, 10:18
Сообщение #18


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 10-11-07
Пользователь №: 32 211



CODE

#include <def21364.h>
.section/dm seg_dmda;
.var FTW0_b[]= 0x04,0xFF,0xAA,0xAA,0xAB;
.var irx= 0x84; // инициализация приема
.var rx_buf[4];
.var rx_tcb1[4] = 0,4,1,rx_buf;
.global _main;
.segment/pm seg_pmco;
_main:


/* Init SPI MASTER TX DMA */
r0=0;
dm(SPICTL)=r0;
dm(SPIFLG)=r0;
dm(SPIDMAC)=r0;
r0=500; dm(SPIBAUD) = r0;
r0=DS0EN; dm(SPIFLG) = r0;
bit set flags FLG1O;
bit clr flags FLG1;
up:
ustat3 = DS0EN;//| /*enable SPI slave device select zero */
//SPIFLG3|SPIFLG2|SPIFLG1|SPIFLG0; /* Set SPIFLG0 low to */
dm(SPIFLG) = ustat3; /*select SPI slave on FLAG0 pin */
/*===FTW0 Transmit===*/
ustat3=0xFF;
dm(SPISTAT)=ustat3;
ustat3=FTW0_b; dm(IISPI)=ustat3;
ustat3=@FTW0_b; dm(CSPI)=ustat3;
ustat3=1; dm(IMSPI)=ustat3;
ustat3 = DMISO|WL8|SPIMS|SPIEN|TIMOD2|MSBF; dm(SPICTL)=ustat3;
ustat3=SPIDEN;
dm(SPIDMAC)=ustat3;
r0=dm(CSPI);
r0=pass r0;
if gt jump (pc,-2);
ustat3=dm(SPISTAT);
bit tst ustat3 SPIF;
if tf jump (pc,-2);
lcntr=12000, do (pc,6) until LCE;
nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;
bit set flags FLG1;
lcntr=240, do (pc,10) until LCE;
nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;
bit clr flags FLG1;
lcntr=8000, do (pc,10) until LCE;
nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;
nop;nop;



//jump up;
//SPI reset
r0=0;
dm(SPICTL)=r0;
dm(SPIFLG)=r0;
dm(SPIDMAC)=r0;
r0=500; dm(SPIBAUD) = r0;
r0=DS0EN; dm(SPIFLG) = r0;

/*===irx Transmit===*/
ustat3=0xFF;
dm(SPISTAT)=ustat3;
ustat3=irx; dm(IISPI)=ustat3;
ustat3=@irx; dm(CSPI)=ustat3;
ustat3=1; dm(IMSPI)=ustat3;
ustat3 = DMISO|WL8|SPIMS|SPIEN|TIMOD2|MSBF; dm(SPICTL)=ustat3;
ustat3=SPIDEN;
dm(SPIDMAC)=ustat3;
r0=0;
dm(SPICTL)=r0;
dm(SPIFLG)=r0;
dm(SPIDMAC)=r0;
r0=500; dm(SPIBAUD) = r0;
r0=DS0EN; dm(SPIFLG) = r0;

ustat3=0xFF;
dm(SPISTAT)=ustat3;

ustat3=rx_buf; dm(IISPI)=ustat3;
ustat3=@rx_buf; dm(CSPI)=ustat3;
ustat3=1; dm(IMSPI)=ustat3;
ustat3 = DMISO|WL8|SPIMS|SPIEN|TIMOD2|MSBF; dm(SPICTL)=ustat3;
ustat3=SPIRCV;
dm(SPIDMAC)=ustat3;
_main.end: jump (pc,0);



деуствую вот так.
дергаю iosync руками после переключения.
ответа все равно никакого нет, впрочем как и генерации
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Sep 19 2009, 12:10
Сообщение #19


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Я не увидел, где в вашей программе дёргается IOUPDATE. Или это на приём?

Цитата
SDIO — Serial Data I/O. Data is always written into the
AD9951 on this pin. However, this pin can be used as a
bidirectional data line. Bit 9 of Register Address 0x00 controls the configuration of this pin. The default is Logic 0, which configures the SDIO pin as bidirectional.


В каком состоянии находится Bit 9 of Register Address 0x00 после программирования?

Сообщение отредактировал Genadi Zawidowski - Sep 19 2009, 12:29
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Sep 19 2009, 14:24
Сообщение #20


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Да, хотел обратить внимание, что команда чтения из регистра 4 не 0x04, а 0x84. После выдчи в чип одного командного байта остальные читать... Чес слово, просто записать пять байтов проще.
Go to the top of the page
 
+Quote Post
WreWolf
сообщение Sep 21 2009, 07:24
Сообщение #21


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 10-11-07
Пользователь №: 32 211



Ну вот это махание ioupdate

bit set flags FLG1;
lcntr=240, do (pc,10) until LCE;
nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;
bit clr flags FLG1;

а так это был полный листинг всего

Вот участок приема.
Инициализации, т.е. отправка 0х84
/*===irx Transmit===*/
ustat3=0xFF;
dm(SPISTAT)=ustat3;
ustat3=irx; dm(IISPI)=ustat3;
ustat3=@irx; dm(CSPI)=ustat3;
ustat3=1; dm(IMSPI)=ustat3;
ustat3 = DMISO|WL8|SPIMS|SPIEN|TIMOD2|MSBF; dm(SPICTL)=ustat3;
ustat3=SPIDEN;
dm(SPIDMAC)=ustat3;
r0=0;
dm(SPICTL)=r0;
dm(SPIFLG)=r0;
dm(SPIDMAC)=r0;
r0=500; dm(SPIBAUD) = r0;
r0=DS0EN; dm(SPIFLG) = r0;

ustat3=0xFF;
dm(SPISTAT)=ustat3;

И прием

ustat3=rx_buf; dm(IISPI)=ustat3;
ustat3=@rx_buf; dm(CSPI)=ustat3;
ustat3=1; dm(IMSPI)=ustat3;
ustat3 = DMISO|WL8|SPIMS|SPIEN|TIMOD2|MSBF; dm(SPICTL)=ustat3;
ustat3=SPIRCV;
dm(SPIDMAC)=ustat3;


П.С.
А считать ничего не получаеться, дергай не дергай iosync перед инициализации приема

Сообщение отредактировал WreWolf - Sep 21 2009, 07:26
Go to the top of the page
 
+Quote Post
WreWolf
сообщение Sep 29 2009, 09:57
Сообщение #22


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 10-11-07
Пользователь №: 32 211



Вот в конце концов родилось такое.
Более читаемый код, и больше прозрачности в работе.
Но вот только никакого результата.

Хотя все сделано по даташиту, может есть еще идеи?
CODE
#include <def21364.h>
.section/dm seg_dmda;
.var CFR1_d[]= 0x00,0x00,0x00,0x02,0x08;
.var CFR2_d[]= 0x01,0x00,0x00,0x44;
.var FTW0_d[]= 0x04,0xAF,0xAA,0xAA,0xAB;
.var irx= 0x84;
.var rx_buf[4];
.var rx_tcb1[4] = 0,4,1,rx_buf;
.global _main;
.segment/pm seg_pmco;
_main:

call init; //Начальная инициализация
up_up:




//Передача данных
call SPI_init;
ustat3=CFR1_d; ustat4=@CFR1_d; //Установка входныхх данных и их длинны
call SPI_init_TX;

call SPI_init;
ustat3=CFR2_d; ustat4=@CFR2_d; //Установка входныхх данных и их длинны
call SPI_init_TX;

call SPI_init;
ustat3=FTW0_d; ustat4=@FTW0_d; //Установка входныхх данных и их длинны
call SPI_init_TX;


//Инициализация
call SPI_init;
ustat3=irx; ustat4=@irx;
call SPI_init_TX;

//и прием данных из DDS
call SPI_init;
ustat3=rx_buf; ustat4=@rx_buf;
call SPI_init_RX;

jump up_up;
_main.end: jump (pc,0);


//Инициализация SPI перед новой транзакцией
SPI_init:
call SPI_reset;
call SPI_init_FLG_reset_error;
rts;

//Инициализация флагов и пр.
init:
bit set flags FLG1O;
bit clr flags FLG1;
call SPI_reset;
call SPI_init_FLG_reset_error;
rts;

//Сброс параметров SPI
SPI_reset:
r0=0; dm(SPICTL)=r0;
dm(SPIFLG)=r0;
dm(SPIDMAC)=r0;
r0=500; dm(SPIBAUD)=r0;
r0=DS0EN; dm(SPIFLG)=r0;
rts;

//Начальная инициализация регистра SPIFLG и сброс ошибок
SPI_init_FLG_reset_error:
r0 = DS0EN|
SPIFLG3|
SPIFLG2|
SPIFLG1|
SPIFLG0; dm(SPIFLG) = ustat3;
ustat3=0x01; dm(SPISTAT)=ustat3;
rts;

//Махание флагом I/O Update
FLAG_IO:
lcntr=12000, do (pc,FLAG_IO1) until LCE;
nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;FLAG_IO1:
bit set flags FLG1;
lcntr=240, do (pc,FLAG_IO2) until LCE;
nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;FLAG_IO2:
bit clr flags FLG1;
lcntr=12000, do (pc,FLAG_IO3) until LCE;
nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;FLAG_IO3:
rts;

//Ожидание окончания передачи/приема
waitSPI:
r0=dm(CSPI);
lcntr=r0, do (pc,waitSPI_c) until LCE;
waitSPI_c:call wait_for_SPIF;
rts;

//Инициализация процесса передачи
SPI_init_TX:
dm(IISPI)=ustat3;
dm(CSPI)=ustat4;
ustat3=1; dm(IMSPI)=ustat3;
ustat3 = DMISO|
WL8|
SPIMS|
SPIEN|
TIMOD2|
MSBF; dm(SPICTL)=ustat3;
ustat3=SPIDEN; dm(SPIDMAC)=ustat3;
call waitSPI;
call FLAG_IO;
rts;

//Инициализация процесса приема
SPI_init_RX:
dm(IISPI)=ustat3;
dm(CSPI)=ustat4;
ustat3=1; dm(IMSPI)=ustat3;
ustat3 = DMISO|
WL8|
SPIMS|
SPIEN|
TIMOD2|
MSBF|
SENDZ; dm(SPICTL)=ustat3;
ustat3 = SPIDEN|
SPIRCV; dm(SPIDMAC)=ustat3;
call waitSPI;
call FLAG_IO;
rts;

//WAIT FOR SPI Transfert 1 Byte
wait_for_SPIF:
ustat1=dm(SPISTAT);
bit tst ustat1 SPIF;
if not tf jump (pc,wait_for_SPIF);
wait_for_SPIF.end:
rts;
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Sep 29 2009, 10:51
Сообщение #23


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Поменяйте полярность SPI. На не по даташиту.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
WreWolf
сообщение Sep 29 2009, 11:17
Сообщение #24


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 10-11-07
Пользователь №: 32 211



Я делаю так. По пунктам.
1 Программирую DDS с компа на 1МГц и устанавливаю бит Автоматической очистки акумулятора фазы( по ДШ он отвечает за автоматическую смену частоты генерации сразу после записи нового управляющего значения в регистр частоты FTW0)
2 Отсоединяю LPT кабель от платы DDS
3 Вешаю перемычку от reset на землю
4 Запрещаю работу логики на плате DDS (пареключаю перемычку) ( перевожу плату в режим Manua Data In)
5 Соединяю 2 платы
a Землю к Земле
b MISO к SDO
c MOSI к SDIO
d CLK к SCLK
e FLAG1_SW1 к FUD_Dut1( I/O Update первого DDS)
f SPDIS к CBS_Dut1 (Chip Select первого DDS)
6 Вручную провожу I/O Sync
7 Запускаю программу на ADSP
8 Контролирую на осциллографе данные
9 Выполняю I/O Update
10 В DDS ничего не меняеться

вот фото передачи данных
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Sep 29 2009, 12:26
Сообщение #25


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Либо данные правильно идут в DSS, либо - неправильно. Третьего не дано (Вообще то дано, конечно - идут НЕ ТЕ ДАННЫЕ и НЕ ТУДА - но этот момент мы исключаем - он не лечится).

Следовательно, данные идут неправильно.
Следовательно, то, что мы делаем якбы правильно - на самом деле - неправильно.
Следвательно, надо сделать все варианты неправильного. Среди них окажется один правильный вариант.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
WreWolf
сообщение Sep 29 2009, 17:12
Сообщение #26


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 10-11-07
Пользователь №: 32 211



ну я тогда даже не знаю
пробовал подать только клок и данные на SDIO
и руками дергать ио апдейт между посылками данных регистров

а при программировании с компа на ножке клока клок, а на SDIO данные
я уже не знаю что делать maniac.gif

Сообщение отредактировал WreWolf - Sep 29 2009, 17:12
Go to the top of the page
 
+Quote Post
WreWolf
сообщение Oct 13 2009, 07:17
Сообщение #27


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 10-11-07
Пользователь №: 32 211



Теперь я научился вчитывать все что записал комп в ддс, но от этого не стало легце.
При попотке записи этой инфы в ддс, он все равно молчит и считать ничего уже не получаеться
Go to the top of the page
 
+Quote Post
Ivan Panov
сообщение Oct 14 2009, 09:45
Сообщение #28


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 23-02-09
Из: Одесская обл.
Пользователь №: 45 249



Цитата(WreWolf @ Oct 13 2009, 10:17) *
Теперь я научился вчитывать все что записал комп в ддс, но от этого не стало легце.
При попотке записи этой инфы в ддс, он все равно молчит и считать ничего уже не получаеться


Если Вы, WreWolf уверены, что микросхемы AD9854 и AD9954 идентичны по интерфейсу обмена я могу прислать Вам заведомо рабочий исходник для AD9854 на С для AVR. Но я SPI симулирую программно.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Oct 14 2009, 11:17
Сообщение #29


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Так и я давал исходники для любых чипв... Оригинатор пытается аппаратный SPI приручить.
Go to the top of the page
 
+Quote Post
WreWolf
сообщение Oct 17 2009, 09:16
Сообщение #30


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 10-11-07
Пользователь №: 32 211



Все приручилось. К сожалению пока криво, но это временно.

Оказалось 1 лишняя строка кода и не совсем корректный режим передачи( нужно было насильствено заставить его работать с начальным высоким клоком)

и пока дергаю руками IO_SYNK все заработало.

Хотя ничего не изменял по сути.

Делаю ресет IO и пишу данные.
затем еще раз ресет IO и читаю
так все заработало.
вот только еще ощибка к даташате почемуто появилась.
ну или у меня чтото с мозгами.
Просто когда hex слова считал для отправки в ДДС, оно в 1 месте не сошлось с тем что прочиталось после программирования компом.
А комп считывает то что я сам считал.

Как сконфигурировать пин DAI на выход FLAG15

SRU(FLAG15_O,DAI_PB05_I);
SRU(HIGH,PBEN05_I); // или SRU(LOW,PBEN05_I);

чтобы программно дергать IO reset

как отлажу будет исходник
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 04:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.01414 секунд с 7
ELECTRONIX ©2004-2016