Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс. e-mail:jobsmp@pochta.ru |
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 и я вижу, что считывается совсем не то, что я записывал.
По ссылке мой последний пост на эту тему.