реклама на сайте
подробности

 
 
> at91ARM7S256+AD7799 конфигурирования SPI
bernifox
сообщение Jul 14 2011, 07:56
Сообщение #1





Группа: Новичок
Сообщений: 3
Регистрация: 30-06-11
Пользователь №: 65 986



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

Помогите кто чем может.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
MasterCat
сообщение Jul 19 2011, 18:25
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 14-07-10
Пользователь №: 58 452



например вот так можно попробовать.
//----------------------- 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 - Jul 20 2011, 04:45
Go to the top of the page
 
+Quote Post
bernifox
сообщение Jul 20 2011, 10:57
Сообщение #3





Группа: Новичок
Сообщений: 3
Регистрация: 30-06-11
Пользователь №: 65 986



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

У меня 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,
Go to the top of the page
 
+Quote Post
MasterCat
сообщение Aug 2 2011, 05:13
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 14-07-10
Пользователь №: 58 452



Цитата(bernifox @ Jul 20 2011, 16:57) *
спасибо за совет.

У меня 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 раза медленее.
собственно и всё.







Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 2 2011, 08:12
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(MasterCat @ Aug 2 2011, 09:13) *
если бит T91C_SPI_FDIV в регистре MR установлен , то всё в 32 раза медленее.

Этот бит "упразднили" давным давно, ибо его установка вызывает лютый глюкодром.
Go to the top of the page
 
+Quote Post
MasterCat
сообщение Aug 2 2011, 13:39
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 14-07-10
Пользователь №: 58 452



Цитата(aaarrr @ Aug 2 2011, 14:12) *
Этот бит "упразднили" давным давно, ибо его установка вызывает лютый глюкодром.


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

Сообщение отредактировал MasterCat - Aug 2 2011, 13:40
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 07:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.0141 секунд с 7
ELECTRONIX ©2004-2016