搞了两天,at91sam7x256之串口uart0终于搞定了,
一开始出现的问题是发送出来的数据不对,但是用串口调试助手给开发板发送数据,然后直接回送没有问题。
原因是串口波特率设置不对,我把晶振频率FOSC作为系统主时钟MCK用了,虽然检查半天控制寄存器US_CR和模式寄存器US_MR各个位的值设置都没有问题,也是不行的。
看了开发板例程中的board .h头文件,我才知道原来晶振频率FOSC作为系统主时钟MCK不同:
#define AT91B_MAIN_OSC 18432000 // Main Oscillator MAINCK
#define AT91B_MCK ((18432000*73/14)/2) // Output PLL Clock
波特率问题就这样搞定了,可是还是有问题:
发送0x55,串口调试助手收到0xaa
发送0xbb,串口调试助手受到0xdd
这个问题也是灵机一动,这么有规律的错误,肯定是那个寄存器设置有点问题,
原来我把US_MR中US_MSBF设置了【高位在前地位在后】的发送,去掉这个US_MSBF设置使用默认的【低位在前高位在后】就可以了。
又解决一个问题,下功夫,就有收获啊。
代码都好了,贴出来以后还能用。
//UART0.H文件内容
extern AT91S_AIC * pAIC;
void SendChar(unsigned char CH);
void Init_UART0();
//UART0.C文件内容
#include <AT91SAM7X256.H>
#include "UART0.H"
#define Fosc 18432000
#define AT91B_MAIN_OSC 18432000 // Main Oscillator MAINCK
#define AT91B_MCK ((18432000*73/14)/2) // Output PLL Clock
AT91PS_PIO GPIO_A=AT91C_BASE_PIOA;
AT91PS_USART UART0 =AT91C_BASE_US0;
//----------------------------------------
AT91S_AIC * pAIC=AT91C_BASE_AIC;
unsigned char DacContralBuff[16];
//----------------------------------------
void SendChar(unsigned char CH)
{
while(!(UART0->US_CSR&0X02));
UART0->US_THR=CH;
}
//----------------------------------------
unsigned char GetChar()
{
unsigned char ch;
return ch;
}
//-----------------------------------------
__irq void Usart0ISR(void)
{
*AT91C_AIC_ICCR|=(1 << AT91C_ID_US0);
if(UART0->US_CSR&0X01)
{
DacContralBuff[0]=UART0->US_RHR&0xff;
SendChar(DacContralBuff[0]);
}
*AT91C_AIC_EOICR = 0X00;
}
//=================
__inline unsigned int AT91F_US_Baudrate (
const unsigned int main_clock, // /arg peripheral clock
const unsigned int baud_rate) // /arg UART baudrate