Доброго времени суток, ALL!
Надеюсь на вашу помошь, т.к. собственных сил уже не хватает.
Subj, заключается в следующем.
Появилась необходимость повышения производительности в работе с NAND flash, поэтому заменил ранее использовавшуюся 8-ми битную NAND Micron MT29F4G08AAAWP ET
на аналогичную ей 16-ти битную Micron MT29F2G16AAD ET D. Возникла проблема - не могу считать ID c 16 битной NAND, когда на 8-ми битной все работает.
Подкорректировал схему включения микросхемы, но структорно она осталась прежней:
AT91RM9200 MICRON
NSC3| ------------->| !CE
A19| ------------->| CLE
A20| ------------->| ALE
NANDOE| ------------->| !RE
NANDWE| ------------->| !WE
PC8|<-------------- | !R/b
16x I/0|--< шина >--| 16x I/0
где !СE - инвертированный вход, аналогично как и RE, WE
Сигналы все проходят (проверил осциллогорафом).
Схемотехнически, imho, все выполненно правильно. В цепи питания видимых ошибок не обнаруженно.
(да и ошибиться-то там негде)
написал маленький дравер для работы с NAND (первичный загрузчик отлажен и проверен (100% работает!)):
//listing...
CODE
//чтение данных
#define read_data() (*(volatile unsigned short*)0x40000000)
//запись данных
#define write_data(x) *((volatile unsigned short*)0x40000000) = (unsigned short)(x)
//запись команды - поднимается CS и адресс A19 (CLE)
#define write_command(x) *((volatile unsigned short*)0x40080000) = (unsigned short)(x)
//запись адреса - поднимается CS и адресс A20 (ALE)
#define write_address(x) *((volatile unsigned short*)0x40100000) = (unsigned short)(x)
// инициализация NAND
void nand_init(void)
{
// Конфигурирование EBI - CS3 настраивается для работы с NAND (CS - !CE)
SET(MCU_MC|EBI_CSA, 0x00000008);
/*
настройка регистра SMC Chip Select Register 3
( Byte Access Type = 16 бит;
Data Bus Width = 16 бит;
Wait State Enable = 1;
Number of Wait States = 127;
перепробовал все варианты, с учетом всех задержек и временных диаграмм
)
*/
SET(MCU_MC|SMC_CSR3, 0x000030FF);
// настройка PIO - здесь все просто
SET(MCU_PIOC|PIO_ASR, 0x0000000a);
//SET(MCU_PIOC|PIO_MDDR, 0x0000000a);
SET(MCU_PIOC|PIO_PUER, 0x0000000a);
SET(MCU_PIOC|PIO_PDR, 0x0000000a);
}
// чтение ID
void NAND_READ_ID(void)
{
unsigned short status;
write_command(0x0090); // в старших адресах 0x00
write_address(0x0000);
status = read_data();
printf("NAND status = %.4x\n", (unsigned)status);
status = read_data();
printf("NAND status = %.4x\n", (unsigned)status);
status = read_data();
printf("NAND status = %.4x\n", (unsigned)status);
status = read_data();
printf("NAND status = %.4x\n", (unsigned)status);
}
На выходе получаю FFFF. Шина данных подтянута. Такое ощущение, что nand просто не работает.
Но! При подаче управляющего сигнала переазгрузки (write_command(0x00FF); ) сигнал R/B генерируется и прерыване возбуждается. Что говорит о том что NAND срабатывает. Ошибки в передаче по сигнальным линиям быть не может.
Очень часто данная команда "не проходит", но всегда прохоит команда (write_command(0xFFFF)!!! С чем это связанно я не знаю.
Аналогичный алгоритм работает при использовани 8 битной NAND.
При использовании другого значения для SMC Chip Select Register 3 ( SET(MCU_MC|SMC_CSR3, 0x77033F80)) в соответствии с даташитом.
Получаю на выходе 0x1111.
Может кроме EBI и SMC нужно что-то еще настраивать?
Мог накосячить в разыменовании указателя типа short, но в листинге (см. выше) ошибок не нашел.
Думаю косяк в програмной части, но где найти не могу.
Подскажите! Собственных сил уже не осталось, все волосы с задницы вырвал.
Расчитываю на вашу помощь!