Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Никак не могу заставить работать K9F1208U0B-PIB0, хотя с K9F1208U0M-PIB0 все нормально работает.

Отправлено Ale3000 28 мая 2007 г. 08:14


Посмотрите код, а то у меня глаза уже замылены:

typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef unsigned long DWORD;

#define CLOCKS(time) (8.000*time)
#define Flash_CLE PORTE_Bit3
#define Flash_ALE PORTG_Bit2
#define Flash_WP PORTE_Bit4
#define Flash_CE PORTG_Bit4
//#define Flash_DIR PORTA_Bit2
#define Flash_WR PORTG_Bit0
#define Flash_RD PORTG_Bit1
#define Flash_RB PIND_Bit6

#define Flash_PORT PORTC
#define Flash_PIN PINC
#define Flash_DDR DDRC

#define NAND_BLOCKS_LOG 12
#define NAND_PAGES_PER_BLOCK_LOG 5
#define NAND_PAGE_SIZE_LOG 9

#define NAND_BLOCK_SIZE_LOG (NAND_PAGE_SIZE_LOG+NAND_PAGES_PER_BLOCK_LOG)
#define NAND_PAGES_LOG (NAND_BLOCKS_LOG+NAND_PAGES_PER_BLOCK_LOG)
#define NAND_BLOCKS (1<#define NAND_PAGES_PER_BLOCK (1<#define NAND_PAGES (1L<#define NAND_PAGE_SIZE (1<#define NAND_BLOCK_SIZE (1L<#define NAND_BLOCKS_MASK (NAND_BLOCKS-1)
#define NAND_PAGES_PER_BLOCK_MASK (NAND_PAGES_PER_BLOCK-1)
#define NAND_PAGES_MASK (NAND_PAGES-1)
#define NAND_PAGE_SIZE_MASK (NAND_PAGE_SIZE-1)
#define NAND_BLOCK_SIZE_MASK (NAND_BLOCK_SIZE-1)

BYTE NAND_PageBuffer[528];
BYTE*pNAND_PageBuffer;

BYTE NAND_ReadStatus()
{
BYTE tb0;
Flash_CLE=1;
Flash_ALE=0;
Flash_CE=0;
Flash_WR=0;
Flash_PORT=0x70;
#ifdef Flash_DIR
Flash_DIR=1;
#endif
Flash_DDR=255;
Flash_WR=1;
Flash_CLE=0;
Flash_DDR=0;
#ifdef Flash_DIR
Flash_DIR=0;
#endif
Flash_RD=0;
__no_operation();__no_operation(); // Задержка, чтобы значение PORT проникло на ноги процессора
BYTE tb=(CLOCKS(2)+5)/6;
while(tb--); // 1 цикл занимает 6 тактов процессора
tb0=Flash_PIN;
Flash_RD=1;
Flash_CE=1;
#ifdef Flash_DIR
Flash_DIR=1;
#endif
return tb0;
}
void NAND_ReadPhysicPage(WORD nBlock,BYTE nPage)
{
BYTE tb;
BYTE*pBuf;
DWORD dwPage=((DWORD)nBlock< Flash_RD=1;
Flash_CLE=1;
Flash_ALE=0;
Flash_CE=0;
Flash_WR=0;
Flash_PORT=0x00; // Read Command
#ifdef Flash_DIR
Flash_DIR=1;
#endif
Flash_DDR=255;
Flash_WR=1;
Flash_CLE=0;
Flash_ALE=1;
Flash_WR=0;
Flash_PORT=0x00; // Address =0, Begin of Page
Flash_WR=1;
Flash_WR=0;
Flash_PORT=dwPage&255;
Flash_WR=1;
Flash_WR=0;
Flash_PORT=(dwPage>>8)&255;
Flash_WR=1;
Flash_WR=0;
Flash_PORT=(dwPage>>16)&255;
Flash_WR=1;
Flash_ALE=0;
tb=(CLOCKS(15)+5)/6;
while(tb--); // 1 цикл занимает 6 тактов процессора
Flash_PORT=255; // Включим подтягивающие резисторы
Flash_DDR=0;
#ifdef Flash_DIR
Flash_DIR=0;
#endif
pBuf=pNAND_PageBuffer;
for(WORD tw=0;tw<528;tw++,pBuf++)
{
Flash_RD=0;
__no_operation();__no_operation(); // Задержка, чтобы значение PORT проникло на ноги процессора
tb=(CLOCKS(2)+5)/6;
while(tb--); // 1 цикл занимает 6 тактов процессора
*pBuf=Flash_PIN;
Flash_RD=1;
}
#ifdef Flash_DIR
Flash_DIR=1;
#endif
Flash_CE=1;
}
BYTE NAND_WritePhysicPage(WORD nBlock,BYTE nPage)
{
WORD tw;
BYTE tb;
BYTE *pBuf;
DWORD dwPage=((DWORD)nBlock< Flash_WP=1;
Flash_CLE=1;
Flash_ALE=0;
Flash_CE=0;
Flash_WR=0;
Flash_PORT=0x00; // Move Pointer to the Begin of Page
#ifdef Flash_DIR
Flash_DIR=1;
#endif
Flash_DDR=255;
Flash_WR=1;
Flash_WR=0;
Flash_PORT=0x80; // Program Write Data Command
Flash_WR=1;
Flash_CLE=0;
Flash_ALE=1;
Flash_WR=0;
Flash_PORT=0x00; // Address =0, Begin of Page
Flash_WR=1;
Flash_WR=0;
Flash_PORT=dwPage&255;
Flash_WR=1;
Flash_WR=0;
Flash_PORT=(dwPage>>8)&255;
Flash_WR=1;
Flash_WR=0;
Flash_PORT=(dwPage>>16)&255;
Flash_WR=1;
Flash_ALE=0;
pBuf=pNAND_PageBuffer;
for(tw=0;tw<528;tw++)
{
Flash_WR=0;
Flash_PORT=*pBuf;
pBuf++;
Flash_WR=1;
}
Flash_CLE=1;
Flash_WR=0;
Flash_PORT=0x10; // Program Command
Flash_WR=1;
do tb=NAND_ReadStatus();
while(!(tb&64));
Flash_WP=0;
return tb&1;
}
BYTE NAND_ErasePhysicBlock(WORD nBlock)
{
BYTE tb;
Flash_WP=1;
Flash_CLE=1;
Flash_ALE=0;
Flash_CE=0;
Flash_WR=0;
Flash_PORT=0x60; // Erase Command
#ifdef Flash_DIR
Flash_DIR=1;
#endif
Flash_DDR=255;
Flash_WR=1;
Flash_CLE=0;
Flash_ALE=1;
Flash_WR=0;
Flash_PORT=nBlock< Flash_WR=1;
Flash_WR=0;
Flash_PORT=nBlock>>(8-NAND_PAGES_PER_BLOCK_LOG); // Byte 1
Flash_WR=1;
Flash_WR=0;
Flash_PORT=nBlock>>(16-NAND_PAGES_PER_BLOCK_LOG); // Byte 2
Flash_WR=1;
Flash_CLE=1;
Flash_ALE=0;
Flash_WR=0;
Flash_PORT=0xD0; // Erase Command
Flash_WR=1;
do tb=NAND_ReadStatus();
while(!(tb&64));
Flash_WP=0;
return tb&1;
}
void main()
{
PORTB=0x80;
DDRB=0x87;

PORTD=0x90;
DDRD=0xB3;

PORTE=0x00;
DDRE=0xF8;

PORTF=0;
DDRF=4;

PORTG=0x0B;
DDRG=0x1F;

WDTCR=0x18; // Начать конфигурирование Watchdoga
WDTCR=15; // Период WatchDoga - 2.1 s

__enable_interrupt();
pNAND_PageBuffer=NAND_PageBuffer;
NAND_ErasePhysicBlock(0x20);
for(WORD tw=0;tw<512;tw++)NAND_PageBuffer[tw]=tw;
NAND_WritePhysicPage(0x20,0);
for(WORD tw=0;tw<512;tw++)NAND_PageBuffer[tw]=tw+1;
NAND_WritePhysicPage(0x20,2);
memset(NAND_PageBuffer,0,528);
NAND_ReadPhysicPage(0x20,0);
for(;;);
}

На самом последнем for(;;); стоит Breakpoint и я вижу, что считывается совсем не то, что я записывал.
По ссылке мой последний пост на эту тему.


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 38:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru