📄 nand.c
字号:
#include "C8051F340.h"
#include "absacc.h"
//使用内部HF振荡器,SYSCLK倍频到48MHz,USBCLK也为48MHz
#define T0_RELOADVALH 0x63
#define T0_RELOADVALL 0xBF //定时器0 10ms中断一次 SYSCLK预分频12
#define feeddog() PCA0CPH4 = 0x00;
#define NAND_CMD 0x8000
#define NAND_ADDR 0x4000
#define NAND_DATA 0x1000
#define NAND_BUSY P0^7
#define NAND_ERRO 0
#define NAND_SUCCE 1
//串口0波特率9600
unsigned char tick_count = 0;
void PCA_Init()
{
PCA0MD &= ~0x40;
PCA0MD = 0x00;
}
void Timer_Init()
{
TCON = 0x10;
TMOD = 0x21;
TL0 = 0xBF;
TH0 = 0x63;
TH1 = 0x30;
}
void UART_Init()
{
SCON0 = 0x10;
}
void EMI_Init()
{
EMI0CF = 0x14;
EMI0TC = 0x45;
}
void Port_IO_Init()
{
// P0.0 - TX1 (UART1), Open-Drain, Digital
// P0.1 - RX1 (UART1), Open-Drain, Digital
// P0.2 - Unassigned, Open-Drain, Digital
// P0.3 - Unassigned, Open-Drain, Digital
// P0.4 - TX0 (UART0), Open-Drain, Digital
// P0.5 - RX0 (UART0), Open-Drain, Digital
// P0.6 - Unassigned, Open-Drain, Digital
// P0.7 - Skipped, Open-Drain, Digital
// P1.0 - Unassigned, Push-Pull, Digital
// P1.1 - Unassigned, Open-Drain, Digital
// P1.2 - Unassigned, Open-Drain, Digital
// P1.3 - Skipped, Push-Pull, Digital
// P1.4 - Unassigned, Open-Drain, Digital
// P1.5 - Unassigned, Open-Drain, Digital
// P1.6 - Skipped, Push-Pull, Digital
// P1.7 - Skipped, Push-Pull, Digital
// P2.0 - Skipped, Push-Pull, Digital
// P2.1 - Skipped, Push-Pull, Digital
// P2.2 - Skipped, Push-Pull, Digital
// P2.3 - Skipped, Push-Pull, Digital
// P2.4 - Skipped, Push-Pull, Digital
// P2.5 - Skipped, Push-Pull, Digital
// P2.6 - Skipped, Push-Pull, Digital
// P2.7 - Skipped, Push-Pull, Digital
// P3.0 - Skipped, Push-Pull, Digital
// P3.1 - Skipped, Push-Pull, Digital
// P3.2 - Skipped, Push-Pull, Digital
// P3.3 - Skipped, Push-Pull, Digital
// P3.4 - Skipped, Push-Pull, Digital
// P3.5 - Skipped, Push-Pull, Digital
// P3.6 - Skipped, Push-Pull, Digital
// P3.7 - Skipped, Push-Pull, Digital
P1MDOUT = 0xC9;
P2MDOUT = 0xFF;
P3MDOUT = 0xFF;
P4MDOUT = 0xFF;
P0SKIP = 0x80;
P1SKIP = 0xC8;
P2SKIP = 0xFF;
P3SKIP = 0xFF;
XBR0 = 0x01;
XBR1 = 0x40;
XBR2 = 0x01;
}
void Oscillator_Init()
{
int i = 0;
CLKMUL = 0x80;
for (i = 0; i < 20; i++); // Wait 5us for initialization
CLKMUL |= 0xC0;
while ((CLKMUL & 0x20) == 0);
CLKSEL = 0x03;
}
void Interrupts_Init()
{
IE = 0x02;
}
// Initialization function for device,
// Call Init_Device() from your main program
void Init_Device(void)
{
PCA_Init();
Timer_Init();
UART_Init();
EMI_Init();
Port_IO_Init();
Oscillator_Init();
Interrupts_Init();
}
void timer0_isr(void) interrupt 1
{
TR0 = 0; // 停止定时器0
TH0 = T0_RELOADVALH; // 10ms后溢出
TL0 = T0_RELOADVALL;
TR0 = 1; // 启动 T0
tick_count ++; // 时间计数器加1
}
void delay()
{
unsigned char i;
for(i=0;i<100;i++);
}
void uart0_send(unsigned char c)
{
SBUF0 = c;
while(!TI0);
TI0 = 0;
}
void nand_erase()
{
unsigned char status;
XBYTE[NAND_CMD] = 0x60;
XBYTE[NAND_ADDR] = 0x00;
XBYTE[NAND_ADDR] = 0x03;
XBYTE[NAND_CMD] = 0xD0;
while(!(P0 & 0x80))feeddog();
XBYTE[NAND_CMD] = 0x70;
status = XBYTE[NAND_DATA];
uart0_send(status);
}
void nand_program(void)
{
unsigned int i;
unsigned char status;
//XBYTE[NAND_CMD] = 0x00;
XBYTE[NAND_CMD] = 0x80;
XBYTE[NAND_ADDR] = 0x00;
XBYTE[NAND_ADDR] = 0x00;
XBYTE[NAND_ADDR] = 0x03;
//delay();
//for(i=0;i<10;i++)
//{
XBYTE[NAND_DATA] = 0x55;
//}
XBYTE[NAND_CMD] = 0x10;
while(!(P0 & 0x80))feeddog();
XBYTE[NAND_CMD] = 0x70;
status = XBYTE[NAND_DATA];
uart0_send(status);
}
void nand_read(void)
{
unsigned int i;
unsigned char status;
XBYTE[NAND_CMD] = 0x00;
XBYTE[NAND_ADDR] = 0x00;
XBYTE[NAND_ADDR] = 0x00;
XBYTE[NAND_ADDR] = 0x03;
//delay();
while(!(P0 & 0x80))feeddog();
//for(i=0;i<10;i++)
//{
uart0_send(XBYTE[NAND_DATA]);
//delay();
//}
XBYTE[NAND_CMD] = 0x70;
status = XBYTE[NAND_DATA];
uart0_send(status);
}
unsigned char nand_reset()
{
unsigned char status;
XBYTE[NAND_CMD] = 0xFF;
while(!(P0 & 0x80))feeddog();
XBYTE[NAND_CMD] = 0x70;
status = XBYTE[NAND_DATA];
if(status&0x01)
return(status);
else
return(status);
}
void main()
{
unsigned char i = 0;
unsigned char j = 0;
unsigned char xdata test_data[528];
unsigned int count;
Init_Device();
for(count=0;count<528;count++)
test_data[count] = count;
TR0 = 1;
TR1 = 1;
//EA = 1;
nand_reset();
nand_erase();
nand_program();
nand_read();
while(1)
{
if(tick_count >= 25)
{
tick_count = 0;
P1 ^= 0x01;
XBYTE[NAND_CMD] = 0x90; //读NAND FLASH ID
XBYTE[NAND_ADDR] = 0x00;
i = XBYTE[NAND_DATA]; //0xEC
j = XBYTE[NAND_DATA]; //0x75
//uart0_send (i);
//uart0_send (j);
//i++;
}
feeddog();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -