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