在做一个设计,简单来说就是,用FPGA接收GPS的数据,我用UART serial port。
GPS是一个卫星控制系统,数据都是ASCII,比如说:$GPGGA,110040,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47
这个不重要。
我给UART写了一个中断,每当有数据从GPS发来,产生中断,读取数据并且把储存到buffer里。为了检测程序是不是能够获得数据,我就加了个print的功能,但是运行后,只能收到很多方块~~~~
说明是有数据进来的,又调试了一下,发现status的rrby bit没有变成过1,也就是说中断没有产生,不知道是为什么?
另外,GPS传输数据的波特率是4800,我的系统中定义的UART波特率是115200。速度比GPS快,我需要把它改成4800吗?不是很懂baud rate这个东西~~~望指教。
程序如下:
#define quelen 2048
char queue[quelen];
int input_index = 0;
int output_index = 0;
static void init_uart_receiver();
static void handle_uart_interrups(void* context, alt_u32 id);
int main(void)
{
int ch;
int temp_index;
char *gga ="GPGGA";
init_uart_receiver();
while(1)
{
if(output_index != input_index)
{
temp_index =output_index;
if(temp_index >=quelen)
temp_index=0;
ch =queue[temp_index];
output_index =temp_index+1;
}
if(ch=='$')
{
if(strncmp(gga,&queue[temp_index+1],5)==0)
printf("%c", queue[temp_index+7]);
}
}
return 0;
}
static void init_uart_receiver()
{
void* status_ptr;
IOWR_ALTERA_AVALON_UART_CONTROL(UART1_BASE, 0x80);
IOWR_ALTERA_AVALON_UART_STATUS(UART1_BASE, 0x0);
IOWR_ALTERA_AVALON_UART_RXDATA(UART1_BASE, 0x0);
alt_irq_register(UART1_IRQ,status_ptr,handle_uart_interrups);
}
static void handle_uart_interrups(void* context, alt_u32 id)
{
char ch;
int temp_index;
volatile char* status_ptr =(volatile char*)context;
*status_ptr =IORD_ALTERA_AVALON_UART_STATUS(UART1_BASE);
if(IORD_ALTERA_AVALON_UART_STATUS(UART1_BASE) ==0x80)
{
ch =IORD_ALTERA_AVALON_UART_RXDATA(UART1_BASE);
temp_index =input_index;
if(temp_index>=quelen)
temp_index =0;
if(temp_index != output_index)
{
queue[temp_index] =ch;
input_index =temp_index+1;
}
}
IOWR_ALTERA_AVALON_UART_STATUS(UART1_BASE, 0x0);
}
非常感谢!!
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |