bernifox 0 14 июля, 2011 Опубликовано 14 июля, 2011 · Жалоба Привет всем. Помогите пожалуйста сконфигурировать SPI правильно, что бы запустился обмен с ad7799. Я только недавно стал работать с ARM7S256 и не все там понимаю, в частности как правильно задать начальную частоту MCK и установить уже от нее все остальные тайменги по тем формулам которые приведенны в юзермануале на ARM7S256 и AD7799. Помогите кто чем может. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MasterCat 0 19 июля, 2011 Опубликовано 19 июля, 2011 (изменено) · Жалоба например вот так можно попробовать. //----------------------- 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 ) ; Изменено 20 июля, 2011 пользователем MasterCat Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bernifox 0 20 июля, 2011 Опубликовано 20 июля, 2011 · Жалоба спасибо за совет. У меня 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, Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MasterCat 0 2 августа, 2011 Опубликовано 2 августа, 2011 · Жалоба спасибо за совет. У меня 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 раза медленее. собственно и всё. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 2 августа, 2011 Опубликовано 2 августа, 2011 · Жалоба если бит T91C_SPI_FDIV в регистре MR установлен , то всё в 32 раза медленее. Этот бит "упразднили" давным давно, ибо его установка вызывает лютый глюкодром. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MasterCat 0 2 августа, 2011 Опубликовано 2 августа, 2011 (изменено) · Жалоба Этот бит "упразднили" давным давно, ибо его установка вызывает лютый глюкодром. я пример сначала проверил. он рабочий. а то что надо аккуратнее с этим делом, ну да, согласен. это 9битный вывод на индикатор. на нем нагляднее визуально изменение скорости. что-то от 1 кадр в 10 сек, до 20 кадров в сек. Изменено 2 августа, 2011 пользователем MasterCat Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться