卫星导航接收机ZYNQ实现(二)
前言
前面提到打算用MAX2769这个片子实现射频的功能,根据参考电路做了一块小板,插到微相Z7-lite那块开发板上,用于验证射频功能。最初看这个片子目的是打算做一个简单的中频信号采集器,通过USB传到上位机,可惜看了很久总感觉无法避开FPGA,只好退而求其次,单纯的做一块射频板。

MAX2769简介
MAX2769是一款通用的单芯片全球导航卫星系统(GNSS)接收机,用于GPS 、GLONASS以及伽利略导航卫星系统。
MAX2769采用Maxim先进的低功率SiGe BiCMOS工艺,能够以较低的成本提供业界最高的性能和集成度。单芯片内集成了完整的接收链路,包括双输入LNA、混频器、镜频抑制滤波器、PGA、VCO、N分频频率合成器、晶体振荡器和位复用ADC。该接收器的总噪声系数低至1.4dB。
特性
GPS/GLONASS/伽利略接收机
无需外部IF SAW或分立式滤波器
可编程设置IF频率
集成VCO的N分频频率合成器支持宽范围的参考时钟频率
内部独立的双输入LNA分别用于无源和有源天线输入
总噪声系数1.4dB
内置晶体振荡器
内置温度检测器
内置有源天线检测器
低功耗模式下电源电流为10mA
供电电压为2.7V至3.3V
微型28引脚、RoHS兼容、薄型QFN无铅封装(5mm x 5mm)

MAX2769典型电路图
MAX2769只需要简单的电阻电容就能实现,GPS信号射频到中频的转换,典型电路如下


配置方式
配置方式有两种:SPI配置和预设配置方式,预设的配置方式通过SPI三个信号的高低电平实现,仅能实现几种固有的模式。

最初,为图省事,我用的预设的配置方式,即上图中的STATE 3,采样率16.368MHz,中频4.092MHz,经过数天的折腾,终于用softwareGNSS实现了信号的捕获,使我看到了初步的希望。
但是16.368M的采样率存在严重的不足,仅能实现捕获,对于跟踪便显得无能为力了,因为后续需要使用MAX2769输出的始终产生本地信号,而这个时钟与我的系统时钟50M并不兼容。
第二种是SPI配置,PGM引脚拉低,就可以通过SPI写入寄存器配置芯片。

Verilog配置程序如下,也可以使用PL的SPI端口配置,初始化的时候写十个寄存器即可。
module max2769_spi(
output reg sclk,sdio,le,
input rst,clk,
output reg spi_ok
);
wire [3:0] lut_index=4'd9;//spi register 0~lut_index
reg [3:0] addr;
reg [4:0] state;
reg [31:0] dout_reg;
reg [6:0] shift_reg;
reg[27:0] cnt;
always @ (posedge clk or negedge rst)
if(!rst)
begin
sclk<=1'b0;
le<=1'b1;
sdio<=1'b1;
state<=5'd0;
addr<=4'd0;
dout_reg<=32'd0;
shift_reg<=7'd0;
spi_ok<=1'b0;
cnt <= 0;
end
else
begin
case(state)
5'd0:
begin
le<=1'b1;sclk<=1'b0;sdio<=1'b1;
if(cnt < 28'd10000) begin
state<=5'd0;
cnt <= cnt + 1'd1;
end
else
state<=5'd1;
end
5'd1:begin le<=1'b1;sclk<=1'b0;sdio<=1'b1;state<=5'd2;end
5'd2:begin le<=1'b1;sclk<=1'b0;sdio<=1'b1;state<=5'd3;end
5'd3:
begin
le<=1'b1;sclk<=1'b0;sdio<=1'b1;state<=5'd4;
case(addr)
4'd0:dout_reg<={28'hA291FA3,addr}; // CONF1
4'd1:dout_reg<={28'h8550708,addr}; // CONF2
4'd2:dout_reg<={28'hEAFF1DC,addr}; // CONF3
4'd3:dout_reg<={28'h9CC0008,addr}; //PLL
4'd4:dout_reg<={28'h0C48140,addr}; //DIV 0000_0000_1001_1100_0000_0000_1000 28'h009C008
4'd5:dout_reg<={28'h8000070,addr}; //FDIV 28'hC560470
4'd6:dout_reg<={28'h8000000,addr}; //STRM
4'd7:dout_reg<={28'h10061B2,addr}; //CLK
4'd8:dout_reg<={28'h1E0F401,addr};
4'd9:dout_reg<={28'h14C0402,addr};
endcase
end
5'd4:begin le<=1'b0;sclk<=1'b0;sdio<=dout_reg[31];dout_reg<=dout_reg<<1;shift_reg<=shift_reg+1'b1;state<=5'd5;end
5'd5:begin le<=1'b0;sclk<=1'b1;state<=5'd6;end
5'd6:
begin
le<=1'b0;sclk<=1'b0;
if(shift_reg<=7'd31)
begin state<=5'd4;end
else
begin shift_reg<=7'd0;state<=5'd7;end
end
5'd7:begin sclk<=1'b0;le<=1'b1;state<=5'd8;end
5'd8:
begin
sclk<=1'b0;le<=1'b1;
if(addr<lut_index)
begin addr<=addr+1'b1;state<=5'd1;end
else
begin addr<=4'd0;state<=5'd9;end
end
5'd9:begin spi_ok<=1'b1; state<=5'd9; end //state<=5'd0;
endcase
end
endmodule
因为我手上只有40M的温补晶振,输出时钟设为1/2,所以输出为20MHz,本振为频率为1572M,中频信号为3.42MHz,但是我没有找到中频滤波器中心频率的公式,所以还是默认的4MHz,带宽2.5MHz,够用了。


捕获的6颗卫星信号。
总结
MAX2769这个片子是一款比较理想的接收机芯片,通过几个月的折腾,终于把中频信号的问题解决了,实现了接收机的第一步。
