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.
Diff: fpga.cpp
- Revision:
- 8:1ca49cb18290
- Parent:
- 1:15ab74f0d0f1
- Child:
- 17:f9610f3cfa1b
diff -r bfbbf605be43 -r 1ca49cb18290 fpga.cpp
--- a/fpga.cpp Sat Nov 24 11:49:51 2018 +0000
+++ b/fpga.cpp Mon Nov 26 13:58:16 2018 +0000
@@ -1,8 +1,10 @@
#include "mbed.h"
-#include "debug.h"
#include "fpga.h"
-#define CLK_CYC 20.83
+
+#define CLK_CYC 20.83 //FPGAのクロック周期
+//-----------------------------
+//FPGAレジスタアドレスマップ
#define ADR_TEST_REG 0x0 //テストレジスタ
#define ADR_RPM_FLSB 0x1 //エンジン回転数 前 LSB
#define ADR_RPM_FMSB 0x2 //エンジン回転数 前 MSB
@@ -22,7 +24,7 @@
#define ADR_USER_SW 0xD //ユーザースイッチ
#define ADR_ACCEL_F 0xE //アクセル前
#define ADR_ACCEL_B 0xF //アクセル後ろ
-
+//-----------------------------
// ################################################################
// SPI通信フォーマットに合わせた供用体定義
@@ -41,33 +43,42 @@
// グローバル変数
// ###############################################################
static SPI spi (p5,p6,p7) ;//SPI通信ポート定義: mosi, miso, clk
-static DigitalOut CS_n(p8) ;//SPIのチップセレクト
+static DigitalOut CS_n(p8) ;//SPIのチップセレクトピン
-//----------------------------------------------------------------
+//-----------------------------------
//SPIデータ送出
-//----------------------------------------------------------------
-static UINT16 xSpiSendDt(UINT16 dat){
+//-----------------------------------
+static UINT16 xSpi16bitSend(UINT16 dat){
unsigned int rtn;
CS_n= 0; //チップセレクトアサート
rtn = spi.write(dat); //データ出力
CS_n = 1; //チップセレクトネゲート
- return rtn;
+ return rtn; //SPIリードデータを返す
+}
+//-----------------------------------
+//SPI送出データの組み立てて通信
+//-----------------------------------
+static UINT16 xSpi(UCHAR id , UINT16 val){
+ UINT16 spiRtn=0;
+ SPI_CMD cmd;
+
+ //引数を送信するコマンドに成形
+ cmd.bf.id = id;
+ cmd.bf.val = val;
+ //SPIデータ送出し読み出し値を取得
+ spiRtn = xSpi16bitSend(cmd.spiCmd);
+ //レジスタ読み出し値を返す
+ return spiRtn;
}
//================================================================
//テストレジスタアクセス
//================================================================
-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);
+UINT16 fpgaTest(UINT16 val){
+ //SPI通信
+ UINT16 spiRtn = xSpi(ADR_TEST_REG , val);
+ //レジスタ読み出し値を返す
return spiRtn;
}
//================================================================
@@ -78,18 +89,9 @@
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);
+ RpmLsb = xSpi((frontFlg==true) ? ADR_RPM_FLSB : ADR_RPM_BLSB , 0);//下位12bit読み出し
+ RpmMsb = xSpi((frontFlg==true) ? ADR_RPM_FMSB : ADR_RPM_BMSB , 0);//上位12bit読み出し
//24bit連結:48MHzのクロックサイクル数換算
Rpm = (RpmMsb << 12) | RpmLsb;
@@ -98,43 +100,14 @@
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);
-
+ //回転数rpmを返す
return (UINT16)clc;
}
-
//================================================================
-//ユーザースイッチ読み取り
+//サブプロペラ設定 位置 0:前左 1:前右 2:後左 3:後右
//================================================================
-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;
+bool fpgaSubProp(UCHAR iPos,UINT16 iSlotl){
UCHAR reg_adr[1];
- //-----------
- //設定値は共通
- cmd.bf.val = iSlotl ;
switch (iPos){
case 0x0://
@@ -154,16 +127,34 @@
reg_adr[1] = ADR_SUB_BR_O;
break;
default:
- return;//何もしないで終わる
- //break;
+ return false;//何もしないで終わる
}
- //吸気側
- cmd.bf.id = reg_adr[0];
- xSpiSendDt(cmd.spiCmd);
- //排気側
- cmd.bf.id = reg_adr[1];
- xSpiSendDt(cmd.spiCmd);
+ xSpi(reg_adr[0] , iSlotl);//吸気側
+ xSpi(reg_adr[1] , iSlotl);//排気側
+
+ //正常終了
+ return true;
+}
+
+//================================================================
+//ユーザースイッチ読み取り
+//================================================================
+UINT16 fpgaGetUserSw(){
+ //SPIデータ送出/読み出し
+ UINT16 spiRtn = xSpi(ADR_USER_SW , 0);
+ //戻り値
+ return spiRtn;
+}
+
+//================================================================
+//アクセル設定 位置 0:前 1後
+//================================================================
+bool fpgaEngine(bool iFlontFlg , UINT16 iSlotl){
+
+ xSpi((iFlontFlg==true)? ADR_ACCEL_F : ADR_ACCEL_B , iSlotl);
+
+ return true;
}
//================================================================