Вот в конце концов родилось такое.
Более читаемый код, и больше прозрачности в работе.
Но вот только никакого результата.
Хотя все сделано по даташиту, может есть еще идеи?
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;