USBGPS 开放源代码项目  

 

项目维护人: 鲁郁    

ENGLISH



项目简介

硬件原理

固件

设备驱动

应用软件

下载

开发文档

开发心得与致谢


硬件描述

这个项目全部的硬件包括一个Hacked BAE SuperStarTM GPS 接收机(只有RF和CORRELATOR), 以及USB接口板. 关于如何hack SuperStarTM GPS 接收机, Clifford Kelly 在他的主页上 有非常详细的描述: http://home.earthlink.net/~cwkelley/how_to_hack_a_superstar.htm ; 我这里只讲我的USB接口板的设计.

当我开始设计接口板电路时, 我有两点考虑: 关于第一点考虑,这个项目不是只为我自己, 而且是为其他学生准备. 我可以用德州仪器的DSP 处理器完成接口板设计,但又有多少人能拥有一套DSP开发系统呢? 所以在微控制器的选型上, 我需要考虑这个处理器的开发难度. 这是我为什么选择51家族控制器的原因:容易学习,容易设计, 容易焊板子.我相信每一个高年级的电子工程专业的学生都能通过几天的学习为MCS-51写代码. 并且互联网上关于51系统有非常丰富的设计资源.

关于第二点,我的考虑是: PC机应该完成所有的GPS信号处理. 这样开发者才能在软件级上来 控制所有的GPS处理.这也是一个重要的设计目标. 硬件接口板只负责收集相关器的输出, 当TIC发生时,还要收集测量值; 然后它把这些数据传给PC,等待PC处理的结果;当PC发来指令 时,它再将这些指令写进GP2021的相关寄存器里. 接口板永远不会和PC发生争执,例如:"你 为什么要向GP2021的控制寄存器里写0X3010,我认为0X3020会更好!" 这是不允许的.

基于以上两点考虑,我选择Dallas的DS89C420作为接口板的微控制器. 这款控制器有很多有趣的 特性,具体可以参见其 数据手册用户指南. 我只想提一个特性: 该控制器是51处理器的增强版本, 其大部分的指令只会耗费1或2个时钟周期,而传统的MCS51每个指令至少要耗费12个时钟周期. 这一点使其成为目前世界上最快的传统51的替换芯片. 在这里,我要向 MAXIM 半导体公司表示感谢, 因为他们为这个项目提供了DS89C420的免费样片.

另外一个设计目标是用户应该在不借助任何硬件编程器的情况下,可以将自己设计的固件下载到 接口板, 既ISP功能(在线可编程,In-System-Programmable). 幸运的是,DS89C420提供了这样的能力: 它有16KB的片上闪存,以及内置的ROM LOADER; 在任何时候,ROM LOADER 可以通过以下方式被激活: 置RST=1, EA=0, PSTN=0; ROM LOADER被激活后,用户就可以用基于PC的 软件工具来下载目标代码.

所以在我的硬件设计,主要有3个部分: USBN9603接口,GP2021接口,以及一个串行接口.

DS89C420通过响应USB事件和向USBN9603的寄存器写入控制字来实现USB通信; 硬件原理如下:


 USBN9603 interface


在C语言中, USBN9603的寄存器定义如下:


#define MCNTRL 0x7E00 /*Main control register */
#define CCONF 0x7E01 /*Clk. config. register */
....
#define RXS3 0x7E3E /*RX status register 3 */
#define RXC3 0x7E3F /*RX command register 3 */
在C中向USBN9603的寄存器写入函数如下:
void write_usb(unsigned int usbadr, char dta);
从USBN9603的寄存器读取函数如下:
char read_usb(unsigned int usbadr);
这两个函数都在汇编中实现以提高访问速度.

;***************************************************************
; This subroutine is used to access USBN9603 regs , read
; USAGE: char read_usb(unsigned int usbadr);
; Argument :
; INPUT: R6&R7: address of USBN9603's reg
; OUTPUT: R7: value of that reg
;***************************************************************
_read_usb:
      PUSH DPH
      PUSH DPL
     
      MOV DPH, R6
      MOV DPL, R7
      MOVX A, @DPTR
      MOV R7,A
     
      POP DPL
      POP DPH
      RET


;***************************************************************
; This subroutine is used to access USBN9603 regs ,write
; USAGE: write_usb(unsigned int usbadr, char dta);
; Argument :
; INPUT:
; R6&R7: address of USBN9603's reg
; R5 : value to be written
; OUTPUT:
; none;
;***************************************************************
_write_usb:
      PUSH DPH
      PUSH DPL
     
      MOV DPH, R6
      MOV DPL, R7
      MOV A,R5
      MOVX @DPTR, A
     
      POP DPL
      POP DPH
      RET


DS89C420是8位机,而GP2021的数据总线是16位,所以DS89C420不能直接访问. 为了解决这个问题, 我用16个IO脚造出了一个16位的读写口来访问GP2021.原理图如下:


 GP2021 interface


在C中写入GP2021的函数原型如下:
void write_gps(char add, char lo, char hi);
在C中读取GP2021的函数原型如下:
void read_gps(char add, unsigned int* datadd);
这两个函数也是在汇编中实现的:

;************************************************************
; This subroutine is used to read one data(16bit) from gp2021
; Argument:
; INPUT: R7 --> address
; R4,R5 --> pointer for stored data
; OUTPUT:
; NONE
; USAGE :
;; read_gps(char add, unsigned int* datadd);
;************************************************************
_read_gps:
      CLR EA ; disable all int
     
      MOV DPH, R4 ; set the data pointer
      MOV DPL, R5 ;
     
      MOV P0, R7 ; send address first
     
      MOV P2,#0EFh ; GPS_OE=0, GPS_ALE = 1
      MOV P2,#0EEh ; GPS_OE=0, GPS_ALE = 0
      MOV P0,#0FFh ; setup P0 and P1
      MOV P1,#0FFh ;
      MOV P2,#0E2h ; GPS_OE=0, GPS_RD = 0, GPS_CS = 0
      NOP
      MOV A, P0 ;
      MOVX @DPTR, A ; Store the first byte
     
      MOV A, P1 ;
      INC DPTR ; data pointer ++
      MOVX @DPTR, A ; store the second one
     
      MOV P2, #0FEh ; Idle state
      SETB EA ;
      RET
;************************************************************
; This subroutine is used to write one data(16bit) to gp2021
; Argument:
; INPUT: R7 --> address
; R5,R3 --> MSB & LSB CHAR
; OUTPUT:
; NONE
; USAGE :
; write_gps(char add, char lo, char hi);
;************************************************************
_write_gps:
      CLR EA ; disable all int
      MOV P0, R7 ; send address first
      MOV P2, #0EFh ; GPS_OE=0, GPS_ALE = 1
      MOV P2, #0EEh ; GPS_OE=0, GPS_ALE = 0
      MOV P0, R3 ; Send LSB first
      MOV P1, R5 ; Send MSB next
      MOV P2, #0E8h ; GPS_OE=0, GPS_WR=0, GPS_CS=0
      MOV P2, #0FEh ; Idle state
      SETB EA ;
      RET
如下的原理图是为了提供在线编程功能:


 serial interface


在PCB板子上, PROG连接到了一个JUMPER,而这个JUMPER是接地的. 当用户将JUMPER短路,DS89C420的ROM LOADER就被激活了, 用户的HEX文件就能通过PC的RS232口下载烧入片内的FLASH.


Welcome to USBGPS Opensource Project Homepage
© Copyright 2004    Email:   Yu Lu