在做一个设计,简单来说就是,用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); }
非常感谢!! |