Daisuke Yanagihara / Mbed 2 deprecated p_cdh_sequencial_20210930

Dependencies:   mbed

Committer:
Yanagihara
Date:
Thu Sep 30 10:03:28 2021 +0000
Revision:
0:1771028c366a
I wrote a whole section on cdh_data flow. Save as milestone

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Yanagihara 0:1771028c366a 1 #include "mbed.h"
Yanagihara 0:1771028c366a 2 // ************ Flashメモリ設定 *************
Yanagihara 0:1771028c366a 3 /*Flashのコマンドを発行*/
Yanagihara 0:1771028c366a 4 #define CMD_RDID 0x9f //
Yanagihara 0:1771028c366a 5 #define CMD_READ 0x03 // Address Read Data
Yanagihara 0:1771028c366a 6 #define CMD_WREN 0x06 // Write Enable
Yanagihara 0:1771028c366a 7 #define CMD_SE 0x20 // Sector Erase
Yanagihara 0:1771028c366a 8 #define CMD_HBE 0x52; // Block Erase
Yanagihara 0:1771028c366a 9 #define CMD_BE 0xD8; // Block Erase
Yanagihara 0:1771028c366a 10 #define CMD_PP 0x02 // Page Programming
Yanagihara 0:1771028c366a 11 #define CMD_RDSR1 0x05 // Read Status Resistor (WIP check)
Yanagihara 0:1771028c366a 12 SPI spi(p5,p6,p7); //mosi,miso,sclk
Yanagihara 0:1771028c366a 13 DigitalOut cs(p8);
Yanagihara 0:1771028c366a 14 // *****************************************
Yanagihara 0:1771028c366a 15
Yanagihara 0:1771028c366a 16 DigitalOut eps_on(p21);
Yanagihara 0:1771028c366a 17
Yanagihara 0:1771028c366a 18 SPI spi_a(p5,p6,p7); //mosi,miso,sclk
Yanagihara 0:1771028c366a 19 DigitalOut cs_eps(p8);
Yanagihara 0:1771028c366a 20 DigitalOut cs_com(p9);
Yanagihara 0:1771028c366a 21
Yanagihara 0:1771028c366a 22 Ticker IR_getHK;
Yanagihara 0:1771028c366a 23 Ticker IR_saveHK;
Yanagihara 0:1771028c366a 24 Ticker IR_HKtoSD;
Yanagihara 0:1771028c366a 25
Yanagihara 0:1771028c366a 26 Serial pc(USBTX,USBRX);
Yanagihara 0:1771028c366a 27
Yanagihara 0:1771028c366a 28 // **** グローバル変数 ******
Yanagihara 0:1771028c366a 29 uint8_t eps_survival_hk[256];
Yanagihara 0:1771028c366a 30 uint8_t eps_HK_IR[256];
Yanagihara 0:1771028c366a 31 uint8_t i_HK_IR=0; // eps_HK_IRのカウンター
Yanagihara 0:1771028c366a 32 uint16_t IRHK_length = 0; // データ長さ(byte)
Yanagihara 0:1771028c366a 33
Yanagihara 0:1771028c366a 34 uint8_t seq_flag = 0;
Yanagihara 0:1771028c366a 35 uint8_t EPS_cmd = 0;
Yanagihara 0:1771028c366a 36 uint16_t HK_length = 0; // HKのデータ数.1Hz割込で使用
Yanagihara 0:1771028c366a 37 // ************************
Yanagihara 0:1771028c366a 38
Yanagihara 0:1771028c366a 39 // **** Flashメモリ用 グローバル変数*****
Yanagihara 0:1771028c366a 40 uint32_t addr = 0x0; // survival_HK用
Yanagihara 0:1771028c366a 41 uint32_t IRHK_addr = 0x000F000; // survival_HK用
Yanagihara 0:1771028c366a 42 uint8_t tx_buf[256]; // 送信バッファ用意
Yanagihara 0:1771028c366a 43 uint8_t rx_buf[256]; // 受信バッファ用意
Yanagihara 0:1771028c366a 44 // ***********************************
Yanagihara 0:1771028c366a 45
Yanagihara 0:1771028c366a 46 // ************ Flashメモリ用関数 *************
Yanagihara 0:1771028c366a 47 void spi_init(){ /*spi通信設定*/
Yanagihara 0:1771028c366a 48 spi.format(8,0);
Yanagihara 0:1771028c366a 49 spi.frequency(1000000); // 1,000,000=1MHz clock rate
Yanagihara 0:1771028c366a 50 cs = 1; //初期化
Yanagihara 0:1771028c366a 51 }
Yanagihara 0:1771028c366a 52
Yanagihara 0:1771028c366a 53 void spi_transfer(const uint8_t* tx_buf, uint8_t* rx_buf, uint16_t length) { // 送受信両方判断し通信実行する関数
Yanagihara 0:1771028c366a 54 //pc.printf("#spi_transfer length= 0x%X\r\n",length);
Yanagihara 0:1771028c366a 55 for(uint16_t i = 0 ; i<length ; i++){
Yanagihara 0:1771028c366a 56 uint8_t data = spi.write(tx_buf != NULL ? tx_buf[i] : 0x0); // txDataが有るならtxDataを送る,無いなら0を送る
Yanagihara 0:1771028c366a 57 if(rx_buf != NULL){ // もし受信データを表示したい場合
Yanagihara 0:1771028c366a 58 rx_buf[i] = data;
Yanagihara 0:1771028c366a 59 }
Yanagihara 0:1771028c366a 60 }
Yanagihara 0:1771028c366a 61 }
Yanagihara 0:1771028c366a 62 void spi_read_data(uint8_t* rx_buf, uint16_t length){ /*受信*/
Yanagihara 0:1771028c366a 63 spi_transfer(NULL, rx_buf, length);
Yanagihara 0:1771028c366a 64 }
Yanagihara 0:1771028c366a 65 void spi_write_data(const uint8_t* tx_buf, uint16_t length){ /*受信*/
Yanagihara 0:1771028c366a 66 spi_transfer(tx_buf, NULL, length);
Yanagihara 0:1771028c366a 67 }
Yanagihara 0:1771028c366a 68
Yanagihara 0:1771028c366a 69 /*Flash関数*/
Yanagihara 0:1771028c366a 70 void flash_send_addr(uint32_t addr) {
Yanagihara 0:1771028c366a 71 const uint8_t data[] = {
Yanagihara 0:1771028c366a 72 (addr >> 16) & 0xff, // 1のところだけ残す
Yanagihara 0:1771028c366a 73 (addr >> 8) & 0xff,
Yanagihara 0:1771028c366a 74 (addr >> 0) & 0xff,
Yanagihara 0:1771028c366a 75 };
Yanagihara 0:1771028c366a 76 for(int i=0; i<3; i++){ // addr : 3byte
Yanagihara 0:1771028c366a 77 spi.write(data[i]);
Yanagihara 0:1771028c366a 78 }
Yanagihara 0:1771028c366a 79 }
Yanagihara 0:1771028c366a 80
Yanagihara 0:1771028c366a 81 void flash_rdid(uint8_t* rx_buf, uint16_t length){ /*RDID読み出し*/
Yanagihara 0:1771028c366a 82 cs = 0;
Yanagihara 0:1771028c366a 83 spi.write(CMD_RDID);
Yanagihara 0:1771028c366a 84 spi_read_data(rx_buf, length);
Yanagihara 0:1771028c366a 85 cs = 1;
Yanagihara 0:1771028c366a 86 }
Yanagihara 0:1771028c366a 87
Yanagihara 0:1771028c366a 88 void flash_read(uint32_t addr, uint8_t* rx_buf, uint16_t length) { /*読み出し*/
Yanagihara 0:1771028c366a 89 cs = 0;
Yanagihara 0:1771028c366a 90 spi.write(CMD_READ);
Yanagihara 0:1771028c366a 91 flash_send_addr(addr);
Yanagihara 0:1771028c366a 92 spi_read_data(rx_buf, length);
Yanagihara 0:1771028c366a 93 cs = 1;
Yanagihara 0:1771028c366a 94 }
Yanagihara 0:1771028c366a 95
Yanagihara 0:1771028c366a 96 void flash_wren(){ // write enable
Yanagihara 0:1771028c366a 97 cs = 0;
Yanagihara 0:1771028c366a 98 spi.write(CMD_WREN);
Yanagihara 0:1771028c366a 99 cs = 1;
Yanagihara 0:1771028c366a 100 }
Yanagihara 0:1771028c366a 101
Yanagihara 0:1771028c366a 102 void flash_se(uint32_t addr) { // sector erase
Yanagihara 0:1771028c366a 103 cs = 0;
Yanagihara 0:1771028c366a 104 spi.write(CMD_SE);
Yanagihara 0:1771028c366a 105 flash_send_addr(addr);
Yanagihara 0:1771028c366a 106 cs = 1;
Yanagihara 0:1771028c366a 107 }
Yanagihara 0:1771028c366a 108
Yanagihara 0:1771028c366a 109 void flash_pp(uint32_t addr, const uint8_t* wr_data, uint16_t length) { // Page Program
Yanagihara 0:1771028c366a 110 cs = 0;
Yanagihara 0:1771028c366a 111 spi.write(CMD_PP);
Yanagihara 0:1771028c366a 112 flash_send_addr(addr);
Yanagihara 0:1771028c366a 113 spi_write_data(wr_data, length);
Yanagihara 0:1771028c366a 114 cs = 1;
Yanagihara 0:1771028c366a 115 }
Yanagihara 0:1771028c366a 116
Yanagihara 0:1771028c366a 117 void flash_rdsr(uint8_t* rx_buf, uint16_t length) {
Yanagihara 0:1771028c366a 118 cs = 0;
Yanagihara 0:1771028c366a 119 spi.write(CMD_RDSR1);
Yanagihara 0:1771028c366a 120 spi_read_data(rx_buf, length); // rx_bufにRDSRの値が入っている
Yanagihara 0:1771028c366a 121 cs = 1;
Yanagihara 0:1771028c366a 122 }
Yanagihara 0:1771028c366a 123
Yanagihara 0:1771028c366a 124 uint8_t flash_is_wip() { // (WIP)Write In Progress(書込み中)かどうか確認
Yanagihara 0:1771028c366a 125 uint8_t data;
Yanagihara 0:1771028c366a 126 flash_rdsr(&data, 0x01); // 1byte(StatusRegister情報)
Yanagihara 0:1771028c366a 127 return(data & 0x01); //WIP // ビット演算_&
Yanagihara 0:1771028c366a 128 }
Yanagihara 0:1771028c366a 129
Yanagihara 0:1771028c366a 130
Yanagihara 0:1771028c366a 131 void data_debug_print(const uint8_t* data, uint16_t bytes){ //配列を表示
Yanagihara 0:1771028c366a 132 pc.printf("+0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F\r\n");
Yanagihara 0:1771028c366a 133 pc.printf("-----------------------------------------------\r\n");
Yanagihara 0:1771028c366a 134 uint16_t depth = ((bytes - 1) >> 4) + 1;
Yanagihara 0:1771028c366a 135 for(uint16_t j = 0 ; j < depth ; ++j){ //depthは何?
Yanagihara 0:1771028c366a 136 for(uint16_t i = 0 ; i < 16 ; ++i){
Yanagihara 0:1771028c366a 137 uint8_t d = data[i + (j << 4)];
Yanagihara 0:1771028c366a 138 pc.printf("%X", (d >> 4) & 0x0f);
Yanagihara 0:1771028c366a 139 pc.printf("%X", (d >> 0) & 0x0f);
Yanagihara 0:1771028c366a 140 pc.printf(" ");
Yanagihara 0:1771028c366a 141 }
Yanagihara 0:1771028c366a 142 pc.printf("\r\n");
Yanagihara 0:1771028c366a 143 }
Yanagihara 0:1771028c366a 144 pc.printf("\r\n");
Yanagihara 0:1771028c366a 145 }
Yanagihara 0:1771028c366a 146 // ******************************************Flashメモリ用関数ここまで
Yanagihara 0:1771028c366a 147
Yanagihara 0:1771028c366a 148 // ************* 割り込み関数 ***************
Yanagihara 0:1771028c366a 149 void getHK_eps_IR() { // 1Hz getHK 割り込み関数
Yanagihara 0:1771028c366a 150 pc.printf("get EPS 1Hz HK\r\n");
Yanagihara 0:1771028c366a 151 EPS_cmd = 2;
Yanagihara 0:1771028c366a 152
Yanagihara 0:1771028c366a 153 cs_eps = 0;
Yanagihara 0:1771028c366a 154 //pc.printf("send cmd to eps\r\n");
Yanagihara 0:1771028c366a 155 spi_a.write(EPS_cmd); // send command
Yanagihara 0:1771028c366a 156
Yanagihara 0:1771028c366a 157 HK_length = 4; // 1回で取得するHKデータのbyte数
Yanagihara 0:1771028c366a 158 for(uint8_t i=0; i < HK_length; i++) { // get data
Yanagihara 0:1771028c366a 159 eps_HK_IR[i_HK_IR] = spi_a.write(0x0);
Yanagihara 0:1771028c366a 160 pc.printf("get eps 1Hz hk: %d\r\n",eps_HK_IR[i_HK_IR]);
Yanagihara 0:1771028c366a 161 i_HK_IR++;
Yanagihara 0:1771028c366a 162 }
Yanagihara 0:1771028c366a 163 cs_eps = 1;
Yanagihara 0:1771028c366a 164 }
Yanagihara 0:1771028c366a 165
Yanagihara 0:1771028c366a 166 void flash_saveHK_eps_IR() { // 1分毎にFlashにIRHKを保存
Yanagihara 0:1771028c366a 167
Yanagihara 0:1771028c366a 168 // eps_HK_IR[]をフラッシュに保存
Yanagihara 0:1771028c366a 169 flash_wren(); // 書込み・消去の前に必ず必要
Yanagihara 0:1771028c366a 170 IRHK_length = 4*60; // データ長さ(byte)//
Yanagihara 0:1771028c366a 171 flash_pp(IRHK_addr, eps_HK_IR, IRHK_length);
Yanagihara 0:1771028c366a 172 while(flash_is_wip()){
Yanagihara 0:1771028c366a 173 }
Yanagihara 0:1771028c366a 174 pc.printf("Flash Write complete! \r\n");
Yanagihara 0:1771028c366a 175 pc.printf("Write Data check (Read the Written address.)\r\n");
Yanagihara 0:1771028c366a 176 flash_read(IRHK_addr, rx_buf, IRHK_length);
Yanagihara 0:1771028c366a 177 data_debug_print(rx_buf, IRHK_length);
Yanagihara 0:1771028c366a 178 IRHK_addr += IRHK_length;
Yanagihara 0:1771028c366a 179 }
Yanagihara 0:1771028c366a 180
Yanagihara 0:1771028c366a 181 void sendHK_from_Flash_to_SD() {
Yanagihara 0:1771028c366a 182 // Flashから読み出し(IRHK_addr-180*4)
Yanagihara 0:1771028c366a 183 pc.printf("send to sd\r\n");
Yanagihara 0:1771028c366a 184 flash_read(IRHK_addr-(IRHK_length*3), rx_buf, IRHK_length*3);
Yanagihara 0:1771028c366a 185 data_debug_print(rx_buf, IRHK_length*3);
Yanagihara 0:1771028c366a 186
Yanagihara 0:1771028c366a 187 // send to com
Yanagihara 0:1771028c366a 188 cs_com = 0;
Yanagihara 0:1771028c366a 189 spi.write(0x10);
Yanagihara 0:1771028c366a 190 cs_com = 1;
Yanagihara 0:1771028c366a 191
Yanagihara 0:1771028c366a 192 wait(1);
Yanagihara 0:1771028c366a 193
Yanagihara 0:1771028c366a 194 uint8_t rep;
Yanagihara 0:1771028c366a 195 for(uint8_t i=0; i<IRHK_length*3; i++) { // get data
Yanagihara 0:1771028c366a 196 cs_com = 0;
Yanagihara 0:1771028c366a 197 spi.write(rx_buf[i]); // 1byte HK 送る
Yanagihara 0:1771028c366a 198 while(rep!=0x01){ // ビジー確認.rep=1になるまで,永遠にダミーデータを送る
Yanagihara 0:1771028c366a 199 rep = spi.write(0x0);
Yanagihara 0:1771028c366a 200 }
Yanagihara 0:1771028c366a 201 cs_com = 1;
Yanagihara 0:1771028c366a 202 }
Yanagihara 0:1771028c366a 203
Yanagihara 0:1771028c366a 204 // Flash転送終了コマンド
Yanagihara 0:1771028c366a 205 spi.write(0xFF);
Yanagihara 0:1771028c366a 206
Yanagihara 0:1771028c366a 207 }
Yanagihara 0:1771028c366a 208 // *****************************************割り込み関数定義終了
Yanagihara 0:1771028c366a 209 void auto_sequence(uint8_t cmd) {
Yanagihara 0:1771028c366a 210
Yanagihara 0:1771028c366a 211 if(cmd==1) {
Yanagihara 0:1771028c366a 212 pc.printf("EPS ON \r\n");
Yanagihara 0:1771028c366a 213 eps_on = 1;
Yanagihara 0:1771028c366a 214 wait(0.5);
Yanagihara 0:1771028c366a 215 eps_on = 0;
Yanagihara 0:1771028c366a 216 }
Yanagihara 0:1771028c366a 217 else if(cmd==2) { // eps Survival Check
Yanagihara 0:1771028c366a 218 EPS_cmd = 1;
Yanagihara 0:1771028c366a 219
Yanagihara 0:1771028c366a 220 pc.printf("get eps Survival hk\r\n");
Yanagihara 0:1771028c366a 221 cs_eps = 0;
Yanagihara 0:1771028c366a 222 spi_a.write(EPS_cmd); // send command
Yanagihara 0:1771028c366a 223 //pc.printf("send cmd to eps\r\n");
Yanagihara 0:1771028c366a 224 cs_eps = 1;
Yanagihara 0:1771028c366a 225 wait(1); // epsのHK取得待ち時間(仮)
Yanagihara 0:1771028c366a 226
Yanagihara 0:1771028c366a 227 cs_eps = 0;
Yanagihara 0:1771028c366a 228 for(uint8_t i=0; i<2; i++) { // get data
Yanagihara 0:1771028c366a 229 eps_survival_hk[i] = spi_a.write(0x0);
Yanagihara 0:1771028c366a 230 pc.printf("eps Survival hk: %d",eps_survival_hk[i]);
Yanagihara 0:1771028c366a 231 }
Yanagihara 0:1771028c366a 232 cs_eps = 1;
Yanagihara 0:1771028c366a 233
Yanagihara 0:1771028c366a 234 // flag更新
Yanagihara 0:1771028c366a 235 seq_flag = 1;
Yanagihara 0:1771028c366a 236
Yanagihara 0:1771028c366a 237 // eps_survival_hkをフラッシュに保存
Yanagihara 0:1771028c366a 238 flash_wren();
Yanagihara 0:1771028c366a 239 addr = 0x0; // Flashメモリのデータを入れる場所指定
Yanagihara 0:1771028c366a 240 HK_length = 2; // データ長さ(byte)
Yanagihara 0:1771028c366a 241 flash_pp(addr, eps_survival_hk, HK_length);
Yanagihara 0:1771028c366a 242 while(flash_is_wip()){
Yanagihara 0:1771028c366a 243 }
Yanagihara 0:1771028c366a 244 pc.printf("Flash Write complete! \r\n");
Yanagihara 0:1771028c366a 245 pc.printf("Write Data check (Read the Written address.)\r\n");
Yanagihara 0:1771028c366a 246 flash_read(addr, rx_buf, HK_length);
Yanagihara 0:1771028c366a 247 data_debug_print(rx_buf, HK_length);
Yanagihara 0:1771028c366a 248 }
Yanagihara 0:1771028c366a 249
Yanagihara 0:1771028c366a 250 else if(cmd==3) {
Yanagihara 0:1771028c366a 251 pc.printf("COM ON \r\n");
Yanagihara 0:1771028c366a 252 EPS_cmd = 3;
Yanagihara 0:1771028c366a 253 cs_eps = 0;
Yanagihara 0:1771028c366a 254 spi_a.write(EPS_cmd); // send command
Yanagihara 0:1771028c366a 255 cs_eps = 1;
Yanagihara 0:1771028c366a 256 }
Yanagihara 0:1771028c366a 257 else if(cmd==4) { // 1Hz HK取得開始
Yanagihara 0:1771028c366a 258
Yanagihara 0:1771028c366a 259 // 1Hz getHK 割り込み開始
Yanagihara 0:1771028c366a 260 IR_getHK.attach(&getHK_eps_IR, 10); // 1HzでgetHK開始(0.1Hzでテスト)
Yanagihara 0:1771028c366a 261 seq_flag = 3;
Yanagihara 0:1771028c366a 262 pc.printf("start 1Hz getHK Interrupt!!\r\n");
Yanagihara 0:1771028c366a 263 pc.printf("seq_flag: %d\r\n", seq_flag);
Yanagihara 0:1771028c366a 264 }
Yanagihara 0:1771028c366a 265
Yanagihara 0:1771028c366a 266 else if(cmd==5) { // 1分毎にFlashに保存 開始
Yanagihara 0:1771028c366a 267
Yanagihara 0:1771028c366a 268 IR_saveHK.attach(&flash_saveHK_eps_IR, 60);
Yanagihara 0:1771028c366a 269 seq_flag = 4;
Yanagihara 0:1771028c366a 270 pc.printf("start save HK to Flash memory Interrupt!!\r\n");
Yanagihara 0:1771028c366a 271 pc.printf("seq_flag: %d\r\n", seq_flag);
Yanagihara 0:1771028c366a 272 }
Yanagihara 0:1771028c366a 273
Yanagihara 0:1771028c366a 274 else if(cmd==6) {
Yanagihara 0:1771028c366a 275 // SP deployment
Yanagihara 0:1771028c366a 276 }
Yanagihara 0:1771028c366a 277
Yanagihara 0:1771028c366a 278
Yanagihara 0:1771028c366a 279 else if(cmd==7) { // SD転送割り込みスタート
Yanagihara 0:1771028c366a 280 IR_HKtoSD.attach(&sendHK_from_Flash_to_SD, 180); // 1hで割り込み(今回は120s)
Yanagihara 0:1771028c366a 281 seq_flag = 5;
Yanagihara 0:1771028c366a 282 pc.printf("start send HK from Flash memory to SD!!\r\n");
Yanagihara 0:1771028c366a 283 pc.printf("seq_flag: %d\r\n", seq_flag);
Yanagihara 0:1771028c366a 284 }
Yanagihara 0:1771028c366a 285
Yanagihara 0:1771028c366a 286 // else if(cmd==) {
Yanagihara 0:1771028c366a 287 // }
Yanagihara 0:1771028c366a 288 if(cmd == 99) {
Yanagihara 0:1771028c366a 289 // 1Hz getHK 割り込み終了
Yanagihara 0:1771028c366a 290 IR_getHK.detach();
Yanagihara 0:1771028c366a 291 IR_saveHK.detach();
Yanagihara 0:1771028c366a 292 }
Yanagihara 0:1771028c366a 293 }
Yanagihara 0:1771028c366a 294
Yanagihara 0:1771028c366a 295
Yanagihara 0:1771028c366a 296 int main() {
Yanagihara 0:1771028c366a 297 uint8_t cmd = 1;
Yanagihara 0:1771028c366a 298 // ***Flashメモリ用ローカル変数・初期化******
Yanagihara 0:1771028c366a 299 //uint32_t addr = 0x0; // 3byte (or 4byte)
Yanagihara 0:1771028c366a 300 uint16_t length = 0x100; // 例だと1Page=256
Yanagihara 0:1771028c366a 301 spi_init(); // spi初期設定
Yanagihara 0:1771028c366a 302 // ***************************************
Yanagihara 0:1771028c366a 303
Yanagihara 0:1771028c366a 304 // ******割込関数********
Yanagihara 0:1771028c366a 305 // *********************
Yanagihara 0:1771028c366a 306
Yanagihara 0:1771028c366a 307 pc.printf("CDH auto sequence start!!\r\n\r\n");
Yanagihara 0:1771028c366a 308
Yanagihara 0:1771028c366a 309 while(cmd<100) {
Yanagihara 0:1771028c366a 310
Yanagihara 0:1771028c366a 311 pc.printf(">>cmd %d: ", cmd);
Yanagihara 0:1771028c366a 312 auto_sequence(cmd);
Yanagihara 0:1771028c366a 313
Yanagihara 0:1771028c366a 314 cmd++;
Yanagihara 0:1771028c366a 315 wait(1);
Yanagihara 0:1771028c366a 316 }
Yanagihara 0:1771028c366a 317 }