500KB USB mass storage

Dependencies:   mbed EEPROM USBDevice

Committer:
muraguchi
Date:
Tue Feb 09 12:02:52 2021 +0000
Revision:
1:49963e1662d6
Parent:
0:1472308ded03
Initial release

Who changed what in which revision?

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