реклама на сайте
подробности

 
 
> Работа с NAND FLASH.
Jenya7
сообщение Jun 19 2018, 05:02
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



При обращении к памяти (чтение, запись) я передаю адрес (на картинке)
Скажем при стирании блока (на картинке) - я должен передать адрес блока – 11 бит? Или адрес блока – 11 бит + адрес страницы – 6 бит?
Если блок + страница то получается так?
Код
//////////////////////////////////// ERASE BLOCK  /////////////////////////////
   SPI2_CS0_OFF;
   SPI_rw_flash(NAND_FLASH_BLOCK_ERASE, &dummy);
   temp = 0 | (block_addr >> 10);
   SPI_rw_flash(temp, &dummy);  // Dummy+A16
   temp = block_addr >> 8;
   SPI_rw_flash(temp, &dummy);   //A15-A8
   temp =( block_addr<<3) | page_addr;
   SPI_rw_flash(temp, &dummy);   //A7-A0
   SPI2_CS0_ON;



или нет.
У нас дано
Block Address (2048 blocks/device): 11 bits
Page Address (64 pages/block): 6 bits
Исходя из этого строим Row Address uint32_t row_address = (block_address<<6) | page_address;
а теперь это адрес нужно передать тремя байтами
первый - temp = row_address >> 16;
второй - temp = row_address >> 8;
третий - temp = row_address & 0xFF;
получается так ?

Сообщение отредактировал Jenya7 - Jun 19 2018, 06:04
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Alex11
сообщение Jun 20 2018, 18:32
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 106
Регистрация: 23-10-04
Из: С-Петербург
Пользователь №: 965



Про какую NAND речь-то идет? Мы все опять догадываться должны?
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 21 2018, 04:49
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Alex11 @ Jun 20 2018, 23:32) *
Про какую NAND речь-то идет? Мы все опять догадываться должны?

TC58CVG2S0HxAIx.

Скажем я хочу стереть блок
CODE
uint32_t NFLASH_WriteEnable(void)
{
uint8_t dummy, l_error, status;
uint32_t timeout = 0, count_cycles;

do
{
SPI2_CS0_OFF;
l_error = SPI_TransferByte(SPI2_BASE_PTR, NAND_FLASH_WRITE_ENABLE , &dummy);
SPI2_CS0_ON;

for(count_cycles = 0; count_cycles < NAND_FLASH_TIME_OUT; count_cycles++);

SPI2_CS0_OFF;

l_error |= SPI_TransferByte(SPI2_BASE_PTR, NAND_FLASH_GET_FEATURES, &dummy);
l_error |= SPI_TransferByte(SPI2_BASE_PTR, NAND_FLASH_STATUS_REGISTER_ADDRESS, &dummy);
l_error |= SPI_TransferByte(SPI2_BASE_PTR, 0x0, &status);

SPI2_CS0_ON;

for(count_cycles = 0; count_cycles < NAND_FLASH_TIME_OUT; count_cycles++);

if (timeout++ > NAND_FLASH_TIMEOUT)
return NAND_FLASH_WE_FAIL;

}
while ((status & WEL) == 0); //write enable flag

return NAND_FLASH_OK;
}
uint32_t NFLASH_CheckErase(void)
{
uint8_t dummy, l_error, status;
uint32_t timeout = 0, count_cycles;

do
{
SPI2_CS0_OFF;
l_error |= SPI_TransferByte(SPI2_BASE_PTR, NAND_FLASH_GET_FEATURES, &dummy);
l_error |= SPI_TransferByte(SPI2_BASE_PTR, NAND_FLASH_STATUS_REGISTER_ADDRESS, &dummy);
l_error |= SPI_TransferByte(SPI2_BASE_PTR, 0x0, &status);
SPI2_CS0_ON;

if ( timeout++ > NAND_FLASH_TIMEOUT)
return NAND_FLASH_ERASE_FAIL;

for(count_cycles = 0; count_cycles < NAND_FLASH_TIME_OUT; count_cycles++);
}
while ((status & ERS_F) == 1); //erase fail flag

return NAND_FLASH_OK;
}
uint32_t NFLASH_BlockErase(uint32_t block_addr)
{
uint8_t dummy, l_error, temp;
uint32_t count_cycles;
uint32_t status;

//status = NFLASH_CheckBusy();

//if (status == NAND_FLASH_OK)
//{
status = NFLASH_WriteEnable();
if (status == NAND_FLASH_OK)
{
SPI2_CS0_OFF;
l_error = SPI_TransferByte(SPI2_BASE_PTR, NAND_FLASH_BLOCK_ERASE, &dummy);
temp = block_addr >> 16;
l_error |= SPI_TransferByte(SPI2_BASE_PTR, temp, &dummy); // Dummy+A16
temp = block_addr >> 8;
l_error |= SPI_TransferByte(SPI2_BASE_PTR, temp, &dummy); //A15-A8
temp = block_addr & 0xFF;
l_error |= SPI_TransferByte(SPI2_BASE_PTR, temp, &dummy); //A7-A0
SPI2_CS0_ON;

for(count_cycles = 0; count_cycles < NAND_FLASH_TIME_OUT; count_cycles++);

status = NFLASH_CheckErase();
if (status != NAND_FLASH_OK)
return status;
}
else
return status;
//}
//else
//return status;

return NAND_FLASH_OK;
}
И потом
Код
row_address = (block_address<<6) | (page_address&0x3F);
NFLASH_BlockErase(row_address );

Я правильно понимаю процесс?

Сообщение отредактировал IgorKossak - Jun 21 2018, 06:37
Причина редактирования: [codebox] для длинного кода. [code]-для короткого!!!

Прикрепленные файлы
Прикрепленный файл  TC58CVG2S0HxAIx_Rev1.1_2016_11_08.pdf ( 1.59 мегабайт ) Кол-во скачиваний: 12
 
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 10:38
Рейтинг@Mail.ru


Страница сгенерированна за 0.01388 секунд с 7
ELECTRONIX ©2004-2016