Пытаюсь осуществить случайные чтение и запись в NAND. Делаю все по AC waveform указанной в даташите
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;
}