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: main.cpp
- Revision:
- 0:1771028c366a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Sep 30 10:03:28 2021 +0000 @@ -0,0 +1,317 @@ +#include "mbed.h" +// ************ Flashメモリ設定 ************* +/*Flashのコマンドを発行*/ +#define CMD_RDID 0x9f // +#define CMD_READ 0x03 // Address Read Data +#define CMD_WREN 0x06 // Write Enable +#define CMD_SE 0x20 // Sector Erase +#define CMD_HBE 0x52; // Block Erase +#define CMD_BE 0xD8; // Block Erase +#define CMD_PP 0x02 // Page Programming +#define CMD_RDSR1 0x05 // Read Status Resistor (WIP check) +SPI spi(p5,p6,p7); //mosi,miso,sclk +DigitalOut cs(p8); +// ***************************************** + +DigitalOut eps_on(p21); + +SPI spi_a(p5,p6,p7); //mosi,miso,sclk +DigitalOut cs_eps(p8); +DigitalOut cs_com(p9); + +Ticker IR_getHK; +Ticker IR_saveHK; +Ticker IR_HKtoSD; + +Serial pc(USBTX,USBRX); + +// **** グローバル変数 ****** +uint8_t eps_survival_hk[256]; +uint8_t eps_HK_IR[256]; +uint8_t i_HK_IR=0; // eps_HK_IRのカウンター +uint16_t IRHK_length = 0; // データ長さ(byte) + +uint8_t seq_flag = 0; +uint8_t EPS_cmd = 0; +uint16_t HK_length = 0; // HKのデータ数.1Hz割込で使用 +// ************************ + +// **** Flashメモリ用 グローバル変数***** +uint32_t addr = 0x0; // survival_HK用 +uint32_t IRHK_addr = 0x000F000; // survival_HK用 +uint8_t tx_buf[256]; // 送信バッファ用意 +uint8_t rx_buf[256]; // 受信バッファ用意 +// *********************************** + +// ************ Flashメモリ用関数 ************* +void spi_init(){ /*spi通信設定*/ + spi.format(8,0); + spi.frequency(1000000); // 1,000,000=1MHz clock rate + cs = 1; //初期化 + } + +void spi_transfer(const uint8_t* tx_buf, uint8_t* rx_buf, uint16_t length) { // 送受信両方判断し通信実行する関数 + //pc.printf("#spi_transfer length= 0x%X\r\n",length); + for(uint16_t i = 0 ; i<length ; i++){ + uint8_t data = spi.write(tx_buf != NULL ? tx_buf[i] : 0x0); // txDataが有るならtxDataを送る,無いなら0を送る + if(rx_buf != NULL){ // もし受信データを表示したい場合 + rx_buf[i] = data; + } + } + } + void spi_read_data(uint8_t* rx_buf, uint16_t length){ /*受信*/ + spi_transfer(NULL, rx_buf, length); + } + void spi_write_data(const uint8_t* tx_buf, uint16_t length){ /*受信*/ + spi_transfer(tx_buf, NULL, length); + } + +/*Flash関数*/ +void flash_send_addr(uint32_t addr) { + const uint8_t data[] = { + (addr >> 16) & 0xff, // 1のところだけ残す + (addr >> 8) & 0xff, + (addr >> 0) & 0xff, + }; + for(int i=0; i<3; i++){ // addr : 3byte + spi.write(data[i]); + } + } + +void flash_rdid(uint8_t* rx_buf, uint16_t length){ /*RDID読み出し*/ + cs = 0; + spi.write(CMD_RDID); + spi_read_data(rx_buf, length); + cs = 1; + } + +void flash_read(uint32_t addr, uint8_t* rx_buf, uint16_t length) { /*読み出し*/ + cs = 0; + spi.write(CMD_READ); + flash_send_addr(addr); + spi_read_data(rx_buf, length); + cs = 1; + } + +void flash_wren(){ // write enable + cs = 0; + spi.write(CMD_WREN); + cs = 1; + } + +void flash_se(uint32_t addr) { // sector erase + cs = 0; + spi.write(CMD_SE); + flash_send_addr(addr); + cs = 1; + } + +void flash_pp(uint32_t addr, const uint8_t* wr_data, uint16_t length) { // Page Program + cs = 0; + spi.write(CMD_PP); + flash_send_addr(addr); + spi_write_data(wr_data, length); + cs = 1; + } + +void flash_rdsr(uint8_t* rx_buf, uint16_t length) { + cs = 0; + spi.write(CMD_RDSR1); + spi_read_data(rx_buf, length); // rx_bufにRDSRの値が入っている + cs = 1; + } + +uint8_t flash_is_wip() { // (WIP)Write In Progress(書込み中)かどうか確認 + uint8_t data; + flash_rdsr(&data, 0x01); // 1byte(StatusRegister情報) + return(data & 0x01); //WIP // ビット演算_& + } + + +void data_debug_print(const uint8_t* data, uint16_t bytes){ //配列を表示 + pc.printf("+0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F\r\n"); + pc.printf("-----------------------------------------------\r\n"); + uint16_t depth = ((bytes - 1) >> 4) + 1; + for(uint16_t j = 0 ; j < depth ; ++j){ //depthは何? + for(uint16_t i = 0 ; i < 16 ; ++i){ + uint8_t d = data[i + (j << 4)]; + pc.printf("%X", (d >> 4) & 0x0f); + pc.printf("%X", (d >> 0) & 0x0f); + pc.printf(" "); + } + pc.printf("\r\n"); + } + pc.printf("\r\n"); + } +// ******************************************Flashメモリ用関数ここまで + +// ************* 割り込み関数 *************** +void getHK_eps_IR() { // 1Hz getHK 割り込み関数 + pc.printf("get EPS 1Hz HK\r\n"); + EPS_cmd = 2; + + cs_eps = 0; + //pc.printf("send cmd to eps\r\n"); + spi_a.write(EPS_cmd); // send command + + HK_length = 4; // 1回で取得するHKデータのbyte数 + for(uint8_t i=0; i < HK_length; i++) { // get data + eps_HK_IR[i_HK_IR] = spi_a.write(0x0); + pc.printf("get eps 1Hz hk: %d\r\n",eps_HK_IR[i_HK_IR]); + i_HK_IR++; + } + cs_eps = 1; + } + +void flash_saveHK_eps_IR() { // 1分毎にFlashにIRHKを保存 + + // eps_HK_IR[]をフラッシュに保存 + flash_wren(); // 書込み・消去の前に必ず必要 + IRHK_length = 4*60; // データ長さ(byte)// + flash_pp(IRHK_addr, eps_HK_IR, IRHK_length); + while(flash_is_wip()){ + } + pc.printf("Flash Write complete! \r\n"); + pc.printf("Write Data check (Read the Written address.)\r\n"); + flash_read(IRHK_addr, rx_buf, IRHK_length); + data_debug_print(rx_buf, IRHK_length); + IRHK_addr += IRHK_length; + } + +void sendHK_from_Flash_to_SD() { + // Flashから読み出し(IRHK_addr-180*4) + pc.printf("send to sd\r\n"); + flash_read(IRHK_addr-(IRHK_length*3), rx_buf, IRHK_length*3); + data_debug_print(rx_buf, IRHK_length*3); + + // send to com + cs_com = 0; + spi.write(0x10); + cs_com = 1; + + wait(1); + + uint8_t rep; + for(uint8_t i=0; i<IRHK_length*3; i++) { // get data + cs_com = 0; + spi.write(rx_buf[i]); // 1byte HK 送る + while(rep!=0x01){ // ビジー確認.rep=1になるまで,永遠にダミーデータを送る + rep = spi.write(0x0); + } + cs_com = 1; + } + + // Flash転送終了コマンド + spi.write(0xFF); + + } +// *****************************************割り込み関数定義終了 +void auto_sequence(uint8_t cmd) { + + if(cmd==1) { + pc.printf("EPS ON \r\n"); + eps_on = 1; + wait(0.5); + eps_on = 0; + } + else if(cmd==2) { // eps Survival Check + EPS_cmd = 1; + + pc.printf("get eps Survival hk\r\n"); + cs_eps = 0; + spi_a.write(EPS_cmd); // send command + //pc.printf("send cmd to eps\r\n"); + cs_eps = 1; + wait(1); // epsのHK取得待ち時間(仮) + + cs_eps = 0; + for(uint8_t i=0; i<2; i++) { // get data + eps_survival_hk[i] = spi_a.write(0x0); + pc.printf("eps Survival hk: %d",eps_survival_hk[i]); + } + cs_eps = 1; + + // flag更新 + seq_flag = 1; + + // eps_survival_hkをフラッシュに保存 + flash_wren(); + addr = 0x0; // Flashメモリのデータを入れる場所指定 + HK_length = 2; // データ長さ(byte) + flash_pp(addr, eps_survival_hk, HK_length); + while(flash_is_wip()){ + } + pc.printf("Flash Write complete! \r\n"); + pc.printf("Write Data check (Read the Written address.)\r\n"); + flash_read(addr, rx_buf, HK_length); + data_debug_print(rx_buf, HK_length); + } + + else if(cmd==3) { + pc.printf("COM ON \r\n"); + EPS_cmd = 3; + cs_eps = 0; + spi_a.write(EPS_cmd); // send command + cs_eps = 1; + } + else if(cmd==4) { // 1Hz HK取得開始 + + // 1Hz getHK 割り込み開始 + IR_getHK.attach(&getHK_eps_IR, 10); // 1HzでgetHK開始(0.1Hzでテスト) + seq_flag = 3; + pc.printf("start 1Hz getHK Interrupt!!\r\n"); + pc.printf("seq_flag: %d\r\n", seq_flag); + } + + else if(cmd==5) { // 1分毎にFlashに保存 開始 + + IR_saveHK.attach(&flash_saveHK_eps_IR, 60); + seq_flag = 4; + pc.printf("start save HK to Flash memory Interrupt!!\r\n"); + pc.printf("seq_flag: %d\r\n", seq_flag); + } + + else if(cmd==6) { + // SP deployment + } + + + else if(cmd==7) { // SD転送割り込みスタート + IR_HKtoSD.attach(&sendHK_from_Flash_to_SD, 180); // 1hで割り込み(今回は120s) + seq_flag = 5; + pc.printf("start send HK from Flash memory to SD!!\r\n"); + pc.printf("seq_flag: %d\r\n", seq_flag); + } + +// else if(cmd==) { +// } + if(cmd == 99) { + // 1Hz getHK 割り込み終了 + IR_getHK.detach(); + IR_saveHK.detach(); + } + } + + +int main() { + uint8_t cmd = 1; + // ***Flashメモリ用ローカル変数・初期化****** + //uint32_t addr = 0x0; // 3byte (or 4byte) + uint16_t length = 0x100; // 例だと1Page=256 + spi_init(); // spi初期設定 + // *************************************** + + // ******割込関数******** + // ********************* + + pc.printf("CDH auto sequence start!!\r\n\r\n"); + + while(cmd<100) { + + pc.printf(">>cmd %d: ", cmd); + auto_sequence(cmd); + + cmd++; + wait(1); + } +}