AirioBase + 2 chip PicoSSD board.

Dependencies:   mbed EEPROM USBDevice

Committer:
muraguchi
Date:
Wed Sep 15 16:32:12 2021 +0000
Revision:
4:2e8b78a74493
Parent:
3:28ceea26c918
AirioBase + 2 chip PicoSSD board.

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