teamALI / Mbed 2 deprecated HB2018

Dependencies:   mbed FreeRTOS

fpga.cpp

Committer:
takeru0x1103
Date:
2018-11-24
Revision:
1:15ab74f0d0f1
Parent:
0:ecd925601fc6
Child:
8:1ca49cb18290

File content as of revision 1:15ab74f0d0f1:

#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にしておく
}