⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nand.c

📁 使用内部HF振荡器
💻 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 + -