注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
mcy_cool的个人空间 https://home.eeworld.com.cn/space-uid-320632.html [收藏] [复制] [分享] [RSS]
日志

GPS驱动开发--EB365

已有 2697 次阅读2012-12-27 10:38 |

前几天在网上买的一个GPS模块到货了,准备为其写一个GPS驱动。
硬件平台采用购买的arduino接口的GPS模块,GPS芯片是EB-365,该芯片完全兼容U-Blox。下面是模块图片:

主控板采用CooCox推出的Cookie板:
该主控板完全兼容arduino接口,同时还扩展和丰富了其功能,详细情况可参见CooCox官网中关于Cookie板的介绍。
软件采用CooCox推出的CoIDE编译器,函数库采用的是CooCox为了实现基于M3、M0、M0+、M4内核的各种芯片上平滑移植的目标而推出的CoX固件库。

初步阅读芯片手册,整理出一下指令方式和信息:
GGA:时间、位置、定位类型
GLL:UTC时间、经度、纬度
GSA:GPS接收机操作模式、定位使用的卫星、DOP值
GSV:可见GPS卫星信息、仰角、方位角、信噪比(SNR)
RMC:时间、日期、位置、速度
注意:输出的信息、频率与设置有关

同时注意北京时间比UTC时间快8小时,因此在处理时间时应特别注意时间变换和闰平年的问题。

下面开始具体编写驱动程序……

因为硬件平台的关系,我们采用串口1来接收GPS数据流。
串口1采用9600,8,1,0,中断接收,因为GPS每一帧数据最大只有60至70之间,故我们定义了一个全局数组rev_buf[80]用来接收GPS的信息,详细程序如下:
//*****************************************************************************
//
//! \brief UART1 Interrupt Receive Service.
//!
//! \param None.
//!
//! \return None.
//
//*****************************************************************************
unsigned char num = 0;
//
//! You need to define these variables in the main.c and initialize to 0.
//
extern char rev_buf[80];        //Receive Buffer
extern unsigned char rev_start, //Receiving start flag
                     rev_stop,  //Receiving end flag
                     gps_flag;  //GPS Processed flag
unsigned long
uart1CallbackFunc(void *pvCBData, unsigned long ulEvent, 
                   unsigned long ulMsgParam, void *pvMsgData)      
{
    unsigned char ch; 
    ch = UARTCharGet(sUART_BASE);
    if ((ch == '$') && (gps_flag == 0))
    {
        rev_start = 1;
        rev_stop  = 0;   
    }
    if (rev_start == 1)
    {
        rev_buf[num++] = ch; 
        if (ch == '\n')      
        {
            rev_buf[num] = '\0';
            rev_start = 0;
            rev_stop  = 1;  
            gps_flag = 1;
            num = 0;
        }
    }
    return 0;
}
//*****************************************************************************
//
//! \brief UART1 Initialize.
//!
//! \param ulBaudrate is the baud rate of UART1.
//!
//! \return None.
//
//*****************************************************************************
void
UART1_Init(unsigned long ulBaudrate) //9600
{
    xSysCtlPeripheralReset(xSYSCTL_PERIPH_UART1);
    xSysCtlPeripheralEnable(xSYSCTL_PERIPH_UART1);
    xSysCtlPeripheralClockSourceSet(xSYSCTL_UART0_MAIN, 1);
    xSysCtlPeripheralEnable(xGPIOSPinToPeripheralId(sD0));
    sPinTypeUART(sUART_BASE);
 
    xUARTConfigSet(sUART_BASE, ulBaudrate, (UART_CONFIG_WLEN_8   |
                                            UART_CONFIG_STOP_ONE |
                                            UART_CONFIG_PAR_NONE));
    xUARTIntEnable(sUART_BASE, xUART_INT_RX);
    UARTIntCallbackInit(sUART_BASE, uart1CallbackFunc);
    xUARTEnable(sUART_BASE, (UART_BLOCK_UART | UART_BLOCK_TX | UART_BLOCK_RX));
    xIntEnable(xINT_UART1);
}
经测试,串口能够稳定的接收GPS数据流。表明底层串口部分没有问题了。下面开始开始阅读各个数据帧对应的意义,准备对数据帧进行解析。
因为原芯片手册只有英文版的,现上传本人自己翻译的中文版,鉴于本人英文水平有限,只能作为参考

GGA

样例数据:

$GPGGA,161229.487,3723.2475,N,12158.3416,W,1,07,1.0,9.0,M, , , ,0000*18

名称

样例

单位

描述

消息ID

$GPGGA

 

GGA协议头

UTC时间

161229.487

 

hhmmss.sss

纬度

3723.2475

 

ddmm.mmmm

N/S指示

N

 

N=北,S=

经度

12158.3416

 

dddmm.mmmm

E/W指示

W

 

W=西,E=

定位指示

1

 

0:未定位

1:SPS模式,定位有效

2:差分,SPS模式,定位有效

6:航位推算模式,定位有效

卫星数目

7

 

范围012

HDOP

1

 

水平精度

MSL幅度

9

-

单位

M

 

大地

 

-

单位

M

 

-

差分时间

 

当没有DGPS时,无效

差分ID

0

 

 

校验和

*18

 

 

 

 

消息结束

GLL

样例数据:$GPGLL,3723.2475,N,12158.3416,W,161229.487,A*2C

名称

样例

单位

描述

消息ID

$GPGLL

 

GLL协议头

纬度

3723.2475

 

ddmm.mmmm

N/S指示

N

 

N=北,S=

经度

12158.3416

 

dddmm.mmmm

E/W指示

W

 

W=西,E=

UTC位置

161229.487

 

hhmm.mmmm

状态

A

 

A=数据有效;V=数据无效

模式

A

A: 自动模式

D: DGPS模式

E: DR模式

N: 输出模式但是无效

校验和

*41

 

 

 

 

消息结束

GSA

样例数据:$GPGSA,A,3,07,02,26,27,09,04,15, , , , , ,1.8,1.0,1.5*33

名称

样例

单位

描述

消息ID

$GPGSA

 

GSA协议头

模式1

A

 

M=手动(强制操作在2D3D模式),

A=自动

 

模式2

 

 

3

 

 

1:定位无效

2:2D定位

3:3D定位

卫星使用

7

 

通道1卫星

卫星使用

2

 

通道2卫星

 

 

卫星使用

 

 

通道12卫星

PDOP

1.8

 

位置精度

HDOP

1

 

水平精度

VDOP

1.5

 

垂直精度

校验和

*33

 

 

 

 

消息结束

GSV

样例数据:

$GPGSV,2,1,07,07,79,048,42,02,51,062,43,26,36,256,42,27,27,138,42*71

$GPGSV,2,2,07,09,23,313,42,04,19,159,41,15,12,041,42*41

名称

样例

单位

描述

消息ID

$GPGSV

 

GSV协议头

消息数目

2

 

范围13

消息编号

1

 

范围13

卫星数目

7

 

 

卫星ID

7

 

范围132

仰角

79

最大90°

方位角

48

范围0359°

载噪比(C/No

42

dBHz

范围099,没有跟踪时为空

 

 

卫星ID

27

 

范围132

仰角

27

最大90°

方位角

138

范围0359°

载噪比(C/No

42

dBHz

范围099,没有跟踪时为空

校验和

*71

 

 

 

 

消息结束

RMC

样例数据:$GPRMC,161229.487,A,3723.2475,N,12158.3416,W,0.13,309.62,120598, ,*10

名称

样例

单位

描述

消息ID

$GPRMC

 

RMC协议头

UTC时间

161229.487

 

hhmmss.sss

状态

A

 

A=数据有效;V=数据无效

纬度

3723.2475

 

ddmm.mmmm

N/S指示

N

 

N=北,S=

经度

12158.3416

 

dddmm.mmmm

E/W指示

W

 

W=西,E=

地面速度

0.13

Knot(节)

 

方位

309.62

真北为参考基准 

日期

120598

 

ddmmyy

磁变量

 

 

E=东  W=西-

东西方向指示

E

E=

模式

A

A: 自动模式

D: DGPS模式

E: DR模式

N: 输出模式但是无效

校验和

*10

 

 

 

 

消息结束

现在最重要的就是数据流的解析程序了,现在正在进行中……
评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章