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:
- 0:ecd925601fc6
- Child:
- 1:15ab74f0d0f1
diff -r 000000000000 -r ecd925601fc6 fpga.cpp
--- /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