Здравствуйте.
Решил освоить работу с Flash NAND памятью Samsung (K9K8G08U0D).
Вроде бы все делаю по даташиту, все временные интервалы выставляю и.т.д.
Но записать данные в память не удается. Научился считывать ID флешки и стирать блоки, но с записью никак.
После записи считываю статус и вместо 0xC0 получаю 0xFF.
Возможно, что то упускаю или в чем то ошибся, но косяк не могу найти уже вторую неделю. Надеюсь, на вашу помощь.
Решил освоить работу с Flash NAND памятью Samsung (K9K8G08U0D).
Вроде бы все делаю по даташиту, все временные интервалы выставляю и.т.д.
Но записать данные в память не удается. Научился считывать ID флешки и стирать блоки, но с записью никак.
После записи считываю статус и вместо 0xC0 получаю 0xFF.
Возможно, что то упускаю или в чем то ошибся, но косяк не могу найти уже вторую неделю. Надеюсь, на вашу помощь.
Код: Выделить всё
void FlashWrite()
{
Flash_IO.DIRSET = 0xFF; // Порт ввода вывода на выход
PORTA.OUTCLR = (1<<Flash_CE); // Chip Select в 0
PORTA.OUTSET = (1<<Flash_CLE); // Устанавливаю CLE
PORTA.OUTCLR = (1<<Flash_WE); // Скидываю WE
Flash_IO.OUTSET = 0x80; // Передаю первую команду на запись
PORTA.OUTSET = (1<<Flash_WE); // Устанавливаю WE
PORTA.OUTCLR = (1<<Flash_CLE); // Сбрасываю CLE
PORTA.OUTSET = (1<<Flash_ALE); // Устанавливаю ALE
PORTA.OUTCLR = (1<<Flash_WE); // Скидываю WE
Flash_IO.OUTSET = ColAdd1;
PORTA.OUTSET = (1<<Flash_WE); // Устанавливаю WE
asm("NOP");
PORTA.OUTCLR = (1<<Flash_WE); // Скидываю WE
Flash_IO.OUTSET = ColAdd2;
PORTA.OUTSET = (1<<Flash_WE); // Устанавливаю WE
asm("NOP");
PORTA.OUTCLR = (1<<Flash_WE); // Скидываю WE
Flash_IO.OUTSET = RowAdd1;
PORTA.OUTSET = (1<<Flash_WE); // Устанавливаю WE
asm("NOP");
PORTA.OUTCLR = (1<<Flash_WE); // Скидываю WE
Flash_IO.OUTSET = RowAdd2;
PORTA.OUTSET = (1<<Flash_WE); // Устанавливаю WE
asm("NOP");
PORTA.OUTCLR = (1<<Flash_WE); // Скидываю WE
Flash_IO.OUTSET = RowAdd3;
PORTA.OUTSET = (1<<Flash_WE); // Устанавливаю WE
PORTA.OUTCLR = (1<<Flash_ALE); // Сбрасываю ALE
asm("NOP"); // Tadl 70 наносекунд
for(i=0;i<20;i++)
{
PORTA.OUTCLR = (1<<Flash_WE);
Flash_IO.OUTSET = data[i];
PORTA.OUTSET = (1<<Flash_WE);
asm("NOP");
}
PORTA.OUTSET = (1<<Flash_CLE); // Устанавливаю CLE
PORTA.OUTCLR = (1<<Flash_WE);
Flash_IO.OUTSET = 0x10;
PORTA.OUTSET = (1<<Flash_WE);
PORTA.OUTCLR =(1<<Flash_CLE); // Сбрасываю CLE
// Tprog 0,2-0,7 mS + Twb не больше 100 нс
TCC0.PER = 5600; // 0.7 mS
StartTimerC();
while(TCC0.CTRLA)
{
asm("NOP");
}
PORTA.OUTSET = (1<<Flash_CLE); // Устанавливаю CLE
PORTA.OUTCLR = (1<<Flash_WE);
Flash_IO.OUTSET = 0x70;
PORTA.OUTSET = (1<<Flash_WE);
PORTA.OUTCLR = (1<<Flash_CLE); // Сбрасываю CLE
asm("NOP"); // Twhr 60 nS
Flash_IO.DIRCLR = 0xFF;
Flash_IO.OUTSET = 0xFF;
PORTA.OUTCLR = (1<<Flash_RE);
StatusFlash = Flash_IO.IN;
PORTA.OUTSET = (1<<Flash_RE);
PORTA.OUTSET = (1<<Flash_CE); // Chip Select в 1
sendCharE0(StatusFlash);
}
