at91sam7串口程序问题, 烦恼中!大家来会诊下
调了好多天的串口程序,就是没搞通。一个板子向电脑发送数据的测试程序。在keil下不接ulink2模拟仿真时,US0_THR中会有数据!
在keil下用ulink2调试时,波特率和帧格式寄存器都对,就是US0_THR中没有数据。
#include <AT91SAM7X256.H>
#define US_RXD (1<<0)
#define US_TXD (1<<1)
#define AT91B_MAIN_OSC 18432000 // Main Oscillator MAINCK
#define AT91B_MCK ((18432000*73/14)/2) // Output PLL Clock
#define BR 9600 /* Baud Rate */
#define BRD(AT91B_MCK/16/BR) /* Baud Rate Divisor */
AT91S_USART * pUSART = AT91C_BASE_US0;
unsigned char buff;
unsigned char index;
sendchar (int ch)
{
while (!(pUSART->US_CSR & AT91C_US_TXRDY)); /* Wait for Empty Tx Buffer */
return (pUSART->US_THR = ch);
}
int main(void)
{
unsigned int i,delay;
// unsigned char val;
// unsigned int status;
// *AT91C_CKGR_MOR=0x700; //使能主振荡器和设置起振时间
// *AT91C_PMC_MCKR=0x01; //选定处理器时钟为主机时钟,不分频
*AT91C_PMC_SCER=AT91C_CKGR_MOSCEN;//0x00000001;使能处理器和USB时钟
*AT91C_PMC_PCER=(1<<AT91C_ID_US0); //值为6,使能USART0时钟
*AT91C_PIOA_PDR=US_RXD|US_TXD; //禁止两管脚IO口功能
*AT91C_PIOA_ASR=US_RXD|US_TXD; //将IO口分配给外围A
//*AT91C_US1_CR=0x10c; //复位发送器、接收器和状态位,
*AT91C_US0_CR=AT91C_US_RSTRX|AT91C_US_RSTTX|AT91C_US_RXDIS|AT91C_US_TXDIS;
*AT91C_US0_MR=0x8c0; //普通模式,时钟为MCK,8位数据位,1位停止位,无校验,over为0
*AT91C_US0_IDR=0xf3fff; //禁止所有USART相关中断
*AT91C_US0_BRGR=BRD; //波特率为9600,AT91C_US0_BRGR为CD值
//*AT91C_US0_BRGR=30; //波特率为38400,AT91C_US0_BRGR为CD值
//*AT91C_US1_CR=0x10c; //复位发送器、接收器和状态位,
*AT91C_US0_CR=0x50; //使能接收和发送,之前US0_CSR为0x1818,使能接收和发送后为0x1a1a
// index=0;
while(1)
{
for(i=1;i<10;i++)
{
sendchar(i);
for(delay=0;delay<100;delay++);
}
}
}
然后我用keil下的例程,目录是C:\Keil\ARM\Boards\Atmel\AT91SAM7X-EK\Hello
这个例子稍微搞一下,在主循环while(1)中,加了个sendchar(1)和一个延时,加个extern声明,还是收不到数据。
相当的郁闷啊。
国内搞at91的论坛不多,好不容易找到一个,大家踊跃发言啊!
Any advice is welcome! 自己顶一下
页:
[1]