[an error occurred while processing this directive]
|
Главное, что необходимо сделать, чтобы предыдущий код работал - это:
1) снять флаг CPHASE регистра SPICTLB при настройке SPIb. Это необходимо, поскольку именно он отвечает за то, чтобы спадающие фронты синхроимпульсов попадали на середину интервала, в течение которого передается один бит данных; в противном случае будем спадающие фронты будут попадать на начало, и тогда... весьма трудно предугадать, что будет передано в AD9834.
2) после каждого переданного слова взводить pin, именуемый FSYNC в состояние 1, затем (после небольшого ожидания) опять перевести его в состояние 0. Перепад из 0 в 1 внутренняя логика AD9834 воспринимает как сигнал "Передача нового слова завершена и его можно переслать в один из внутренних регистров, которому оно предназначалось".
Работающий код (для ADSP 21364):
/*************************************************************************\
*
* SPI_B initialization routine for first DSP
*
* SPI_B is initialized to configure the DDS clockgenerator IC
*
\*************************************************************************/
#include #if (TARGETPROCESSOR==21364) #define wait_SPI_ready nop; nop; nop; ustat1=dm(SPISTATB); bit tst ustat1 TXS; if tf jump (pc,-2) .global _spi_b_init; .SECTION/DM seg_dmda; .SECTION/PM seg_pmco; _spi_b_init: entry; // see asm_sprt.h for what's going on here // Set SPI Baud Rate to 100 kHz SRU (LOW, DAI_PB03_I); // To enable data transmission //===================== SENDING COMMANDS TO DDS ===================== dm(TXSPIB)=r0; // double word related to frequency value (see wait_SPI_ready; SRU (LOW, DAI_PB03_I); // To enable data transmission lcntr=100, do (pc,_loop_end1) until lce; SRU (HIGH, PBEN01_I); // DAI_PB1_I is ouput so set its ensable wait_SPI_ready; SRU (HIGH, DAI_PB03_I); SRU (LOW, DAI_PB03_I); // To enable data transmission SRU (HIGH, PBEN01_I); // DAI_PB1_I is ouput so set its ensable SRU (HIGH, DAI_PB03_I); SRU (LOW, DAI_PB03_I); // To enable data transmission SRU (HIGH, PBEN01_I); // DAI_PB1_I is ouput so set its ensable #ifdef DEBUG_SPIB_INIT SRU (HIGH, DAI_PB03_I); SRU (LOW, DAI_PB03_I); // To enable data transmission SRU (HIGH, PBEN01_I); // DAI_PB1_I is ouput so set its ensable SRU (HIGH, DAI_PB03_I); // To disable data transmission exit; // see asm_sprt.h for what's going on here _spi_b_init.end:
E-mail:
info@telesys.ru
#include
#include "settings.h"
#include
#include
#include
#else
#include
#include "sru21266.h"
#endif
#define wait_SPI_all_data_transfered nop; nop; nop; nop; ustat1=dm(SPISTATB); bit tst ustat1 SPIF; if not tf jump (pc,-2)
// Pull framesync (=CS) from DDS to HIGH
SRU (HIGH, PBEN03_I); // DAI_PB3_I is ouput so set its enable to high
SRU (HIGH, DAI_PB03_I); // Pull DDS fsync (=CS) to high
lcntr=5000, do spi_b_wait1 until lce;
nop;
spi_b_wait1:
nop;
SRU (HIGH, PBEN01_I); // DAI_PB1_I is ouput so set its enable to high
r1=500;
dm(SPIBAUDB) = r1; // !!!KVN SPI Baud Rate = (Peripheral clock rate)/(2 x SPIBAUD15–1) (ADSP HWRef Rev.0.2 Pg.A-47)
// Set SPI_B to
// - SPIEN - enable SPI system
// - SPIMS - SPI Master Device
// - SENDZ - Sending Zero after the last word has been transmitted
// - CPHASE - SPICLK Toggles at Middle of 1st Data Bit
// - CLKPL - SPICLK active high, low in idle state
// - TIMOD1 - 01=Initiate Transfer by Write of Transmit Buffer
// - WL16 - Word Length 16
// - MSBF - Most significant byte first
// r1 = (SPIEN | SPIMS | SENDZ | CPHASE | CLKPL | TIMOD1 | WL16 | MSBF);
r1 = (SPIEN | SPIMS | SENDZ | CPHASE | TIMOD1 | WL16 | MSBF);
dm(SPICTLB) = r1;
//Pause before continuing
lcntr=1000, do (pc,_loop_end0) until lce;
_loop_end0:
nop;
#ifdef DEBUG_SPIB_INIT
r0 = 0x781E;
#else
r0=0x2000; // Set Conttrol Register (CR) to be able to load
#endif
// next command)
SRU (HIGH, DAI_PB03_I);
lcntr=100, do (pc,_loop_end01) until lce;
_loop_end01:
nop;
_loop_end1:
nop;
//------------------------------------------------------------------
#ifdef DEBUG_SPIB_INIT
r0 = 0x1008;
#else
// r0 = 0x63D7; // 0.57 MHz
r0 = 0x5375; // - 12.288 MHz
#endif
dm(TXSPIB)=r0; // number 0 (FREQ0)
// end "from SPIFlash.asm (examples AD)
lcntr=100, do (pc,_loop_end02) until lce;
_loop_end02:
nop;
lcntr=100, do (pc,_loop_end2) until lce;
_loop_end2:
nop;
//------------------------------------------------------------------
#ifdef DEBUG_SPIB_INIT
r0 = 0x42A2;
#else
// r0 = 0x40C2; // 0.57 MHz
r0 = 0x5062; // - 12.288 MHz
#endif
dm(TXSPIB)=r0;
wait_SPI_ready;
lcntr=100, do (pc,_loop_end03) until lce;
_loop_end03:
nop;
lcntr=100, do (pc,_loop_end3) until lce;
_loop_end3:
nop;
//------------------------------------------------------------------
r0 = 0x5BBC;
#else
r0 = 0x0100; // Set reset bit active
#endif
dm(TXSPIB)=r0;
wait_SPI_ready;
lcntr=100, do (pc,_loop_end04) until lce;
_loop_end04:
nop;
lcntr=100, do (pc,_loop_end4) until lce;
_loop_end4:
nop;
//------------------------------------------------------------------
#ifdef DEBUG_SPIB_INIT
r0 = 0x7BB4;
#else
r0 = 0x0000; // Set reset bit low to enable changes
#endif
dm(TXSPIB)=r0;
wait_SPI_ready;
wait_SPI_all_data_transfered;
SRU (HIGH, PBEN01_I); // DAI_PB1_I is ouput so set its ensable
Ответы