本文使用友晶開發的RFS模組[1],此模組的特性如下:
RFS
|
本篇文章會注重在藍芽模組的控制。
此RFS_模組是使用HC-05晶片來做藍芽控制。
其中de0-nano對應RFS模組的腳位配置如下所示:
1 // LSENSOR_INT; // GPIO_0_IN[0] // WIFI_RST_n; // GPIO_0[0] 2 // MPU_INT; // GPIO_0_IN[1] // RH_TEMP_I2C_SCL;// GPIO_0[1] 3 // RH_TEMP_DRDY_n; // GPIO_0[2] // RH_TEMP_I2C_SDA;// GPIO_0[3] 4 // MPU_FSYNC; // GPIO_0[4] // LSENSOR_SCL; // GPIO_0[5] 5 // BT_KEY; // GPIO_0[6] // LSENSOR_SDA; // GPIO_0[7] 6 // WIFI_EN; // GPIO_0[8] // MPU_SCL_SCLK; // GPIO_0[9] 7 // WIFI_UART1_RX; // GPIO_0[10] // MPU_SDA_SDI; // GPIO_0[11] 8 // WIFI_UART0_RX; // GPIO_0[12] // WIFI_UART0_TX; // GPIO_0[13] 9 // UART2USB_TX; // GPIO_0[14] // UART2USB_RX; // GPIO_0[15] 10 // BT_UART_RX; // GPIO_0[16] // BT_UART_TX; // GPIO_0[17] 11 // WIFI_UART0_CTS; // GPIO_0[18] // WIFI_UART0_RTS; // GPIO_0[19] 12 // UART2USB_RTS; // GPIO_0[20] // UART2USB_CTS; // GPIO_0[21] 13 // BT_UART_CTS; // GPIO_0[22] // BT_UART_RTS; // GPIO_0[23] 14 // MPU_CS_n; // GPIO_0[24] // MPU_AD0_SDO; // GPIO_0[25] 15 // TMD_D[2] // GPIO_0[26] // TMD_D[3]; // GPIO_0[27] 16 // TMD_D[1] // GPIO_0[28] // TMD_D[0]; // GPIO_0[29] 17 // TMD_D[7] // GPIO_0[30] // TMD_D[6]; // GPIO_0[31] 18 // TMD_D[5] // GPIO_0[32] // TMD_D[4]; // GPIO_0[33]
以下是參考友晶範例,修改成DE0-NANO版本。
1 /* 2 Tamkang University I.C.LAB. 3 */ 4 5 // ============================================================================ 6 // Revision History: 7 // ============================================================================ 8 // Ver.: |Author: |Mod. Date: |Changes Made: 9 // V1.0 |Shih-An Li|09/01/2017 | HC-05 test 10 // ============================================================================ 11 12 //======================================================= 13 // This code is generated by Terasic System Builder 14 //======================================================= 15 `default_nettype none 16 module DE0_Nano( 17 18 //////////// CLOCK ////////// 19 CLOCK_50, 20 21 //////////// LED ////////// 22 LED, 23 24 //////////// KEY ////////// 25 KEY, 26 27 //////////// SW ////////// 28 SW, 29 30 //////////// SDRAM ////////// 31 DRAM_ADDR, 32 DRAM_BA, 33 DRAM_CAS_N, 34 DRAM_CKE, 35 DRAM_CLK, 36 DRAM_CS_N, 37 DRAM_DQ, 38 DRAM_DQM, 39 DRAM_RAS_N, 40 DRAM_WE_N, 41 42 //////////// EPCS ////////// 43 EPCS_ASDO, 44 EPCS_DATA0, 45 EPCS_DCLK, 46 EPCS_NCSO, 47 48 //////////// Accelerometer and EEPROM ////////// 49 G_SENSOR_CS_N, 50 G_SENSOR_INT, 51 I2C_SCLK, 52 I2C_SDAT, 53 54 //////////// ADC ////////// 55 ADC_CS_N, 56 ADC_SADDR, 57 ADC_SCLK, 58 ADC_SDAT, 59 60 //////////// 2x13 GPIO Header ////////// 61 GPIO_2, 62 GPIO_2_IN, 63 64 //////////// GPIO_0, GPIO_0 connect to GPIO Default ////////// 65 GPIO_0, 66 GPIO_0_IN, 67 68 //////////// GPIO_1, GPIO_1 connect to GPIO Default ////////// 69 GPIO_1, 70 GPIO_1_IN 71 ); 72 73 //======================================================= 74 // PARAMETER declarations 75 //======================================================= 76 77 78 //======================================================= 79 // PORT declarations 80 //======================================================= 81 82 //////////// CLOCK ////////// 83 input CLOCK_50; 84 85 //////////// LED ////////// 86 output [7:0] LED; 87 88 //////////// KEY ////////// 89 input [1:0] KEY; 90 91 //////////// SW ////////// 92 input [3:0] SW; 93 94 //////////// SDRAM ////////// 95 output [12:0] DRAM_ADDR; 96 output [1:0] DRAM_BA; 97 output DRAM_CAS_N; 98 output DRAM_CKE; 99 output DRAM_CLK; 100 output DRAM_CS_N; 101 inout [15:0] DRAM_DQ; 102 output [1:0] DRAM_DQM; 103 output DRAM_RAS_N; 104 output DRAM_WE_N; 105 106 //////////// EPCS ////////// 107 output EPCS_ASDO; 108 input EPCS_DATA0; 109 output EPCS_DCLK; 110 output EPCS_NCSO; 111 112 //////////// Accelerometer and EEPROM ////////// 113 output G_SENSOR_CS_N; 114 input G_SENSOR_INT; 115 output I2C_SCLK; 116 inout I2C_SDAT; 117 118 //////////// ADC ////////// 119 output ADC_CS_N; 120 output ADC_SADDR; 121 output ADC_SCLK; 122 input ADC_SDAT; 123 124 //////////// 2x13 GPIO Header ////////// 125 inout [12:0] GPIO_2; 126 input [2:0] GPIO_2_IN; 127 128 //////////// GPIO_0, GPIO_0 connect to GPIO Default ////////// 129 inout [33:0] GPIO_0; 130 input [1:0] GPIO_0_IN; 131 132 //////////// GPIO_1, GPIO_1 connect to GPIO Default ////////// 133 inout [33:0] GPIO_1; 134 input [1:0] GPIO_1_IN; 135 136 137 //======================================================= 138 // REG/WIRE declarations 139 //======================================================= 140 //////////// GPIO, GPIO connect to RFS - RF and Sensor ////////// 141 142 143 // LSENSOR_INT; // GPIO_0_IN[0] // WIFI_RST_n; // GPIO_0[0] 144 // MPU_INT; // GPIO_0_IN[1] // RH_TEMP_I2C_SCL;// GPIO_0[1] 145 // RH_TEMP_DRDY_n; // GPIO_0[2] // RH_TEMP_I2C_SDA;// GPIO_0[3] 146 // MPU_FSYNC; // GPIO_0[4] // LSENSOR_SCL; // GPIO_0[5] 147 // BT_KEY; // GPIO_0[6] // LSENSOR_SDA; // GPIO_0[7] 148 // WIFI_EN; // GPIO_0[8] // MPU_SCL_SCLK; // GPIO_0[9] 149 // WIFI_UART1_RX; // GPIO_0[10] // MPU_SDA_SDI; // GPIO_0[11] 150 // WIFI_UART0_RX; // GPIO_0[12] // WIFI_UART0_TX; // GPIO_0[13] 151 // UART2USB_TX; // GPIO_0[14] // UART2USB_RX; // GPIO_0[15] 152 // BT_UART_RX; // GPIO_0[16] // BT_UART_TX; // GPIO_0[17] 153 // WIFI_UART0_CTS; // GPIO_0[18] // WIFI_UART0_RTS; // GPIO_0[19] 154 // UART2USB_RTS; // GPIO_0[20] // UART2USB_CTS; // GPIO_0[21] 155 // BT_UART_CTS; // GPIO_0[22] // BT_UART_RTS; // GPIO_0[23] 156 // MPU_CS_n; // GPIO_0[24] // MPU_AD0_SDO; // GPIO_0[25] 157 // TMD_D[2] // GPIO_0[26] // TMD_D[3]; // GPIO_0[27] 158 // TMD_D[1] // GPIO_0[28] // TMD_D[0]; // GPIO_0[29] 159 // TMD_D[7] // GPIO_0[30] // TMD_D[6]; // GPIO_0[31] 160 // TMD_D[5] // GPIO_0[32] // TMD_D[4]; // GPIO_0[33] 161 162 163 wire RESET_N ; 164 wire [7:0] BCD_T , BCD_H; 165 wire [7:0] POWERUP ; 166 167 168 reg [31:0] rCnt1s; 169 reg rLedg; 170 //======================================================= 171 // Structural coding 172 //======================================================= 173 assign LED[7] = rLedg; 174 always@(posedge CLOCK_50 or negedge RESET_N) begin 175 if(!RESET_N) begin 176 rCnt1s <= 0; 177 rLedg <= 0; 178 end 179 else begin 180 if(rCnt1s > 50000000) begin 181 rCnt1s <= 0; 182 rLedg <= ~rLedg; 183 end 184 else begin 185 rCnt1s <= rCnt1s+1; 186 rLedg <= rLedg; 187 end 188 end 189 end 190 191 rfsqsys u0 ( 192 .clk_clk (CLOCK_50), // clk.clk 193 .reset_reset_n (RESET_N), // reset.reset_n 194 .sdram_addr (DRAM_ADDR), // sdram.addr 195 .sdram_ba (DRAM_BA), // .ba 196 .sdram_cas_n (DRAM_CAS_N), // .cas_n 197 .sdram_cke (DRAM_CKE), // .cke 198 .sdram_cs_n (DRAM_CS_N), // .cs_n 199 .sdram_dq (DRAM_DQ), // .dq 200 .sdram_dqm (DRAM_DQM), // .dqm 201 .sdram_ras_n (DRAM_RAS_N), // .ras_n 202 .sdram_we_n (DRAM_WE_N), // .we_n 203 204 .ledg_export (LED[6:0]), // ledg.export 205 .sw_export (SW), // sw.export 206 .dramclk_clk (DRAM_CLK), // dramclk.clk 207 .altpll_0_areset_export (0), // altpll_0_areset.export 208 209 // PIO KEY 210 .pio_key_external_connection_export(KEY[1]), 211 .bt_key_external_connection_export(GPIO_0[6]), 212 //BT_UART 213 .hc_05_uart_rxd (GPIO_0[16]), // hc_05_uart.rxd 214 .hc_05_uart_txd (GPIO_0[17]) // .txd 215 216 // .altpll_0_locked_export (1), // altpll_0_locked.export 217 // .altpll_0_phasedone_export (1) // altpll_0_phasedone.export 218 ); 219 220 //---- RESET --- 221 assign RESET_N = KEY[0]; 222 223 endmodule
完整檔案請參考下面範例 DE0_Nano_RFSbrd_BT.zip
操作環境是:
Quartus 13.0sp1,
Nios II eclipse 13.0sp1
系統架構如下:
我使用NiosII裡面的UART跟RFS版裡的HC-05溝通。
操作步驟如下:
1. 先把DE0-NANO電源線拔掉。
2. 按住RFS板上面的BT_KEY鈕不放,之後插上DE0-NANO的下載線,提供DE0-板子跟RFS板電源。
(注意: 此時的BT板上的藍色LED燈會慢閃,此時會亮2秒暗2秒,表示HC-05進入了AT COMMAND模式,此時就可以放掉BT_KEY了)
3. 下載 \output\DE0_Nano.sof檔
4. 打開Nios II Eclipse,載入跟執行 \qsys\software\RFS_BT目錄下的檔案*.c跟\BT資料夾
5. 下載友晶提供的APP。
打開APP,點選右上角選項,打開手機藍芽裝置後等待DE0-NANO板連接。
5.執行NIOS並下載到DE0-NANO板結果如下:
按0會秀出0, 1,2 三個選項,我們選2。
Input 0 to show the menu: 0 0: Show menu. 1: BT Config. 2: Enter BT SPP RFCOMM Master mode. Input 0 to show the menu:
接續上圖
1 Input 0 to show the menu: 2 3 0 4 0: Show menu. 5 1: BT Config. 6 2: Enter BT SPP RFCOMM Master mode. 7 Input 0 to show the menu: 8 9 2 10 6: Enter BT SPP RFCOMM Master mode. 11 HC-05 Master Demo 12 TX-->AT+ORGL 13 TX--> AT+ORGL 14 15 RX<--OK 16 17 TX-->AT+INIT 18 TX--> AT+INIT 19 20 RX<--OK 21 22 TX-->AT+NAME=HC-05 23 TX--> AT+NAME=HC-05 24 25 RX<--OK 26 27 TX-->AT+UART=115200,0,0 28 TX--> AT+UART=115200,0,0 29 30 RX<--OK 31 32 TX-->AT+PSWD? 33 TX--> AT+PSWD? 34 35 RX<--+PSWD:1234 36 37 RX<--OK 38 39 TX-->AT+CLASS=0 40 TX--> AT+CLASS=0 41 42 RX<--OK 43 44 TX-->AT+CLASS? 45 TX--> AT+CLASS? 46 47 RX<--+CLASS:0 48 49 RX<--OK 50 51 TX-->AT+ROLE=1 52 TX--> AT+ROLE=1 53 54 RX<--OK 55 56 TX-->AT+POLAR=1,0 57 TX--> AT+POLAR=1,0 58 59 RX<--OK 60 61 TX-->AT+INQM=1,9,48 62 TX--> AT+INQM=1,9,48 63 64 RX<--OK 65 66 TX-->AT+INQ 67 TX--> AT+INQ 68 69 RX<--+INQ:1002:B5:AB9E55,2010C,FFE4 70 71 RX<--+INQ:90E7:C4:4F1DA2,5A020C,FFBF 72 73 RX<--+INQ:1002:B5:AB9E55,2010C,FFE4 74 75 RX<--+INQ:1002:B5:AB9E55,2010C,FFE4 76 77 RX<--+INQ:1002:B5:AB9E55,2010C,FFE4 78 79 RX<--+INQ:90E7:C4:4F1DA2,5A020C,FFBF 80 81 RX<--+INQ:1002:B5:AB9E55,2010C,FFE4 82 83 RX<--+INQ:90E7:C4:4F1DA2,5A020C,FFBE 84 85 RX<--+INQ:1002:B5:AB9E55,2010C,FFE4 86 87 RX<--OK 88 89 Device[0]:1002,B5,AB9E55 90 TX-->AT+RNAME?1002,B5,AB9E55 91 TX--> AT+RNAME?1002,B5,AB9E55 92 93 +RNAME:DESKTOP-GC2UFIB 94 95 Device[1]:90E7,C4,4F1DA2 96 TX-->AT+RNAME?90E7,C4,4F1DA2 97 TX--> AT+RNAME?90E7,C4,4F1DA2 98 99 +RNAME:DESKTOP-GC2UFIB 100 101 Please input a number to select the desired device. 102 For example, input 0 to select first device. 103 104 1 105 1 106 TX-->AT+PAIR=90E7,C4,4F1DA2,30 107 TX--> AT+PAIR=90E7,C4,4F1DA2,30 108 109 RX<--+RNAME:lishyhan01 110 111 RX<--OK 112 113 TX-->AT+BIND=90E7,C4,4F1DA2 114 TX--> AT+BIND=90E7,C4,4F1DA2 115 116 RX<--OK 117 118 TX--> Hello World! 119 120 RX<--0 121 RX<--1 122 RX<--2 123 RX<--3
在第89行和95行有找到2個藍芽元件,一個是我電腦的藍芽,一個是手機的藍芽。
我輸入1 讓DE0-NANO連接手機
當連接成功後 手機APP畫面會出現輸入BT配對碼視窗,預設密碼是1234
當手機輸入完後,APP左上角就會出現connect to HC-05成功訊息。
在APP畫面按LED0,LED1後會再NIOS console視窗出現第120~123行的訊息,表示成功。
--------------------------HC-05燈號說明------------------------------------------------
1. 在尚未與裝置連線之前,HC-05板子上的LED將快速閃爍
2. 在與裝置連線成功後,HC-05板子上的LED將每三秒連閃兩次
3. 進入AT模式,LED將慢速閃爍(兩秒閃爍一次)
------------------------------------------------------------------------------------------------
完整範例檔案下載