|
|
 |
Ответов
(15 - 29)
|
Sep 16 2009, 08:24
|
Участник

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

|
Т.е. вы имеете в виду перед программирование выставлять и SCLK и CS в 1 затем опускать CS в 0 и дергать iosync чтобы начать новый цикл программирования. единственное еще не пробовал перед циклом программирования дергать iosync
|
|
|
|
|
Sep 19 2009, 10: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 руками после переключения. ответа все равно никакого нет, впрочем как и генерации
|
|
|
|
|
Sep 19 2009, 12:10
|

Профессионал
    
Группа: Участник
Сообщений: 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
|
|
|
|
|
Sep 21 2009, 07:24
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Sep 29 2009, 09:57
|
Участник

Группа: Участник
Сообщений: 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;
|
|
|
|
|
Sep 29 2009, 11:17
|
Участник

Группа: Участник
Сообщений: 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 ничего не меняеться вот фото передачи данных
Эскизы прикрепленных изображений
|
|
|
|
|
Sep 29 2009, 17:12
|
Участник

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

|
ну я тогда даже не знаю пробовал подать только клок и данные на SDIO и руками дергать ио апдейт между посылками данных регистров а при программировании с компа на ножке клока клок, а на SDIO данные я уже не знаю что делать
Сообщение отредактировал WreWolf - Sep 29 2009, 17:12
|
|
|
|
|
Oct 13 2009, 07:17
|
Участник

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

|
Теперь я научился вчитывать все что записал комп в ддс, но от этого не стало легце. При попотке записи этой инфы в ддс, он все равно молчит и считать ничего уже не получаеться
|
|
|
|
|
Oct 14 2009, 09:45
|
Участник

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

|
Цитата(WreWolf @ Oct 13 2009, 10:17)  Теперь я научился вчитывать все что записал комп в ддс, но от этого не стало легце. При попотке записи этой инфы в ддс, он все равно молчит и считать ничего уже не получаеться Если Вы, WreWolf уверены, что микросхемы AD9854 и AD9954 идентичны по интерфейсу обмена я могу прислать Вам заведомо рабочий исходник для AD9854 на С для AVR. Но я SPI симулирую программно.
|
|
|
|
|
Oct 17 2009, 09:16
|
Участник

Группа: Участник
Сообщений: 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
как отлажу будет исходник
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|