1MB version

Dependencies:   mbed EEPROM USBDevice

Committer:
muraguchi
Date:
Wed Feb 10 03:45:12 2021 +0000
Revision:
3:28ceea26c918
Parent:
0:1472308ded03
Comment

Who changed what in which revision?

UserRevisionLine numberNew contents of line
muraguchi 0:1472308ded03 1 #include "RawNAND.h"
muraguchi 0:1472308ded03 2
muraguchi 3:28ceea26c918 3 // TODO: Replace wait_us(int) to wait_ns
muraguchi 0:1472308ded03 4
muraguchi 0:1472308ded03 5 RawNAND::RawNAND(PinName ceb, PinName cle,
muraguchi 0:1472308ded03 6 PinName ale, PinName web,
muraguchi 0:1472308ded03 7 PinName reb, PinName wpb,
muraguchi 0:1472308ded03 8 PinName rbb,
muraguchi 0:1472308ded03 9 PinName io1, PinName io2,
muraguchi 0:1472308ded03 10 PinName io3, PinName io4,
muraguchi 0:1472308ded03 11 PinName io5, PinName io6,
muraguchi 0:1472308ded03 12 PinName io7, PinName io8)
muraguchi 0:1472308ded03 13 : _ceb(ceb,1),_cle(cle,1),
muraguchi 0:1472308ded03 14 _ale(ale,1),_web(web,1),
muraguchi 0:1472308ded03 15 _reb(reb,1),_wpb(wpb,1),
muraguchi 0:1472308ded03 16 _rbb(rbb,PullNone),
muraguchi 0:1472308ded03 17 _io(io1,io2,io3,io4,io5,io6,io7,io8) {
muraguchi 0:1472308ded03 18 _io.mode(PullNone);
muraguchi 0:1472308ded03 19 _io.input();
muraguchi 0:1472308ded03 20
muraguchi 0:1472308ded03 21 }
muraguchi 0:1472308ded03 22 void RawNAND::reset() {
muraguchi 0:1472308ded03 23 // wait ready
muraguchi 0:1472308ded03 24 while(_rbb==0){
muraguchi 0:1472308ded03 25 __NOP();
muraguchi 0:1472308ded03 26 }
muraguchi 0:1472308ded03 27 // RESET COMMAND (0xff)
muraguchi 0:1472308ded03 28 _ceb = 0;
muraguchi 0:1472308ded03 29 _cle = 1;
muraguchi 0:1472308ded03 30 _ale = 0;
muraguchi 0:1472308ded03 31 _web = 0;
muraguchi 0:1472308ded03 32 _io=0xff;
muraguchi 0:1472308ded03 33 _io.output();
muraguchi 0:1472308ded03 34 // wait setup time : max(tCS,tCLS,tALS,tDS,tWP)
muraguchi 0:1472308ded03 35 wait_us(tCS_US);
muraguchi 0:1472308ded03 36 _web = 1;
muraguchi 0:1472308ded03 37 // wait hold time : max(tCLH,tALH,tDH,tWH,tWB,tCH)
muraguchi 0:1472308ded03 38 wait_us(tWB_US);
muraguchi 0:1472308ded03 39 // check tRBB;
muraguchi 0:1472308ded03 40 while (_rbb==0){
muraguchi 0:1472308ded03 41 __NOP();
muraguchi 0:1472308ded03 42 }
muraguchi 0:1472308ded03 43 _ceb = 1;
muraguchi 0:1472308ded03 44 }
muraguchi 0:1472308ded03 45 void RawNAND::idRead(uint8_t * readData) {
muraguchi 0:1472308ded03 46 // ID READ COMMAND (0x90)
muraguchi 0:1472308ded03 47 _ceb = 0;
muraguchi 0:1472308ded03 48 _cle = 1;
muraguchi 0:1472308ded03 49 _ale = 0;
muraguchi 0:1472308ded03 50 _web = 0;
muraguchi 0:1472308ded03 51 _io=0x90;
muraguchi 0:1472308ded03 52 _io.output();
muraguchi 0:1472308ded03 53 // wait setup time : max(tCS,tCLS,tALS,tDS,tWP)
muraguchi 0:1472308ded03 54 wait_us(tCS_US);
muraguchi 0:1472308ded03 55 _web = 1;
muraguchi 0:1472308ded03 56 // wait hold time : max(tCLH,tALH,tDH,tWH)
muraguchi 0:1472308ded03 57 wait_us(tWH_US);
muraguchi 0:1472308ded03 58
muraguchi 0:1472308ded03 59 // IO READ ADDRESS (0x00)
muraguchi 0:1472308ded03 60 _cle=0;
muraguchi 0:1472308ded03 61 _ale=1;
muraguchi 0:1472308ded03 62 _web=0;
muraguchi 0:1472308ded03 63 _io=0x00;
muraguchi 0:1472308ded03 64 // wait setup time : max(tCLS,tALS,tDS,tWP)
muraguchi 0:1472308ded03 65 wait_us(tCLS_US);
muraguchi 0:1472308ded03 66 _web=1;
muraguchi 0:1472308ded03 67 // wait hold time : max(tCLH,tALH,tDH,tWH)
muraguchi 0:1472308ded03 68 wait_us(tWH_US);
muraguchi 0:1472308ded03 69
muraguchi 0:1472308ded03 70 // ALE low and IO input
muraguchi 0:1472308ded03 71 _ale=0;
muraguchi 0:1472308ded03 72 _io.input();
muraguchi 0:1472308ded03 73 // ALE low to tREB low : tAR
muraguchi 0:1472308ded03 74 wait_us(tAR_US);
muraguchi 0:1472308ded03 75
muraguchi 0:1472308ded03 76 // IO READ read data
muraguchi 0:1472308ded03 77 for (int l=0;l<5;l++) {
muraguchi 0:1472308ded03 78 _reb = 0;
muraguchi 0:1472308ded03 79 // wait max(tREA,tRP)
muraguchi 0:1472308ded03 80 wait_us(tREA_US);
muraguchi 0:1472308ded03 81 *(readData+l)=_io;
muraguchi 0:1472308ded03 82 _reb = 1;
muraguchi 0:1472308ded03 83 // wait tREH
muraguchi 0:1472308ded03 84 wait_us(tREH_US);
muraguchi 0:1472308ded03 85 }
muraguchi 0:1472308ded03 86 // wait io hiz
muraguchi 0:1472308ded03 87 _ceb = 1;
muraguchi 0:1472308ded03 88 wait_us(tCHZ_US);
muraguchi 0:1472308ded03 89 }
muraguchi 0:1472308ded03 90 uint8_t RawNAND::statusRead() {
muraguchi 0:1472308ded03 91 uint8_t status;
muraguchi 0:1472308ded03 92 // wait ready
muraguchi 0:1472308ded03 93 while(_rbb==0){
muraguchi 0:1472308ded03 94 __NOP();
muraguchi 0:1472308ded03 95 }
muraguchi 0:1472308ded03 96
muraguchi 0:1472308ded03 97 // STATUS READ COMMAND (0x70)
muraguchi 0:1472308ded03 98 _ceb = 0;
muraguchi 0:1472308ded03 99 _cle = 1;
muraguchi 0:1472308ded03 100 _ale = 0;
muraguchi 0:1472308ded03 101 _web = 0;
muraguchi 0:1472308ded03 102 _io=0x70;
muraguchi 0:1472308ded03 103 _io.output();
muraguchi 0:1472308ded03 104 // wait setup time : max(tCS,tCLS,tALS,tDS,tWP)
muraguchi 0:1472308ded03 105 wait_us(tCS_US);
muraguchi 0:1472308ded03 106 _web = 1;
muraguchi 0:1472308ded03 107 // wait hold time : max(tCLH,tDH,tWH)
muraguchi 0:1472308ded03 108 wait_us(tWH_US);
muraguchi 0:1472308ded03 109 _cle = 0;
muraguchi 0:1472308ded03 110 _io.input();
muraguchi 0:1472308ded03 111 // wait max(tWHR-tWH,tCLR-tWH)
muraguchi 0:1472308ded03 112 wait_us(tWHR_US-tWH_US);
muraguchi 0:1472308ded03 113 _reb = 0;
muraguchi 0:1472308ded03 114 // wait max(tREA,tRP)
muraguchi 0:1472308ded03 115 wait_us(tREA_US);
muraguchi 0:1472308ded03 116 status = _io;
muraguchi 0:1472308ded03 117 _reb = 1;
muraguchi 0:1472308ded03 118 // wait tREH
muraguchi 0:1472308ded03 119 wait_us(tREH_US);
muraguchi 0:1472308ded03 120 _ceb = 1;
muraguchi 0:1472308ded03 121 wait_us(tCHZ_US);
muraguchi 0:1472308ded03 122 // wait io hiz
muraguchi 0:1472308ded03 123 return status;
muraguchi 0:1472308ded03 124 }
muraguchi 0:1472308ded03 125
muraguchi 0:1472308ded03 126 void RawNAND::setWriteProtect(uint8_t writeProtect){
muraguchi 0:1472308ded03 127 _wpb = writeProtect;
muraguchi 0:1472308ded03 128 // wait tWW
muraguchi 0:1472308ded03 129 wait_us(tWW_US);
muraguchi 0:1472308ded03 130 }
muraguchi 0:1472308ded03 131
muraguchi 0:1472308ded03 132 void RawNAND::pageRead(uint8_t * readData,uint16_t blockAddress,uint8_t pageAddress,uint16_t columnAddress,uint16_t beats){
muraguchi 0:1472308ded03 133 // wait ready
muraguchi 0:1472308ded03 134 while(_rbb==0){
muraguchi 0:1472308ded03 135 __NOP();
muraguchi 0:1472308ded03 136 }
muraguchi 0:1472308ded03 137
muraguchi 0:1472308ded03 138 // 1ST READ COMMAND (0x00)
muraguchi 0:1472308ded03 139 _ceb = 0;
muraguchi 0:1472308ded03 140 _cle = 1;
muraguchi 0:1472308ded03 141 _ale = 0;
muraguchi 0:1472308ded03 142 _web = 0;
muraguchi 0:1472308ded03 143 _io=0x00;
muraguchi 0:1472308ded03 144 _io.output();
muraguchi 0:1472308ded03 145 // wait setup time : max(tCS,tCLS,tALS,tDS,tWP)
muraguchi 0:1472308ded03 146 wait_us(tCS_US);
muraguchi 0:1472308ded03 147
muraguchi 0:1472308ded03 148 _web = 1;
muraguchi 0:1472308ded03 149 // wait hold time : max(tCLH,tDH,tWH)
muraguchi 0:1472308ded03 150 wait_us(tWH_US);
muraguchi 0:1472308ded03 151
muraguchi 0:1472308ded03 152 // 1st address column [7:0]
muraguchi 0:1472308ded03 153 _cle = 0;
muraguchi 0:1472308ded03 154 _ale = 1;
muraguchi 0:1472308ded03 155 _web = 0;
muraguchi 0:1472308ded03 156 _io = columnAddress & 0xff;
muraguchi 0:1472308ded03 157 // wait setup time : max(tALS,tCLS,tDS,tWP)
muraguchi 0:1472308ded03 158 wait_us(tWP_US);
muraguchi 0:1472308ded03 159
muraguchi 0:1472308ded03 160 _web = 1;
muraguchi 0:1472308ded03 161 // wait hold time : max(tCLH,tDH,tWH)
muraguchi 0:1472308ded03 162 wait_us(tWH_US);
muraguchi 0:1472308ded03 163
muraguchi 0:1472308ded03 164 // 2nd address column [11:8]
muraguchi 0:1472308ded03 165 _web = 0;
muraguchi 0:1472308ded03 166 _io = (columnAddress>>8) & 0x0f;
muraguchi 0:1472308ded03 167 // wait setup time : max(tALS,tCLS,tDS,tWP)
muraguchi 0:1472308ded03 168 wait_us(tWP_US);
muraguchi 0:1472308ded03 169
muraguchi 0:1472308ded03 170 _web = 1;
muraguchi 0:1472308ded03 171 // wait hold time : max(tCLH,tDH,tWH)
muraguchi 0:1472308ded03 172 wait_us(tWH_US);
muraguchi 0:1472308ded03 173
muraguchi 0:1472308ded03 174 // 3rd address {blockAddress[1:0],pageAddress[5:0]}
muraguchi 0:1472308ded03 175 _web = 0;
muraguchi 0:1472308ded03 176 _io = ((blockAddress<<6) | pageAddress) ;
muraguchi 0:1472308ded03 177 // wait setup time : max(tALS,tDS,tWP)
muraguchi 0:1472308ded03 178 wait_us(tWP_US);
muraguchi 0:1472308ded03 179
muraguchi 0:1472308ded03 180 _web = 1;
muraguchi 0:1472308ded03 181 // wait hold time : max(tALH,tDH,tWH)
muraguchi 0:1472308ded03 182 wait_us(tWH_US);
muraguchi 0:1472308ded03 183
muraguchi 0:1472308ded03 184 // 4th address blockAddress[9:2]
muraguchi 0:1472308ded03 185 _web = 0;
muraguchi 0:1472308ded03 186 _io = (blockAddress>>2) ;
muraguchi 0:1472308ded03 187 // wait setup time : max(tALS,tDS,tWP)
muraguchi 0:1472308ded03 188 wait_us(tWP_US);
muraguchi 0:1472308ded03 189
muraguchi 0:1472308ded03 190 _web = 1;
muraguchi 0:1472308ded03 191 // wait hold time : max(tALH,tDH,tWH)
muraguchi 0:1472308ded03 192 wait_us(tWH_US);
muraguchi 0:1472308ded03 193
muraguchi 0:1472308ded03 194 // 2ND READ COMMAND (0x30)
muraguchi 0:1472308ded03 195 _cle = 1;
muraguchi 0:1472308ded03 196 _ale = 0;
muraguchi 0:1472308ded03 197 _web = 0;
muraguchi 0:1472308ded03 198 _io = 0x30;
muraguchi 0:1472308ded03 199 // wait setup time : max(tALS,tCLS,tDS,tWP)
muraguchi 0:1472308ded03 200 wait_us(tWP_US);
muraguchi 0:1472308ded03 201
muraguchi 0:1472308ded03 202 _web = 1;
muraguchi 0:1472308ded03 203 // wait hold time : max(tALH,tDH,tWH,tWB)
muraguchi 0:1472308ded03 204 wait_us(tWB_US);
muraguchi 0:1472308ded03 205
muraguchi 0:1472308ded03 206 _cle = 0;
muraguchi 0:1472308ded03 207 _io.input();
muraguchi 0:1472308ded03 208
muraguchi 0:1472308ded03 209 // wait ready
muraguchi 0:1472308ded03 210 while(_rbb==0){
muraguchi 0:1472308ded03 211 __NOP();
muraguchi 0:1472308ded03 212 }
muraguchi 0:1472308ded03 213
muraguchi 0:1472308ded03 214 // wait tRR ( RBB to REB Low )
muraguchi 0:1472308ded03 215 wait_us(tRR_US);
muraguchi 0:1472308ded03 216
muraguchi 0:1472308ded03 217 // read sequence
muraguchi 0:1472308ded03 218 for (int b=0;b<beats;b++){
muraguchi 0:1472308ded03 219 _reb = 0;
muraguchi 0:1472308ded03 220 // wait max(tREA,tRP)
muraguchi 0:1472308ded03 221 wait_us(tREA_US);
muraguchi 0:1472308ded03 222 *(readData + b)= _io;
muraguchi 0:1472308ded03 223 _reb = 1;
muraguchi 0:1472308ded03 224 // wait tREH
muraguchi 0:1472308ded03 225 wait_us(tREH_US);
muraguchi 0:1472308ded03 226 }
muraguchi 0:1472308ded03 227
muraguchi 0:1472308ded03 228 _ceb = 1;
muraguchi 0:1472308ded03 229 // wait io hiz
muraguchi 0:1472308ded03 230 wait_us(tCHZ_US);
muraguchi 0:1472308ded03 231
muraguchi 0:1472308ded03 232 }
muraguchi 0:1472308ded03 233
muraguchi 0:1472308ded03 234
muraguchi 0:1472308ded03 235 uint8_t RawNAND::erase(uint16_t blockAddress){
muraguchi 0:1472308ded03 236 // wait ready
muraguchi 0:1472308ded03 237 while(_rbb==0){
muraguchi 0:1472308ded03 238 __NOP();
muraguchi 0:1472308ded03 239 }
muraguchi 0:1472308ded03 240
muraguchi 3:28ceea26c918 241 // 1ST ERASE COMMAND (0x60)
muraguchi 0:1472308ded03 242 _ceb = 0;
muraguchi 0:1472308ded03 243 _cle = 1;
muraguchi 0:1472308ded03 244 _ale = 0;
muraguchi 0:1472308ded03 245 _web = 0;
muraguchi 0:1472308ded03 246 _io=0x60;
muraguchi 0:1472308ded03 247 _io.output();
muraguchi 0:1472308ded03 248 // wait setup time : max(tCS,tCLS,tALS,tDS,tWP)
muraguchi 0:1472308ded03 249 wait_us(tCS_US);
muraguchi 0:1472308ded03 250
muraguchi 0:1472308ded03 251 _web = 1;
muraguchi 0:1472308ded03 252 // wait hold time : max(tCLH,tDH,tWH)
muraguchi 0:1472308ded03 253 wait_us(tWH_US);
muraguchi 0:1472308ded03 254
muraguchi 0:1472308ded03 255
muraguchi 0:1472308ded03 256 // 1st page address {blockAddress[1:0],pageAddress[5:0]}
muraguchi 0:1472308ded03 257 _cle = 0;
muraguchi 0:1472308ded03 258 _ale = 1;
muraguchi 0:1472308ded03 259 _web = 0;
muraguchi 0:1472308ded03 260 _io = (blockAddress<<6) ;
muraguchi 0:1472308ded03 261 // wait setup time : max(tALS,tDS,tWP)
muraguchi 0:1472308ded03 262 wait_us(tWP_US);
muraguchi 0:1472308ded03 263
muraguchi 0:1472308ded03 264 _web = 1;
muraguchi 0:1472308ded03 265 // wait hold time : max(tALH,tDH,tWH)
muraguchi 0:1472308ded03 266 wait_us(tWH_US);
muraguchi 0:1472308ded03 267
muraguchi 0:1472308ded03 268 // 2nd page address blockAddress[9:2]
muraguchi 0:1472308ded03 269 _web = 0;
muraguchi 0:1472308ded03 270 _io = (blockAddress>>2) ;
muraguchi 0:1472308ded03 271 // wait setup time : max(tALS,tDS,tWP)
muraguchi 0:1472308ded03 272 wait_us(tWP_US);
muraguchi 0:1472308ded03 273
muraguchi 0:1472308ded03 274 _web = 1;
muraguchi 0:1472308ded03 275 // wait hold time : max(tALH,tDH,tWH)
muraguchi 0:1472308ded03 276 wait_us(tWH_US);
muraguchi 0:1472308ded03 277
muraguchi 3:28ceea26c918 278 // 2ND ERASE COMMAND (0xD0)
muraguchi 0:1472308ded03 279 _cle = 1;
muraguchi 0:1472308ded03 280 _ale = 0;
muraguchi 0:1472308ded03 281 _web = 0;
muraguchi 0:1472308ded03 282 _io = 0xD0;
muraguchi 0:1472308ded03 283 // wait setup time : max(tALS,tCLS,tDS,tWP)
muraguchi 0:1472308ded03 284 wait_us(tWP_US);
muraguchi 0:1472308ded03 285
muraguchi 0:1472308ded03 286 _web = 1;
muraguchi 0:1472308ded03 287 // wait hold time : max(tALH,tDH,tWH,tWB)
muraguchi 0:1472308ded03 288 wait_us(tWB_US);
muraguchi 0:1472308ded03 289
muraguchi 0:1472308ded03 290 _cle = 0;
muraguchi 0:1472308ded03 291 _io.input();
muraguchi 0:1472308ded03 292
muraguchi 0:1472308ded03 293 // wait ready
muraguchi 0:1472308ded03 294 while(_rbb==0){
muraguchi 0:1472308ded03 295 __NOP();
muraguchi 0:1472308ded03 296 }
muraguchi 0:1472308ded03 297
muraguchi 0:1472308ded03 298 return statusRead();
muraguchi 0:1472308ded03 299 }
muraguchi 0:1472308ded03 300
muraguchi 0:1472308ded03 301 uint8_t RawNAND::pageProgram(const uint8_t * writeData,uint16_t blockAddress,uint8_t pageAddress,uint16_t columnAddress,uint16_t beats){
muraguchi 0:1472308ded03 302 // wait ready
muraguchi 0:1472308ded03 303 while(_rbb==0){
muraguchi 0:1472308ded03 304 __NOP();
muraguchi 0:1472308ded03 305 }
muraguchi 0:1472308ded03 306
muraguchi 0:1472308ded03 307 // 1ST PROGRAM COMMAND (0x80)
muraguchi 0:1472308ded03 308 _ceb = 0;
muraguchi 0:1472308ded03 309 _cle = 1;
muraguchi 0:1472308ded03 310 _ale = 0;
muraguchi 0:1472308ded03 311 _web = 0;
muraguchi 0:1472308ded03 312 _io = 0x80;
muraguchi 0:1472308ded03 313 _io.output();
muraguchi 0:1472308ded03 314 // wait setup time : max(tCS,tCLS,tALS,tDS,tWP)
muraguchi 0:1472308ded03 315 wait_us(tCS_US);
muraguchi 0:1472308ded03 316
muraguchi 0:1472308ded03 317 _web = 1;
muraguchi 0:1472308ded03 318 // wait hold time : max(tCLH,tDH,tWH)
muraguchi 0:1472308ded03 319 wait_us(tWH_US);
muraguchi 0:1472308ded03 320
muraguchi 0:1472308ded03 321 // 1st address column [7:0]
muraguchi 0:1472308ded03 322 _cle = 0;
muraguchi 0:1472308ded03 323 _ale = 1;
muraguchi 0:1472308ded03 324 _web = 0;
muraguchi 0:1472308ded03 325 _io = columnAddress & 0xff;
muraguchi 0:1472308ded03 326 // wait setup time : max(tALS,tCLS,tDS,tWP)
muraguchi 0:1472308ded03 327 wait_us(tWP_US);
muraguchi 0:1472308ded03 328
muraguchi 0:1472308ded03 329 _web = 1;
muraguchi 0:1472308ded03 330 // wait hold time : max(tCLH,tDH,tWH)
muraguchi 0:1472308ded03 331 wait_us(tWH_US);
muraguchi 0:1472308ded03 332
muraguchi 0:1472308ded03 333 // 2nd address column [11:8]
muraguchi 0:1472308ded03 334 _web = 0;
muraguchi 0:1472308ded03 335 _io = (columnAddress>>8) & 0x0f;
muraguchi 0:1472308ded03 336 // wait setup time : max(tALS,tCLS,tDS,tWP)
muraguchi 0:1472308ded03 337 wait_us(tWP_US);
muraguchi 0:1472308ded03 338
muraguchi 0:1472308ded03 339 _web = 1;
muraguchi 0:1472308ded03 340 // wait hold time : max(tCLH,tDH,tWH)
muraguchi 0:1472308ded03 341 wait_us(tWH_US);
muraguchi 0:1472308ded03 342
muraguchi 0:1472308ded03 343 // 3rd address {blockAddress[1:0],pageAddress[5:0]}
muraguchi 0:1472308ded03 344 _web = 0;
muraguchi 0:1472308ded03 345 _io = ((blockAddress<<6) | pageAddress) ;
muraguchi 0:1472308ded03 346 // wait setup time : max(tALS,tDS,tWP)
muraguchi 0:1472308ded03 347 wait_us(tWP_US);
muraguchi 0:1472308ded03 348
muraguchi 0:1472308ded03 349 _web = 1;
muraguchi 0:1472308ded03 350 // wait hold time : max(tALH,tDH,tWH)
muraguchi 0:1472308ded03 351 wait_us(tWH_US);
muraguchi 0:1472308ded03 352
muraguchi 0:1472308ded03 353 // 4th address blockAddress[9:2]
muraguchi 0:1472308ded03 354 _web = 0;
muraguchi 0:1472308ded03 355 _io = (blockAddress>>2) ;
muraguchi 0:1472308ded03 356 // wait setup time : max(tALS,tDS,tWP)
muraguchi 0:1472308ded03 357 wait_us(tWP_US);
muraguchi 0:1472308ded03 358
muraguchi 0:1472308ded03 359 _web = 1;
muraguchi 0:1472308ded03 360 // wait hold time : max(tALH,tDH,tWH)
muraguchi 0:1472308ded03 361 wait_us(tWH_US);
muraguchi 0:1472308ded03 362
muraguchi 0:1472308ded03 363 // datain
muraguchi 0:1472308ded03 364 _ale = 0;
muraguchi 0:1472308ded03 365 for (int b=0;b<beats;b++) {
muraguchi 0:1472308ded03 366 _io = *(writeData+b);
muraguchi 0:1472308ded03 367 _web = 0;
muraguchi 0:1472308ded03 368 // setup
muraguchi 0:1472308ded03 369 // wait setup time : max(tALS,tCLS,tDS,tWP)
muraguchi 0:1472308ded03 370 wait_us(tWP_US);
muraguchi 0:1472308ded03 371
muraguchi 0:1472308ded03 372 _web = 1;
muraguchi 0:1472308ded03 373 // hold
muraguchi 0:1472308ded03 374 // wait hold time : max(tALH,tDH,tWH)
muraguchi 0:1472308ded03 375 wait_us(tWH_US);
muraguchi 0:1472308ded03 376 }
muraguchi 0:1472308ded03 377
muraguchi 0:1472308ded03 378 // 2ND PROGRAM COMMAND (0x10)
muraguchi 0:1472308ded03 379 _cle = 1;
muraguchi 0:1472308ded03 380 _ale = 0;
muraguchi 0:1472308ded03 381 _io = 0x10;
muraguchi 0:1472308ded03 382 _web = 0;
muraguchi 0:1472308ded03 383 // wait setup time : max(tALS,tCLS,tDS,tWP)
muraguchi 0:1472308ded03 384 wait_us(tWP_US);
muraguchi 0:1472308ded03 385
muraguchi 0:1472308ded03 386 _web = 1;
muraguchi 0:1472308ded03 387 // wait hold time : max(tCLH,tDH,tWH,tWB)
muraguchi 0:1472308ded03 388 wait_us(tWB_US);
muraguchi 0:1472308ded03 389
muraguchi 0:1472308ded03 390 _cle = 0;
muraguchi 0:1472308ded03 391 _io.input();
muraguchi 0:1472308ded03 392
muraguchi 0:1472308ded03 393 // wait ready
muraguchi 0:1472308ded03 394 while(_rbb==0){
muraguchi 0:1472308ded03 395 __NOP();
muraguchi 0:1472308ded03 396 }
muraguchi 0:1472308ded03 397
muraguchi 0:1472308ded03 398 return statusRead();
muraguchi 0:1472308ded03 399 }