Запись в NAND flash Samsung

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 27
Зарегистрирован: Сб янв 17, 2015 06:37:10

Сообщение Nosaer »

Здравствуйте.
Решил освоить работу с 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);
}
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 27
Зарегистрирован: Сб янв 17, 2015 06:37:10

Сообщение Nosaer »

Прошу прощения. Все, разобрался)
Реклама
Ответить

Вернуться в «Периферия»