|
at91sam7s64 + USART... как правильно настроить?, док вроед прочитал но не работает... |
|
|
|
Aug 27 2007, 14:36
|

Частый гость
 
Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829

|
Код volatile AT91PS_PIO pPIO = AT91C_BASE_PIOA; pPIO->PIO_ASR |= (1 << 6); pPIO->PIO_OER = (1 << 6);
volatile AT91PS_USART pUS1 = AT91C_BASE_US1; pUS1->US_MR |= AT91C_US_CHRL /*8 bits*/ |AT91C_US_PAR_NONE /*no parity*/ |AT91C_US_NBSTOP_2_BIT /*2 stop bits*/ |AT91C_US_OVER /*8x oversampling*/ |AT91C_US_INACK;
pUS1->US_CR &= ~AT91_US_TXDIS; pUS1->US_CR |= AT91_US_TXEN; //pUS1->US_BRGR = 60; pUS1->US_BRGR = 30; настроил так скажите пжлста так ли, а то совсем закопался...
--------------------
все косяки, даже о которых не знает сам разработчик, - мои
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Aug 27 2007, 15:41
|
Частый гость
 
Группа: Новичок
Сообщений: 84
Регистрация: 24-05-07
Пользователь №: 27 947

|
Цитата pPIO->PIO_ASR |= (1 << 6); Читать write-only регистры не стоит. Записью в PIO_PDR нужно запретить режим PIO на выводах USART.
|
|
|
|
|
Aug 28 2007, 16:17
|

Частый гость
 
Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829

|
Цитата(a3r3 @ Aug 27 2007, 19:41)  Читать write-only регистры не стоит. всмысле читать регистры?? а очередность инициализации важна?
--------------------
все косяки, даже о которых не знает сам разработчик, - мои
|
|
|
|
|
Aug 28 2007, 17:24
|
Частый гость
 
Группа: Новичок
Сообщений: 84
Регистрация: 24-05-07
Пользователь №: 27 947

|
Цитата(Mozart @ Aug 28 2007, 20:17)  всмысле читать регистры?? Это: Код pPIO->PIO_ASR |= (1 << 6); Чтение-модификация-запись write-only регистра. Цитата(Mozart @ Aug 28 2007, 20:17)  а очередность инициализации важна? Для конечного результата нет, а в процессе лучше быть аккуратнее во избежание конфликтов на выходах. Впрочем, даже при возникновении такого конфликта ничего катастрофического не случится.
|
|
|
|
|
Aug 28 2007, 17:28
|

Частый гость
 
Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829

|
Цитата Это: pPIO->PIO_ASR |= (1 << 6);
Чтение-модификация-запись write-only регистра. я почему-то над этим никогда не задумывался... а ведь действительно... спасибо буду знать...
--------------------
все косяки, даже о которых не знает сам разработчик, - мои
|
|
|
|
|
Aug 28 2007, 18:07
|

Местный
  
Группа: Свой
Сообщений: 205
Регистрация: 19-12-05
Из: Kiev
Пользователь №: 12 394

|
Цитата(Mozart @ Aug 28 2007, 19:17)  всмысле читать регистры?? а очередность инициализации важна? Попробуйте так: Код volatile AT91PS_PIO pPIO = AT91C_BASE_PIOA; volatile AT91PS_USART pUS = AT91C_BASE_US1;
pUS->US_IDR = 0xffffffff; pUS->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS; AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1UL << AT91C_ID_US1); AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1UL << AT91C_ID_PIOA);
pPIO->PIO_PDR = AT91C_PA21_RXD1 | AT91C_PA22_TXD1; pPIO->PIO_ASR = AT91C_PA21_RXD1 | AT91C_PA22_TXD1; pPIO->PIO_OER = AT91C_PA22_TXD1; pPIO->PIO_ODR = AT91C_PA21_RXD1; pPIO->PIO_PPUDR = AT91C_PA21_RXD1;
// настройка скорости передачи baud_val = AT91C_MASTER_CLOCK/baud; if ((baud_val&0x0f)>=8) baud_val += 16; pUS->US_BRGR = (baud_val>>4);
pUS->US_MR = AT91C_US_ASYNC_MODE; pUS->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;
|
|
|
|
|
Aug 29 2007, 11:43
|

Частый гость
 
Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829

|
что-то нифига не получается смотрел осцилом ничего нету... записвыаю чар для передачи в регистр US_THR Код unsigned char ch; ch = 0xFF; pUS1->US_THR = (ch & 0x1FF); for(j = 0; j < 10000; j++); использую доску от атмеля at91sam7s-ek может какие-то джамперы нужно поставить? я уже весь мозг сломал...
--------------------
все косяки, даже о которых не знает сам разработчик, - мои
|
|
|
|
|
Aug 29 2007, 16:46
|

Частый гость
 
Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829

|
Цитата(Сергей Борщ @ Aug 29 2007, 19:52)  Тактирование UART включили (AT91C_BASE_PMC->PMC_PCER =(1<<AT91C_ID_US0)  ? да включил... меня почему-то сейчас клинануло... а нужно ли подавать сигналы на RTS, CTS, DTR, и прочее??? или они автоматом???
Сообщение отредактировал Mozart - Aug 29 2007, 16:50
--------------------
все косяки, даже о которых не знает сам разработчик, - мои
|
|
|
|
|
Sep 5 2007, 07:47
|

Частый гость
 
Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829

|
люди, что делаю не так??? вот код начальной инициализации... Код void LowLevelInit(void) { int i; AT91PS_PMC pPMC = AT91C_BASE_PMC; //* Set Flash Wait sate // Single Cycle Access at Up to 30 MHz, or 40 // if MCK = 48 054 841 I have 50 Cycle for 1 usecond ( flied MC_FMR->FMCN // result: AT91C_MC_FMR = 0x00320100 (MC Flash Mode Register) AT91C_BASE_MC->MC_FMR = ((AT91C_MC_FMCN)&(50 << 16)) | AT91C_MC_FWS_1FWS;
//* Watchdog Disable // result: AT91C_WDTC_WDMR = 0x00008000 (Watchdog Mode Register) AT91C_BASE_WDTC->WDTC_WDMR= AT91C_WDTC_WDDIS;
//* Set MCK at 48 054 841 // 1 Enabling the Main Oscillator: // SCK = 1/32768 = 30.51 uSecond // Start up time = 8 * 6 / SCK = 56 * 30.51 = 1,46484375 ms // result: AT91C_CKGR_MOR = 0x00000601 (Main Oscillator Register)
pPMC->PMC_MOR = (( AT91C_CKGR_OSCOUNT & (0x06 << 8) | AT91C_CKGR_MOSCEN )); // Wait the startup time while(!(pPMC->PMC_SR & AT91C_PMC_MOSCS)); // PMC Clock Generator PLL Register setup // // The following settings are used: DIV = 14 // MUL = 72 // PLLCOUNT = 10 // // Main Clock (MAINCK from crystal oscillator) = 18432000 hz (see AT91SAM7-EK schematic) // MAINCK / DIV = 18432000/14 = 1316571 hz // PLLCK = 1316571 * (MUL + 1) = 1316571 * (72 + 1) = 1316571 * 73 = 96109683 hz // // PLLCOUNT = number of slow clock cycles before the LOCK bit is set // in PMC_SR after CKGR_PLLR is written. // // PLLCOUNT = 10 // // OUT = 0 (not used) // result: AT91C_CKGR_PLLR = 0x00000000480A0E (PLL Register) pPMC->PMC_PLLR = ((AT91C_CKGR_DIV & 14) | (AT91C_CKGR_PLLCOUNT & (10<<8)) | (AT91C_CKGR_MUL & (72<<16)));
// Wait the startup time (until PMC Status register LOCK bit is set) while(!(pPMC->PMC_SR & AT91C_PMC_LOCK)); // PMC Master Clock (MCK) Register setup // // CSS = 3 (PLLCK clock selected) // // PRES = 1 (MCK = PLLCK / 2) = 96109683/2 = 48054841 hz // // Note: Master Clock MCK = 48054841 hz (this is the CPU clock speed) // result: AT91C_PMC_MCKR = 0x00000007 (Master Clock Register) pPMC->PMC_MCKR = AT91C_PMC_CSS_PLL_CLK | AT91C_PMC_PRES_CLK_2; //pPMC->PMC_MCKR = AT91C_PMC_CSS_MAIN_CLK; //18432000 HZ // Set up the default interrupts handler vectors AT91C_BASE_AIC->AIC_IECR = 0x0; AT91C_BASE_AIC->AIC_IDCR = 0xffffffff; /* AT91C_BASE_AIC->AIC_SVR[0] = (int) AT91F_Default_FIQ_handler; for (i=1; i < 31; i++) { AT91C_BASE_AIC->AIC_SVR[i] = (int) AT91F_Default_IRQ_handler; } AT91C_BASE_AIC->AIC_SPU = (int) AT91F_Spurious_handler; */ } вот мой код настройки УСАРТА Код volatile AT91PS_PIO pPIO = AT91C_BASE_PIOA; //for LED pPIO->PIO_PER = LED_MASK; //perepherial enable register pPIO->PIO_OER = LED_MASK; //output enable register pPIO->PIO_SODR = LED_MASK; pPIO->PIO_CODR = LED_MASK;
/*for USART*/ volatile AT91PS_PMC pPMC = AT91C_BASE_PMC; //peripheal clock pPMC->PMC_PCER = (1 << AT91C_ID_US1)|(1 << AT91C_ID_US0); //clock USART1 pPIO->PIO_PDR = (1 << 5)| /*disable PIO */ (1 << 6)| (1 << 21)| (1 << 22); pPIO->PIO_ASR = (1 << 5)| /*enable peripheral A*/ (1 << 6)| (1 << 21)| (1 << 22); int maskPIO; maskPIO = pPIO->PIO_OSR | (1 << 6) | (1 << 22); pPIO->PIO_OER = maskPIO; //output USART volatile AT91PS_USART pUS1 = AT91C_BASE_US1; //settings USART pUS1->US_BRGR = CD1; //baudrate pUS1->US_IDR = 0xffffffff;
pUS1->US_MR = AT91C_US_USMODE_NORMAL| AT91C_US_CLKS_CLOCK| /*AT91C_US_CLKS_SLOW*/ AT91C_US_CHRL_8_BITS| AT91C_US_NBSTOP_2_BIT| AT91C_US_DSNACK; pUS1->US_CR = 0x50; //RXEN and TXEN enable вот мой код передачи байта и зажигание светодиода... Код while(1) { pPIO->PIO_SODR |= LED_MASK; for(qwe = 0; qwe < 100000; qwe++); pPIO->PIO_CODR |= LED_MASK; for(qwe = 0; qwe < 100000; qwe++); pUS1->US_THR = 0x1CC; //transmit char to PC!!! } связка у меня такая eclipse + arm-elf-gb + openOCD + wiggler + МК at91sam7... помогите... мозг уже плавится... руки дрожат... не дайте пропасть душе моей... светодиодами моргает прекрасно... на кнопочки реагирует...
--------------------
все косяки, даже о которых не знает сам разработчик, - мои
|
|
|
|
|
Sep 5 2007, 09:23
|

Частый гость
 
Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829

|
Код pPMC->PMC_PCER = (1 << AT91C_ID_US1)|(1 << AT91C_ID_US0)| (1 << AT91C_ID_PIOA); //clock USART1 включил них не работает... 3 нога ком-порта сидит в нуле, это нормально?
--------------------
все косяки, даже о которых не знает сам разработчик, - мои
|
|
|
|
|
Sep 5 2007, 09:49
|
Местный
  
Группа: Свой
Сообщений: 263
Регистрация: 2-02-07
Из: CN, Ukraine
Пользователь №: 24 970

|
у вас отладчик работает ? что в регистре статуса уарта после записи байта в THR ? и зачем это : maskPIO = pPIO->PIO_OSR | (1 << 6) | (1 << 22); pPIO->PIO_OER = maskPIO; //output USART ? вот моя последовательность запуска уарта (IAR): Код AT91C_BASE_PMC->PMC_PCER = (1 << self->USART_ID); /* Reset and disable receiver */ self->USART->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX;
/* Disable interrupts */ self->USART->US_IDR = 0xFFFFFFFF;
self->USART->US_MR = AT91C_US_MAX_ITER | AT91C_US_CLKS_CLOCK | AT91C_US_NBSTOP_1_BIT | AT91C_US_PAR_NONE | AT91C_US_CHRL_8_BITS;
self->USART->US_BRGR = 320;
AT91F_US_EnableTx(self->USART); AT91F_US_EnableRx(self->USART); /* Disable the RX and TX PDC transfer requests */ self->USART->US_PTCR = AT91C_PDC_RXTDIS; self->USART->US_PTCR = AT91C_PDC_TXTDIS;
Сообщение отредактировал _dem - Sep 5 2007, 09:43
|
|
|
|
|
Sep 5 2007, 10:25
|

Частый гость
 
Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829

|
если честно под отладчиком не смотрел, просто "прошивал"... ссылаясь на то что оно работает... сейчас посмотрел под отладчиком во-первых, почему-то после записи в US_THR значения, переходил к функции LowLevelInit(), во-вторых, почему-то не показывает изменения в регистрах... но переписав цикл вайл и превратив его в такой вид Код while(1) { pPIO->PIO_SODR |= LED_MASK; //for(qwe = 0; qwe < 100000; qwe++); pPIO->PIO_CODR |= LED_MASK; //for(qwe = 0; qwe < 100000; qwe++);
//while (!(pUS1->US_CSR & AT91C_US_TXRDY)); for (qwe = 0; qwe < 100; qwe++); pUS1->US_THR = 0x1CC; //transmit char to PC!!! } теперь не переходит к LowLevelInit().... в регистре US_CSR находится 111100000001101000011010 вот это вота... но мне почему-то кажется, что это всё от лукавого... на 22ой ноге появились признаки жизни... но до разъёма не доходит... это я сейчас разберусь... но есть такой вопрос а собственно в доске at91sam7s-ek фирмешной от атмеля... косяки могут быть???
--------------------
все косяки, даже о которых не знает сам разработчик, - мои
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|