Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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にしておく
}