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

 
 
> Подключение Nand Flash к stm32
Klaxons
сообщение Dec 15 2015, 18:08
Сообщение #1





Группа: Участник
Сообщений: 9
Регистрация: 8-12-15
Пользователь №: 89 623



Подключил and flash Samsung K9G1G08U0D по FSMC к stm.

Настроил пины и хэндлер, используя HAL библиотеку пытаюсь прочитать ID девайса, на что функция возвращает все 0 (то есть Marker_id, Device_id и тд равны 0), судя по документации, я должен получать Marker_Id = 0xEC, Device_Id=0xF1

вот пример кода

CODE

NAND_HandleTypeDef hnand;

void initNand(void)
{
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0);
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

initNandGPIO();
initNandHandler();
}

void initNandGPIO(void)
{
GPIO_InitTypeDef GPIO_InitStruct;

__GPIOE_CLK_ENABLE();
__GPIOD_CLK_ENABLE();

GPIO_InitStruct.Pin = GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF12_FSMC;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_14 | GPIO_PIN_15 | GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF12_FSMC;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

HAL_NVIC_SetPriority(FSMC_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(FSMC_IRQn);
}

void initNandHandler(void)
{
FSMC_NAND_PCC_TimingTypeDef ComSpaceTiming;
FSMC_NAND_PCC_TimingTypeDef AttSpaceTiming;

hnand.Instance = FSMC_NAND_DEVICE;

hnand.Init.NandBank = FSMC_NAND_BANK2;
hnand.Init.Waitfeature = FSMC_NAND_PCC_WAIT_FEATURE_DISABLE;
hnand.Init.MemoryDataWidth = FSMC_NAND_PCC_MEM_BUS_WIDTH_8;
hnand.Init.EccComputation = FSMC_NAND_ECC_DISABLE;
hnand.Init.ECCPageSize = FSMC_NAND_ECC_PAGE_SIZE_256BYTE;
hnand.Init.TCLRSetupTime = 0;
hnand.Init.TARSetupTime = 0;

ComSpaceTiming.SetupTime = 252;
ComSpaceTiming.WaitSetupTime = 252;
ComSpaceTiming.HoldSetupTime = 252;
ComSpaceTiming.HiZSetupTime = 252;

AttSpaceTiming.SetupTime = 252;
AttSpaceTiming.WaitSetupTime = 252;
AttSpaceTiming.HoldSetupTime = 252;
AttSpaceTiming.HiZSetupTime = 252;

HAL_NAND_Init(&hnand, &ComSpaceTiming, &AttSpaceTiming);
}

void FSMC_IRQHandler(void)
{
HAL_NAND_IRQHandler(&hnand);
}

void readId(void)
{
NAND_IDTypeDef NAND_ID;
char buf[100];

if (HAL_NAND_Read_ID(&hnand, &NAND_ID) == HAL_OK)
{
sprintf(buf, "Nand Flash ID = %02X,%02X,%02X,%02X\n",NAND_ID.Maker_Id, NAND_ID.Device_Id, NAND_ID.Third_Id, NAND_ID.Fourth_Id);
print(buf);
}
}

Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Klaxons
сообщение Dec 17 2015, 19:37
Сообщение #2





Группа: Участник
Сообщений: 9
Регистрация: 8-12-15
Пользователь №: 89 623



В документации к микроконтроллеру данные формулы для расчета времени доступа к памяти

Код
(SET + 1) x tHCLK >= max (tCS, tCLS, tALS, tCLR, tAR) - tWP 

(WAIT + 1) x tHCLK >= max (tWP,tRP) 

(HIZ + 1) x tHCLK >= max(tCS, tALS, tCLS) + (tWP - tDS) 

(HOLD + 1) x tHCLK >= max (tCH, tCLH, tALH) 

((WAIT+1)+(HOLD+1)+(SET+1))xtHCLK >= max(tWC/RC)


Только не понятно, max - это максимальное значение из перечисленных параметром или сумма всех параметров? И еще не ясно как рассчитать tHCLK, использую контроллер stm32v407vg, тактируюсь от внешнего кварца на 8МГц, HCLK = 168МГц.

Еще выяснил, что данные которые я писал, писал их не на внешние nand flash, а в память микроконтроллера, выяснилось это, когда выдернул флешку из контроллера, запустил код, а он все-равно читает какие-то данные.

Теперь еще вопрос встал, как эти данные удалить, прошивал контроллер другой программой, потом снова этой и данные на месте. Функция eraseBlock и eraseAllBlocks(), листинг которых ниже также не дали результата.

Ну и вопрос все же как "подружиться" с внешней памятью, пины настроил, сам handler fsmc инициализировал, обращаюсь по адресу 0x70000000, пишу и читаю блок 0, страницу 0 и начиная с 0 байта

Код
WriteReadAddr.Zone = 0x00;
WriteReadAddr.Block = 0x00;
WriteReadAddr.Page = 0x00;


CODE

void eraseBlock()
{
WriteReadAddr.Zone = 0x00;
WriteReadAddr.Block = 0x00;
WriteReadAddr.Page = 0x00;
HAL_NAND_Erase_Block(&hnand, &WriteReadAddr);
}

void eraseAllBlocks()
{
uint16_t i,j;
for (i = 0x00; i<NAND_ZONE_SIZE; i++)
{
for (j=0x00; j<NAND_BLOCK_SIZE; j++)
{
WriteReadAddr.Zone = 0x00;
WriteReadAddr.Block = i;
WriteReadAddr.Page = j;
HAL_NAND_Erase_Block(&hnand, &WriteReadAddr);
}
}
}
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 24th July 2025 - 16:07
Рейтинг@Mail.ru


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