teamALI / Mbed 2 deprecated HB2018

Dependencies:   mbed FreeRTOS

Revision:
0:ecd925601fc6
Child:
1:15ab74f0d0f1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fpga.cpp	Fri Nov 23 07:27:43 2018 +0000
@@ -0,0 +1,176 @@
+#include "mbed.h"
+#include "debug.h"
+#include "fpga.h"
+#define CLK_CYC 20.83
+
+#define ADR_TEST_REG 0x0 //テストレジスタ
+#define ADR_RPM_FLSB 0x1 //エンジン回転数 前 LSB
+#define ADR_RPM_FMSB 0x2 //エンジン回転数 前 MSB
+#define ADR_RPM_BLSB 0x3 //エンジン回転数 後ろ LSB
+#define ADR_RPM_BMSB 0x4 //エンジン回転数 後ろ MSB
+
+#define ADR_SUB_FL_I 0x5 //前  ◀ in
+#define ADR_SUB_FL_O 0x6 //前  ◀ out
+#define ADR_SUB_FR_I 0x7 //前  ▶ in
+#define ADR_SUB_FR_O 0x8 //前  ▶ out
+
+#define ADR_SUB_BL_I 0x9 //後ろ ◀ in
+#define ADR_SUB_BL_O 0xA //後ろ ◀ out
+#define ADR_SUB_BR_I 0xB //後ろ ▶ in
+#define ADR_SUB_BR_O 0xC //後ろ ▶ out
+
+#define ADR_USER_SW 0xD //ユーザースイッチ
+#define ADR_ACCEL_F 0xE //アクセル前
+#define ADR_ACCEL_B 0xF //アクセル後ろ
+
+
+// ################################################################
+// SPI通信フォーマットに合わせた供用体定義
+//      bit |15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
+// function |  ID       |               Data                |
+// ################################################################
+typedef union{
+    UINT16  spiCmd;
+    struct{    
+        UINT16    val   : 12;//bit[11: 0] 書き込みデータ
+        UINT16    id    : 4 ;//bit[15:12] レジスタアドレス
+    }bf;
+}SPI_CMD;
+
+// ###############################################################
+// グローバル変数
+// ###############################################################
+static  SPI             spi (p5,p6,p7)  ;//SPI通信ポート定義: mosi, miso, clk
+static  DigitalOut      CS_n(p8)        ;//SPIのチップセレクト
+
+//----------------------------------------------------------------
+//SPIデータ送出
+//----------------------------------------------------------------
+static UINT16 xSpiSendDt(UINT16  dat){
+    unsigned int rtn;
+
+    CS_n= 0;                //チップセレクトアサート
+    rtn = spi.write(dat);   //データ出力
+    CS_n = 1;               //チップセレクトネゲート
+    return rtn;
+}
+
+//================================================================
+//テストレジスタアクセス
+//================================================================
+UINT16 fpgaTest(){
+    static unsigned char k=0;
+    UINT16 spiRtn=0;
+    SPI_CMD cmd;
+
+    //引数を送信するコマンドに成形
+    cmd.bf.id  = ADR_TEST_REG;
+    cmd.bf.val = k++  ; 
+    //SPIデータ送出
+    spiRtn = xSpiSendDt(cmd.spiCmd);
+    return spiRtn;
+}
+//================================================================
+//エンジン回転数を取得
+//================================================================
+UINT16 fpgaGetRpm(bool frontFlg){
+    UINT16      RpmMsb=0;
+    UINT16      RpmLsb=0;
+    UINT32      Rpm=0;
+    double      clc;
+    SPI_CMD     cmd;
+
+    //引数を送信するコマンドに成形
+    cmd.bf.val = 0  ;
+    
+    //下位12bit読み出し
+    cmd.bf.id  = (frontFlg==true) ? ADR_RPM_FLSB : ADR_RPM_BLSB;
+    RpmLsb = xSpiSendDt(cmd.spiCmd);
+    
+    //上位12bit読み出し
+    cmd.bf.id  = (frontFlg==true) ? ADR_RPM_FMSB : ADR_RPM_BMSB;
+    RpmMsb = xSpiSendDt(cmd.spiCmd);
+    
+    //24bit連結:48MHzのクロックサイクル数換算
+    Rpm = (RpmMsb << 12) | RpmLsb;
+    
+    //RPM換算
+    clc = (double)Rpm * CLK_CYC;
+    clc = clc / 1000;
+    clc = 30000000 / clc;
+    
+//    debug("LSB=0x%04X\t",RpmLsb);
+//    debug("MSB=0x%04X\t",RpmMsb);
+//    debug("RPM=0x%08X\t",Rpm);
+    
+    return (UINT16)clc;
+}
+
+//================================================================
+//ユーザースイッチ読み取り
+//================================================================
+UINT16 fpgaUserSw(){
+    UINT16 spiRtn=0;
+    SPI_CMD cmd;
+
+    //引数を送信するコマンドに成形
+    cmd.bf.id  = ADR_USER_SW;
+    cmd.bf.val = 0  ; 
+    //SPIデータ送出/読み出し
+    spiRtn = xSpiSendDt(cmd.spiCmd);
+    //戻り値
+    return spiRtn;
+}
+
+//================================================================
+//サブプロペラ設定
+//================================================================
+void fpgaSubProp
+    (UCHAR iPos     //位置  0:前左 1:前右 2:後左 3:後右
+    ,UCHAR iSlotl   //スロットル設定値
+    )
+{
+    SPI_CMD cmd;
+    UCHAR reg_adr[1];
+    //-----------
+    //設定値は共通
+    cmd.bf.val = iSlotl  ; 
+
+    switch (iPos){
+        case 0x0://
+            reg_adr[0] = ADR_SUB_FL_I;
+            reg_adr[1] = ADR_SUB_FL_O;
+            break;
+        case 0x1://
+            reg_adr[0] = ADR_SUB_FR_I;
+            reg_adr[1] = ADR_SUB_FR_O;
+            break;
+        case 0x2://
+            reg_adr[0] = ADR_SUB_BL_I;
+            reg_adr[1] = ADR_SUB_BL_O;
+            break;
+        case 0x3://
+            reg_adr[0] = ADR_SUB_BR_I;
+            reg_adr[1] = ADR_SUB_BR_O;
+            break;
+        default:
+            return;//何もしないで終わる
+            break;
+    }
+
+    //吸気側
+    cmd.bf.id  = reg_adr[0];
+    xSpiSendDt(cmd.spiCmd);
+    //排気側
+    cmd.bf.id  = reg_adr[1];
+    xSpiSendDt(cmd.spiCmd);    
+}
+
+//================================================================
+//FPGA初期化
+//================================================================
+void fpgaInit(){
+    spi.format(16,3)        ;//SPIのフォーマット指定(bit長、極性)
+    spi.frequency(500000)   ;//クロック周波数
+    CS_n =1                 ;//Low有意なのでHighにしておく
+}
\ No newline at end of file