[an error occurred while processing this directive]
Все, понял сам в чем дело. Два дня парился! Ниже привожу работающий код. Вдруг кому-то надо будет.
(«Телесистемы»: Конференция «Цифровые сигнальные процессоры (DSP) и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено homekvn 08 марта 2005 г. 14:07
В ответ на: Наверное я зануда, но в ассемблере это вчетверо короче и во столько же раз понятней... отправлено Крок 08 марта 2005 г. 00:52

Главное, что необходимо сделать, чтобы предыдущий код работал - это:

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
#include
#include "settings.h"
#include

#if (TARGETPROCESSOR==21364)
#include
#include
#else
#include
#include "sru21266.h"
#endif

#define wait_SPI_ready nop; nop; nop; ustat1=dm(SPISTATB); bit tst ustat1 TXS; if tf jump (pc,-2)
#define wait_SPI_all_data_transfered nop; nop; nop; nop; ustat1=dm(SPISTATB); bit tst ustat1 SPIF; if not 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

// 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

// Set SPI Baud Rate to 100 kHz
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;

SRU (LOW, DAI_PB03_I); // To enable data transmission
//Pause before continuing
lcntr=1000, do (pc,_loop_end0) until lce;
_loop_end0:
nop;

//===================== SENDING COMMANDS TO DDS =====================
#ifdef DEBUG_SPIB_INIT
r0 = 0x781E;
#else
r0=0x2000; // Set Conttrol Register (CR) to be able to load
#endif

dm(TXSPIB)=r0; // double word related to frequency value (see
// next command)

wait_SPI_ready;
SRU (HIGH, DAI_PB03_I);
lcntr=100, do (pc,_loop_end01) until lce;
_loop_end01:
nop;

SRU (LOW, DAI_PB03_I); // To enable data transmission

lcntr=100, do (pc,_loop_end1) until lce;
_loop_end1:
nop;

SRU (HIGH, PBEN01_I); // DAI_PB1_I is ouput so set its ensable
//------------------------------------------------------------------
#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)

wait_SPI_ready;

SRU (HIGH, DAI_PB03_I);
lcntr=100, do (pc,_loop_end02) until lce;
_loop_end02:
nop;

SRU (LOW, DAI_PB03_I); // To enable data transmission
lcntr=100, do (pc,_loop_end2) until lce;
_loop_end2:
nop;

SRU (HIGH, PBEN01_I); // DAI_PB1_I is ouput so set its ensable
//------------------------------------------------------------------
#ifdef DEBUG_SPIB_INIT
r0 = 0x42A2;
#else
// r0 = 0x40C2; // 0.57 MHz
r0 = 0x5062; // - 12.288 MHz
#endif

dm(TXSPIB)=r0;
wait_SPI_ready;

SRU (HIGH, DAI_PB03_I);
lcntr=100, do (pc,_loop_end03) until lce;
_loop_end03:
nop;

SRU (LOW, DAI_PB03_I); // To enable data transmission
lcntr=100, do (pc,_loop_end3) until lce;
_loop_end3:
nop;

SRU (HIGH, PBEN01_I); // DAI_PB1_I is ouput so set its ensable
//------------------------------------------------------------------

#ifdef DEBUG_SPIB_INIT
r0 = 0x5BBC;
#else
r0 = 0x0100; // Set reset bit active
#endif

dm(TXSPIB)=r0;
wait_SPI_ready;

SRU (HIGH, DAI_PB03_I);
lcntr=100, do (pc,_loop_end04) until lce;
_loop_end04:
nop;

SRU (LOW, DAI_PB03_I); // To enable data transmission
lcntr=100, do (pc,_loop_end4) until lce;
_loop_end4:
nop;

SRU (HIGH, PBEN01_I); // DAI_PB1_I is ouput so set its ensable
//------------------------------------------------------------------
#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, DAI_PB03_I); // To disable data transmission
SRU (HIGH, PBEN01_I); // DAI_PB1_I is ouput so set its ensable

exit; // see asm_sprt.h for what's going on here

_spi_b_init.end:


Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru