Перейти к содержанию
    

at91ARM7S256+AD7799 конфигурирования SPI

Привет всем.

Помогите пожалуйста сконфигурировать SPI правильно, что бы запустился обмен с ad7799.

Я только недавно стал работать с ARM7S256 и не все там понимаю, в частности как правильно задать начальную частоту MCK и установить уже от нее все остальные тайменги по тем формулам которые приведенны в юзермануале на ARM7S256 и AD7799.

 

Помогите кто чем может.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

например вот так можно попробовать.

//----------------------- S P I -----------------------------------------

AT91PS_SPI pSPI; ///указатель на SPI

 

//------------------------------------------

void InitSPI(void){

 

AT91C_BASE_PIOA->PIO_PER = AT91C_PIO_PA28 | AT91C_PIO_PA29; //

AT91C_BASE_PIOA->PIO_OER = AT91C_PIO_PA28 | AT91C_PIO_PA29; //PIO_OER регистр разрешения выхода

AT91C_BASE_PIOA->PIO_SODR = AT91C_PIO_PA28 | AT91C_PIO_PA29; // PIO_SODR регистр установки выходных данных.

 

// ======== Init SPI_CS0 ================

 

AT91PS_SPI pSPI;// = AT91C_BASE_SPI ;

pSPI = AT91C_BASE_SPI ;

// -------- Init SPI_CS0 -------------------

AT91F_SPI_CfgPMC(); // Enables the SPI Clock (разрешение тактирования SPI)

 

// AT91F_SPI_CfgPIO(); // Open PIO for SPI

 

// Configure PIO controllers to periph mode

AT91F_PIO_CfgPeriph(

AT91C_BASE_PIOA, // PIO controller base address

((unsigned int) AT91C_PA13_MOSI )|

((unsigned int) AT91C_PA14_SPCK ) |

((unsigned int) AT91C_PA11_NPCS0 ) , /*выбор периферии*/

0 ); // Peripheral B

 

AT91F_SPI_Reset(pSPI);// Reset SPI

 

AT91F_SPI_CfgMode(pSPI,

( AT91C_SPI_MSTR\

|AT91C_SPI_MODFDIS \

|AT91C_SPI_PS_VARIABLE \

|AT91C_SPI_FDIV )

/*==0 SPCK=MCK/SCBR. ==1 SPCK=MCK/(32*SCBR)*/

/* */

);

//AT91C_SPI_CPOL //полярность синхросигнала

// AT91C_SPI_NCPHA // фаза достоверности данных

// AT91C_SPI_CSAAT //активность выбора СS после передачи ==1 до передачи другой меикросхеме

// (AT91C_SPI_BITS & AT91C_SPI_BITS_10) //количество бит во фрейме

// (AT91C_SPI_SCBR & (0x06 << 8))// скорость (НУЛЕМ запрещено. по умолчанию 00)

 

 

AT91F_SPI_CfgCs ( pSPI, 0,

AT91C_SPI_NCPHA /* Clock Phase*/

| AT91C_SPI_CSAAT /* Mode 0 & Chip Select After transfer disabled*/

|AT91C_SPI_BITS_16|(10<<8) /* mask & Bits per transfer*/

|(AT91C_SPI_SCBR & (0x01 << 8))); /* скорость (НУЛЕМ запрещено. по умолчанию 00)*/

 

//AT91F_SPI_CfgMode(pSPI, SPI_MODE); // Configure SPI in Master Mode with No CS selected

//AT91F_SPI_CfgCs(pSPI, 0, SPI_NPCS0_CONFIG); // Configure SPI CS0

 

AT91F_SPI_Enable(pSPI); // SPI_Enable

}

генератор же тактирования периферии он отдельно задается. тут только скорость, типа делить\не делить.

в книжке редькина это описано (неплохой вообщем перевод)

например так (т.е. это в первую очередь, а уже потом SPI)

AT91C_BASE_PMC->PMC_MOR = (( AT91C_CKGR_OSCOUNT & (0x40 <<8) | AT91C_CKGR_MOSCEN ));

// ожидание стабилизации частоты основного генератора

while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS));

while( !(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) );

 

// отключение сторожевого таймера

AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS;

// разрешение тактирования PIO

AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA ) ;

Изменено пользователем MasterCat

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

спасибо за совет.

 

У меня SPI уже сконфигурирован так:

 

void _ini_spi(void) {

volatile unsigned int dummy4;

*PIOA_OER=bit31; //контакт PCS1 на вывод

*PIOA_PDR=bit11|bit12|bit13|bit14; //запретить работу в режиме PIO (CS0,MISO,MOSI,CLK)

*PIOA_ASR=bit11|bit12|bit13|bit14; //перевели в режим А

*PIOA_PDR=bit31;*PIOA_ASR=bit31; //запретить работу в режиме PIO для CS1

*SPI_CR=bit1; //запрет SPI

*SPI_MR=bit0|bit1|bit4; //master,...

dummy4=_n_bit_spi;dummy4<<=4;

*SPI_CSR0=bit0|dummy4|0x3100|0x20B00000;

*SPI_CR=bit0;dummy4=*SPI_RDR; //пуск SPI и обнулить буфер

}

 

я не могу понять только как правильно рассчитать по формулам биты SCBR, DLYBS и DLYBCT генератор у меня 12MH. И что такое в этих формулах MCK что он значит фихически. А задержки у меня должыбыть 100нс-SCLK,

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

спасибо за совет.

 

У меня SPI уже сконфигурирован так:

 

void _ini_spi(void) {

volatile unsigned int dummy4;

*PIOA_OER=bit31; //контакт PCS1 на вывод

*PIOA_PDR=bit11|bit12|bit13|bit14; //запретить работу в режиме PIO (CS0,MISO,MOSI,CLK)

*PIOA_ASR=bit11|bit12|bit13|bit14; //перевели в режим А

*PIOA_PDR=bit31;*PIOA_ASR=bit31; //запретить работу в режиме PIO для CS1

*SPI_CR=bit1; //запрет SPI

*SPI_MR=bit0|bit1|bit4; //master,...

dummy4=_n_bit_spi;dummy4<<=4;

*SPI_CSR0=bit0|dummy4|0x3100|0x20B00000;

*SPI_CR=bit0;dummy4=*SPI_RDR; //пуск SPI и обнулить буфер

}

 

я не могу понять только как правильно рассчитать по формулам биты SCBR, DLYBS и DLYBCT генератор у меня 12MH. И что такое в этих формулах MCK что он значит фихически. А задержки у меня должыбыть 100нс-SCLK,

 

 

 

 

== ну вот сгородил примерчик для демонстрации. частота клока известна же. формат фрейма тоже

 

#define lospeed 1

// l_pSpi0->SPI_MR = 0xE0019;

AT91F_SPI_CfgMode(AT91C_BASE_SPI0,

( AT91C_SPI_MSTR /*master*/

|AT91C_SPI_MODFDIS /*mode fault detector*/

|AT91C_SPI_PS_VARIABLE /*выбор фиксированной периферии*/

#ifdef lospeed

|AT91C_SPI_FDIV /*тактирование MСK/n */

#endif

)

/*==0 SPCK=MCK/SCBR. ==1 SPCK=MCK/(32*SCBR)*/

/**/

);

 

// l_pSpi0->SPI_CSR[0] = 0x01010C11; //9bit, CPOL=1, ClockPhase=0, SCLK = 48Mhz/32*12 = 125kHz

AT91F_SPI_CfgCs (AT91C_BASE_SPI0, 0,

AT91C_SPI_CPOL

| AT91C_SPI_BITS_9

#ifdef lospeed

| ( AT91C_SPI_SCBR &( 0xFF << 8 )) /*это оччень медленно, . т.к. AT91C_SPI_FDIV =1 */

#else

| ( AT91C_SPI_SCBR &( 0x08 << 8 )) // см.l_pSpi0->SPI_MR

#endif

| ( 0x01 << 16 )

| ( 0x01 << 24 )

);

 

в регистре SPI_CSR0 поле SCBR (биты с 8го по 15й) содержит условное значение скорости.

от х00 до хFF . это делитель частоты MCK .

если бит T91C_SPI_FDIV в регистре MR установлен , то всё в 32 раза медленее.

собственно и всё.

 

 

 

 

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

если бит T91C_SPI_FDIV в регистре MR установлен , то всё в 32 раза медленее.

Этот бит "упразднили" давным давно, ибо его установка вызывает лютый глюкодром.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Этот бит "упразднили" давным давно, ибо его установка вызывает лютый глюкодром.

 

я пример сначала проверил. он рабочий. а то что надо аккуратнее с этим делом, ну да, согласен.

это 9битный вывод на индикатор. на нем нагляднее визуально изменение скорости. что-то от 1 кадр в 10 сек, до 20 кадров в сек.

Изменено пользователем MasterCat

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...