سلام
بهتره برای پیکربندی بخش های مختلف میکروکنترلر از کد های استاندارد استفاده کنید ، این کد ها در فایل هدر میکروکنترلر وجود داره ، مثلا به جای :
کد:
*AT91C_PIOA_PDR =(1<<0|1<<1);//Disable pin0 pin 1 for usart0
میتونید بنویسید :
کد:
*AT91C_PIOA_PDR|=(AT91C_PA0_RXD0 | AT91C_PA1_TXD0|AT91C_PA3_RTS0);
در زیر پیکربندی صحیح واحد USART1 رو مشاهده میکنید شما متونید این پیکربندی رو با تغییر دادن شماره ی واحد به یک و همچنین شماره پایه ها به یوزارت 0 تغییر بدید )
کد:
//*AT91C_PMC_PCER : (PMC) Peripheral Clock Enable Register for USART0
*AT91C_PMC_PCER|=(1<<AT91C_ID_US1); // Enable Clock for USART0
*AT91C_PIOA_PDR|=(AT91C_PA5_RXD1 | AT91C_PA6_TXD1|AT91C_PA8_RTS1|AT91C_PA9_CTS1); //Disable I/O,PA5_RXD1,PA6_TXD1,PA8_RTS1,PA9_CTS1
*AT91C_PIOA_ASR|=(AT91C_PIO_PA5 | AT91C_PIO_PA6|AT91C_PIO_PA8|AT91C_PIO_PA9); // define peripheral A select regidtry
//*AT91C_US0_CR:USART Control Register
*AT91C_US1_CR=(AT91C_US_RSTRX|AT91C_US_RSTTX|AT91C_US_RXEN|AT91C_US_TXEN);//RESET UART, Enable Receiver & Transmitter
//*AT91C_US1_IDR:USART Interrupt Disable Register
*AT91C_US1_IDR = 0xFFFF; // all usart0 interrupts disabled
//*AT91C_US1_RTOR:USART Receiver Time-out Register
*AT91C_US1_RTOR = 0; // receiver time-out (disabled)
//*AT91C_US1_TTGR : USART Transmitter Timeguard Register
*AT91C_US1_TTGR = 0; // transmitter timeguard (disabled)
//*AT91C_US1_MR:USART Mode Register
*AT91C_US1_MR = (AT91C_US_USMODE_NORMAL | AT91C_US_CLKS_FDIV1 | // 8-bit characters
//USART Mode Register=(NORMAL MODE , Clock Selection= MCK/DIV (DIV = 8),
AT91C_US_CHRL_8_BITS | AT91C_US_NBSTOP_1_BIT);
//Character Length: 8 bits , 1 stop bit ) Echo,Local Loopback, Remote Loopback. is disable
// attention :in This mode if USCLKS does not select the external clock SCK the USART drives the SCK pin (CLKO bit in US0_MR)
//Oversampling Mode=8 , The NACK is not generated , The USART does not filter the receive line ,
//if you use other Selected Clock , this line is true:
//*AT91C_US0_BRGR=(((M_crystal*73/14)/2)/usart0_Baud0); //BARD RATE
*AT91C_US1_FIDI = 0; // FI over DI Ratio Value (disabled)
*AT91C_US1_IF = 0; // IrDA Filter value (disabled)
*AT91C_US1_BRGR=(((18432000*73/14)/2)/16/9600) ; //BARD RATE
این پیکربندی رو با کد های خودتون مقایسه کنید تا ببنید پیکربندی به درستی انجام شده یا نه .
برای دریافت و ارسال اطلاعات هم دو رجیستر مجزا وجود داره که نشون میده بافر ارسال / دریافت داده پر هست یا خالی ، ارسال داده :
کد:
while (!((*AT91C_US0_CSR) & AT91C_US_TXRDY)); // Wait for Empty Tx Buffer
*AT91C_US0_THR = ch;
برای دریافت داده :
کد:
while (!((*AT91C_US0_CSR) & AT91C_US_RXRDY)); // Wait for Empty Rx Buffer
ch=*AT91C_US0_RHR ;
شما چرا از کتابخونه ها استفاده نمیکنید ؟