Ну с битиками то все в порядке.
На осциллографе все выглядит прекрасно, значит я думаю и для ДДС тоже.
А про сброс текущего IO я знаю, по этому и дергаю.
вот код. битиков лишних нет
CODE
#include <def21364.h>
.section/dm seg_dmda;
.var CFR1_d[]= 0x00,0x00,0x00,0x22,0x00;
.var CFR2_d[]= 0x01,0x18,0x00,0x44;
.var FTW0_d[]= 0x04,0x0F,0xAA,0xAA,0xAB;
.var irx= 0x84;
.var rx_buf1[5];
.var rx_buf2[4];
.var rx_buf3[3];
.var rx_buf4[2];
.var rx_buf5[5];
.var rx_buf6[3];
.var rx_buf7[5];
.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;
// прием данных из DDS
call SPI_init;
ustat3=rx_buf1; ustat4=@rx_buf1; ustat2=0x80;
call read_reg;
call SPI_init;
ustat3=rx_buf2; ustat4=@rx_buf2; ustat2=0x81;
call read_reg;
call SPI_init;
ustat3=rx_buf3; ustat4=@rx_buf3; ustat2=0x82;
call read_reg;
call SPI_init;
ustat3=rx_buf4; ustat4=@rx_buf4; ustat2=0x83;
call read_reg;
_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:
ustat3=0x01; dm(SPISTAT)=ustat3;
ustat3= DS0EN| /*enable SPI slave device select zero */
SPIFLG3|SPIFLG2|SPIFLG0;/* Set SPIFLG1 low to */
dm(SPIFLG) = ustat3; /*select SPI slave on FLAG0 pin */
rts;
//Махание флагом I/O Update
FLAG_IO:
lcntr=12000, do (pc,FLAG_IO1) until LCE;
nop;nop;nop;nop;nop;nop;nop;nop;nop;FLAG_IO1:nop;
bit set flags FLG1;
lcntr=240, do (pc,FLAG_IO2) until LCE;
nop;nop;nop;nop;nop;nop;nop;nop;nop;FLAG_IO2:nop;
bit clr flags FLG1;
lcntr=12000, do (pc,FLAG_IO3) until LCE;
nop;nop;nop;nop;nop;nop;nop;nop;nop;FLAG_IO3:nop;
rts;
//Ожидание окончания передачи/приема
waitSPI:
lcntr=5, do (pc,waitSPI_c) until LCE;
call wait_for_SPIF;
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|
CPHASE|
CLKPL|
MSBF;
dm(SPICTL)=ustat3;
ustat3=SPIDEN;
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;
//----------------------------------------
//READ Register
read_reg:
r0=DS0EN|SPIFLG3|SPIFLG2|SPIFLG0;
dm(SPIFLG)=r0;
r0=5000;
dm(SPIBAUD)=r0;
r0=SPIEN|SPIMS|SENDZ|CPHASE|CLKPL|TIMOD2|WL8|MSBF;
dm(SPICTL)=r0;
dm(CSPI)=ustat4;
dm(IISPI)=ustat3;
r0=1;
dm(IMSPI)=r0;
dm(TXSPI)=ustat2;
r0=INTEN|SPIDEN|SPIRCV;
dm(SPIDMAC)=r0;
//Wait for SPI DMA to complete using polling------
wspi:ustat1=dm(SPIDMAC);
bit tst ustat1 SPIDMAS; // Check SPI DMA Status bit
IF TF jump (pc,wspi); // SPIDMAS = 1 when DMA in progress
//Disable DMA
r15=0;
dm(SPIDMAC)=r15;
//Disable SPI
dm(SPICTL)=r15;
dm(SPIFLG)=r15;
dm(SPIBAUD)=r15;
read_reg.end: rts;