首先看原理图:

从PIN开始走:
PIN1:输入,是检测FPGA的DONE信号,表示数据流配置。
PIN2 : 输出,BOOT_SEL。输出1表示选择FX3加载FPGA配置的。输出0表示选择SPI FLASH的配置放置。 这个PIN主要接了模拟开关和M1,M2配置模式选择(参考UG360的P47)。
PIN3,4,6,输出,控制电压使能。
8,9: UART口这里外接到接插件主要用来升级STC的程序。
10:输出,控制FX3单片机的复位。
11:输入,VUSB_OK 用来判断USB电源是否就位,如果电源有了,则可以延时几百毫秒后给FX3复位(通过拉低PIN10)。
12:输入,EXT_RST外部复位输出。这里规定低电平实现复位,需要在STC程序里面实现这部分逻辑。
13:输出,控制3.6V射频部分电压使能。
14:输入作为一个备用的跳线选择工作模式。
15:作为一个备用的按键输入控制,(为了兼容以前的板子可以考虑作为一个复位键)。
16:输出,接FPGA的PROG脚,输出0表示让FPGA丢失配置或者从新配置。
17,18,19:输出接控制灯,RGB三色,低电平点亮。
=========================================================================
其次将这些引脚对应成C代码的定义:
- #define I_FPGA_DONE P15
-
- #define O_BOOT_SEL P16
-
- #define O_EN_1V2 P17
-
- #define O_EN_1V0 P54
-
- #define O_EN_2V5 P55
-
- #define O_EN_2V6 P11
-
- #define O_FX3RSTn P32
-
- #define I_VUSB_OK P33
-
- #define I_EXT_RSTn P34
-
- #define O_EN_3V6 P35
-
- #define I_MCU_P36 P36
-
- #define O_FPGA_PRGn P10
-
- #define O_LED_R P12
-
- #define O_LED_G P13
-
- #define O_LED_B P14
-
-
-
这里我们用到了两个函数,一个是毫秒的延迟函数,以及设置io方向的函数,如下:
-
- // n up to 65*1000
- void delay_ms (unsigned int n ) //@11.0592MHz
- {
- unsigned int i ; while(n--) for(i=0;i<790;++i);
- }
-
- // 1 input
- // 0 output
- void set_io_dir(unsigned char port,unsigned char the_bit,unsigned char dir){
- static unsigned char p1m0, p3m0, p5m0;
- unsigned char t ;
- t = 1 << the_bit ;
- if (port==1) { if(dir == 0) p1m0 |= t; else p1m0 &= ~t ; }
- else if (port==3) { if(dir == 0)p3m0 |= t; else p3m0 &= ~t ; }
- else if (port==5) {if(dir == 0) p5m0 |= t; else p5m0 &= ~t ; }
- else if (port==0xff) {p1m0 = p3m0 = p5m0 = 0 ;}
- P5M0 = p5m0 ; P5M1 = ~p5m0 ;
- P3M0 = p3m0 ; P3M1 = ~p3m0 ;
- P1M0 = p1m0 ; P1M1 = ~p1m0 ;
- }
我们首先设置一下输出的初始值,之后设置一下输入和输出的方向。
- #define I_FPGA_DONE P15
- #define O_BOOT_SEL P16
- #define O_EN_1V2 P17
- #define O_EN_1V0 P54
- #define O_EN_2V5 P55
- #define O_EN_2V6 P11
- #define O_FX3RSTn P32
- #define I_VUSB_OK P33
- #define I_EXT_RSTn P34
- #define O_EN_3V6 P35
- #define I_MCU_P36 P36
- #define O_FPGA_PRGn P10
- #define O_LED_R P12
- #define O_LED_G P13
- #define O_LED_B P14
-
-
- void set_output_def_value (){
- O_BOOT_SEL = 1 ;
- O_EN_1V2 = 0 ;
- O_EN_1V0 = 0 ;
- O_EN_2V5 = 0 ;
- O_EN_2V6 = 0 ;
- O_FX3RSTn = 0 ;
- O_EN_3V6 = 0 ;
- O_FPGA_PRGn = 0 ;
- O_LED_R = 1 ;
- O_LED_G = 1 ;
- O_LED_B = 1 ;
- }
-
-
- void set_all_pin_dir (){
- //set_io_dir(unsigned char port,unsigned char the_bit,unsigned char dir) dir =0 for output
-
- //#define I_FPGA_DONE P15
- set_io_dir(1,5,1);
-
- //#define O_BOOT_SEL P16
- set_io_dir(1,6,0);
-
- //#define O_EN_1V2 P17
- set_io_dir(1,7,0);
-
-
- //#define O_EN_1V0 P54
- set_io_dir(5,4,0);
-
- //#define O_EN_2V5 P55
- set_io_dir(5,5,0);
-
- //#define O_EN_2V6 P11
- set_io_dir(1,1,0);
-
- //#define O_FX3RSTn P32
- set_io_dir(3,2,0);
-
- //#define I_VUSB_OK P33
- set_io_dir(3,3,1);
-
- //#define I_EXT_RSTn P34
- set_io_dir(3,4,1);
-
- //#define O_EN_3V6 P35
- set_io_dir(3,5,0);
-
- //#define I_MCU_P36 P36
- set_io_dir(3,6,1);
-
- //#define O_FPGA_PRGn P10
- set_io_dir(1,0,0);
-
- //#define O_LED_R P12
- set_io_dir(1,2,0);
-
- //#define O_LED_G P13
- set_io_dir(1,3,0);
-
- //#define O_LED_B P14
- set_io_dir(1,4,0);
-
-
- }
-
-
接下来要做的写一个控制上点顺序的程序。其实就是先让USB接口芯片以及FPGA以及无线电都处于复位状态,全部电源都给上之后,保持半秒钟再以此释放USB接口芯片和FPGA的PROGn脚。
这是一个很简单的上电序列,暂且定义函数名为simple_power_up ;
-
-
-
- //r=1 : led r on
- //r=0 : led r off
-
- void set_led_rgb(unsigned char r,unsigned char g ,unsigned b){
- O_LED_R = (r==0)?1:0;
- O_LED_G = (g==0)?1:0;
- O_LED_B = (b==0)?1:0;
-
- //if (r)O_LED_R=0;else O_LED_R=1;
- //if (g)O_LED_G=0;else O_LED_G=1;
- //if (b)O_LED_B=0;else O_LED_B=1;
-
- }
-
- void simple_power_up (){
- O_FPGA_PRGn = 0;
- O_FX3RSTn = 0 ;
-
- O_BOOT_SEL = 1 ;
- O_EN_1V2 = 1 ;
- O_EN_1V0 = 1 ;
- O_EN_2V5 = 1 ;
- O_EN_2V6 = 1 ;
- //O_FX3RSTn = 0 ;
- O_EN_3V6 = 1 ;
- //O_FPGA_PRGn = 0 ;
- delay_ms(300);
- O_FPGA_PRGn = 1;
- O_FX3RSTn = 1 ;
-
- }
-
-
- main (){
- set_output_def_value ();
- set_all_pin_dir ();
- set_led_rgb(1,0,0);delay_ms(300);
- set_led_rgb(0,1,0);delay_ms(300);
- set_led_rgb(0,0,1);delay_ms(300);
- simple_power_up();
- set_led_rgb(0,0,0);//delay_ms(300);
- for(;;)if (I_FPGA_DONE)set_led_rgb(1,1,1);else set_led_rgb(0,0,0);
- }
-
-
-
-
-
-
=========================================================================
最后编译排错。最后全部程序如下所示:
- #include "intrins.h"
- #include "stc8g1k08.h"
-
- // n up to 65*1000
- void delay_ms (unsigned int n ) //@11.0592MHz
- {
- unsigned int i ; while(n--) for(i=0;i<790;++i);
- }
-
- // 1 input
- // 0 output
- void set_io_dir(unsigned char port,unsigned char the_bit,unsigned char dir){
- static unsigned char p1m0, p3m0, p5m0;
- unsigned char t ;
- t = 1 << the_bit ;
- if (port==1) { if(dir == 0) p1m0 |= t; else p1m0 &= ~t ; }
- else if (port==3) { if(dir == 0)p3m0 |= t; else p3m0 &= ~t ; }
- else if (port==5) {if(dir == 0) p5m0 |= t; else p5m0 &= ~t ; }
- else if (port==0xff) {p1m0 = p3m0 = p5m0 = 0 ;}
- P5M0 = p5m0 ; P5M1 = ~p5m0 ;
- P3M0 = p3m0 ; P3M1 = ~p3m0 ;
- P1M0 = p1m0 ; P1M1 = ~p1m0 ;
- }
-
- //#define M0 P14
- //#define M1 P10
- //#define M2 P37
-
- 0 slave spi flash
- 1 active serial from fx3
- //void set_cfg_mode(unsigned char mode){
- // set_io_dir(1,4,0); set_io_dir(1,0,0); set_io_dir(3,7,0);
- // if (mode == 0 ) {
- // M0 = 0 ; M1 = 0 ; M2 = 1 ;
- // } else if (mode == 1 ) {
- // M0 = 1 ; M1 = 1 ; M2 = 1 ;
- // }
- //}
-
- //
- #define I_FPGA_DONE P15
- #define O_BOOT_SEL P16
- #define O_EN_1V2 P17
- #define O_EN_1V0 P54
- #define O_EN_2V5 P55
- #define O_EN_2V6 P11
- #define O_FX3RSTn P32
- #define I_VUSB_OK P33
- #define I_EXT_RSTn P34
- #define O_EN_3V6 P35
- #define I_MCU_P36 P36
- #define O_FPGA_PRGn P10
- #define O_LED_R P12
- #define O_LED_G P13
- #define O_LED_B P14
-
-
- void set_output_def_value (){
- O_BOOT_SEL = 1 ;
- O_EN_1V2 = 0 ;
- O_EN_1V0 = 0 ;
- O_EN_2V5 = 0 ;
- O_EN_2V6 = 0 ;
- O_FX3RSTn = 0 ;
- O_EN_3V6 = 0 ;
- O_FPGA_PRGn = 0 ;
- O_LED_R = 1 ;
- O_LED_G = 1 ;
- O_LED_B = 1 ;
- }
-
-
- void set_all_pin_dir (){
- //set_io_dir(unsigned char port,unsigned char the_bit,unsigned char dir) dir =0 for output
-
- //#define I_FPGA_DONE P15
- set_io_dir(1,5,1);
-
- //#define O_BOOT_SEL P16
- set_io_dir(1,6,0);
-
- //#define O_EN_1V2 P17
- set_io_dir(1,7,0);
-
-
- //#define O_EN_1V0 P54
- set_io_dir(5,4,0);
-
- //#define O_EN_2V5 P55
- set_io_dir(5,5,0);
-
- //#define O_EN_2V6 P11
- set_io_dir(1,1,0);
-
- //#define O_FX3RSTn P32
- set_io_dir(3,2,0);
-
- //#define I_VUSB_OK P33
- set_io_dir(3,3,1);
-
- //#define I_EXT_RSTn P34
- set_io_dir(3,4,1);
-
- //#define O_EN_3V6 P35
- set_io_dir(3,5,0);
-
- //#define I_MCU_P36 P36
- set_io_dir(3,6,1);
-
- //#define O_FPGA_PRGn P10
- set_io_dir(1,0,0);
-
- //#define O_LED_R P12
- set_io_dir(1,2,0);
-
- //#define O_LED_G P13
- set_io_dir(1,3,0);
-
- //#define O_LED_B P14
- set_io_dir(1,4,0);
-
-
- }
-
-
- //r=1 : led r on
- //r=0 : led r off
-
- void set_led_rgb(unsigned char r,unsigned char g ,unsigned b){
- O_LED_R = (r==0)?1:0;
- O_LED_G = (g==0)?1:0;
- O_LED_B = (b==0)?1:0;
-
- //if (r)O_LED_R=0;else O_LED_R=1;
- //if (g)O_LED_G=0;else O_LED_G=1;
- //if (b)O_LED_B=0;else O_LED_B=1;
-
- }
-
- void simple_power_up (){
- O_FPGA_PRGn = 0;
- O_FX3RSTn = 0 ;
-
- O_BOOT_SEL = 1 ;
- O_EN_1V2 = 1 ;
- O_EN_1V0 = 1 ;
- O_EN_2V5 = 1 ;
- O_EN_2V6 = 1 ;
- //O_FX3RSTn = 0 ;
- O_EN_3V6 = 1 ;
- //O_FPGA_PRGn = 0 ;
- delay_ms(300);
- O_FPGA_PRGn = 1;
- O_FX3RSTn = 1 ;
-
- }
-
-
- main (){
- set_output_def_value ();
- set_all_pin_dir ();
- while(1){
- set_led_rgb(1,0,0);delay_ms(300);
- set_led_rgb(0,1,0);delay_ms(300);
- set_led_rgb(0,0,1);delay_ms(300);
- if (I_VUSB_OK==1) break;
- }
- simple_power_up();
- set_led_rgb(0,0,0);//delay_ms(300);
- for(;;)if (I_FPGA_DONE)set_led_rgb(1,1,1);else set_led_rgb(0,0,0);
- }
-
-
-
-
-
=========================================================================
明天继续全部静态检查一下后上板子运行。
{{aAx8MOMTIOwoMoMMVTXXxWUmIMXoxwmmHImXIHOOWTWoVoUXOIU8UmHmVmV8x8MH8mxMvUUmXTiwvUMmvOTMWMwiOMOOWxHVMviTTVHVIWVVmOwOIii8TOTXOXT8Xo8UxiHV8XV8vwxwOMivvWvHUiMiw8MITWoXvwMvIWUiTiXVmV8IxxwIoTXwmMUTMTmvWT8vixWiXoTTMmTmiOWHmMVWMiv8VOxXVUVTOOOOvWxwoMvI8xOxOwZz}}