Trying to randomly read and write to NAND. I do everything on the AC waveform specified in the datasheet ( http://www.macronix.com/Lists/DataSheet/Attachments/2670/MX30LF1G08AA,%203V,%201Gb,%20v1.5.pdf )
struct IORequest_t { void* buffer; uint16_t ofst; uint16_t size; }; ResultCode_t NandBase::Write(uint32_t addr, IORequest_t *requests, uint32_t cnt) { /// Вычисляем адрес страницы в микроосхеме uint32_t pageNumber = addr / NAND_PAGE_SIZE; addr = pageNumber << 16; /// Дождаться готовности микросхемы if(WaitReady() != RESULT_SUCCESS) { return RESULT_TIMEOUT; } /// Отправляем команду записи *(uint8_t* )(MapAddress | COMMAND_SECTION) = 0x80;//CMD_PAGE_WRITE; /// Отправить адрес *(uint32_t* )(MapAddress | ADDRESS_SECTION) = addr; /// Записываем данные for(uint32_t i = 0; i < cnt; i++) { const uint8_t* src = (const uint8_t*) requests[i].buffer; uint16_t ofst = requests[i].ofst; uint16_t size = requests[i].size; /// Проверяем не выйдет ли запись за предел страницы if(ofst+size > NAND_PAGE_SIZE) { return RESULT_INVALID_PARAMS; } /// Отправить команду произвольного доступа *(uint8_t* )(MapAddress | COMMAND_SECTION) = 0x85;//CMD_PAGE_WRITE; /// Отправляем смещение *(uint16_t*)(MapAddress | ADDRESS_SECTION) = ofst; /// Пишем данные for(const uint8_t* data = src; size; size--) { *(uint8_t*)(MapAddress | DATA_SECTION) = *data++; } } /// Отправляем команду подтверждения записи *(uint8_t* )(MapAddress | COMMAND_SECTION) = 0x10;//CMD_WRITE_CONFIRM; /// Дождаться готовности микросхемы if(WaitReady() != RESULT_SUCCESS) { return RESULT_TIMEOUT; } /// Проверить результат записи uint8_t status; ReadStatus(&status); if(status & 1) { return RESULT_PROGRAM_FAILED; } /// Отправить коману чтения *(uint8_t* )(MapAddress | COMMAND_SECTION) = 0x00;//CMD_PAGE_READ; /// Отправить адрес *(uint32_t* )(MapAddress | ADDRESS_SECTION) = addr; /// Отправить команду подтверждения *(uint8_t* )(MapAddress | COMMAND_SECTION) = 0x30;///CMD_READ_CONFIRM; /// Дождаться готовности микросхемы if(WaitReady() != RESULT_SUCCESS) { return RESULT_TIMEOUT; } /// Чтение каждого блока данных for(uint32_t i = 0; i < cnt; i++) { const uint8_t* src = (const uint8_t*) requests[i].buffer; uint16_t ofst = requests[i].ofst; uint16_t size = requests[i].size; /// Отправить команду рандомного доступа *(uint8_t*)(MapAddress | COMMAND_SECTION) = 0x05;//CMD_RANDOM_DATA_OUTPUT; /// Отправить смещение *(uint16_t*)(MapAddress | ADDRESS_SECTION) = ofst; /// Отправить команду подтверждения рандомного чтения *(uint8_t*) (MapAddress | COMMAND_SECTION) = 0xE0;//CMD_RANDOM_DATA_OUTPUT_CONFIRM; /// Сравнить исходняе и записанные данные for(const uint8_t* data = src; size; size--) { if(*data++ != *(uint8_t* )(MapAddress | DATA_SECTION)) { return RESULT_PROGRAM_FAILED; } } } return RESULT_SUCCESS; }
I am writing to a pre-erased block, the reading check always fails: units are read. What am I doing wrong?