打印
[DemoCode下载]

N76E003操作SPI的Flash

[复制链接]
739|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小灵通2018|  楼主 | 2019-5-13 22:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2017 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/

//***********************************************************************************************************
//  Website: http://www.nuvoton.com
//  E-Mail : MicroC-8bit@nuvoton.com
//  Date   : Jan/21/2017
//***********************************************************************************************************

//***********************************************************************************************************
//  File Function: N76E003 Access SPI Flash (W25Q16BV) demo code
//***********************************************************************************************************
#include "N76E003.h"
#include "SFR_Macro.h"
#include "Function_define.h"
#include "Common.h"
#include "Delay.h"


#define SPI_CLOCK       0

#define SS_PIN          P15
#define WRITE_ENABLE    0x06
#define WRITE_DISABLE   0x04
#define READ_DATA       0x03
#define PAGE_PROGRAM    0x02
#define CHIP_ERASE      0xC7
#define READ_STATUS1    0x05

//-----------------------------------------------------------------------------------------------------------
void SPI_Error(void)
{
    printf ("\n*  SPI Error, please check the connection between MCU and SPI Flash");
    while(1);
}
//-----------------------------------------------------------------------------------------------------------
void SPI_Initial(void)
{
    #if   SPI_CLOCK == 0
            clr_SPR1;
            clr_SPR0;
    #elif SPI_CLOCK == 1
            clr_SPR1;
            set_SPR0;
    #elif SPI_CLOCK == 2
            set_SPR1;  
            clr_SPR0;
    #elif SPI_CLOCK == 3
            set_SPR1;
            set_SPR0;
    #endif

    /* /SS General purpose I/O ( No Mode Fault ) */
    set_DISMODF;
    clr_SSOE;

    /* SPI in Master mode */
    set_MSTR;

    /* MSB first */
    clr_LSBFE;

    clr_CPOL;
    clr_CPHA;
   
    /* Enable SPI function */
    set_SPIEN;
}
//-----------------------------------------------------------------------------------------------------------
void Read_MID_DID(UINT8 *pu8MID,UINT8 *pu8DID)
{
    SS_PIN = 0;
    SPDR = 0x90;
    while((SPSR&0x80)==0x00);
    clr_SPIF;

    SPDR = 0x00;
    while((SPSR&0x80)==0x00);
    clr_SPIF;

    SPDR = 0x00;
    while((SPSR&0x80)==0x00);
    clr_SPIF;

    SPDR = 0x00;
    while((SPSR&0x80)==0x00);
    clr_SPIF;

    SPDR = 0xFF;
    while((SPSR&0x80)==0x00);
    *pu8MID = SPDR;
    clr_SPIF;

    SPDR = 0xFF;
    while((SPSR&0x80)==0x00);
    *pu8DID = SPDR;
    clr_SPIF;
    SS_PIN = 1;   
}
//-----------------------------------------------------------------------------------------------------------
void Flash_Write_Enable(void)
{
    SS_PIN = 0;
    SPDR = WRITE_ENABLE;
    while((SPSR&0x80)==0x00);
    clr_SPIF;
    SS_PIN = 1;   
}
//-----------------------------------------------------------------------------------------------------------
void Flash_Write_Disable(void)
{
    SS_PIN = 0;
    SPDR = WRITE_DISABLE;
    while((SPSR&0x80)==0x00);
    clr_SPIF;
    SS_PIN = 1;   
}
//-----------------------------------------------------------------------------------------------------------
void Flash_Chip_Erase(void)
{
    SS_PIN = 0;
    SPDR = CHIP_ERASE;
    while((SPSR&0x80)==0x00);
    clr_SPIF;
    SS_PIN = 1;   
}
//-----------------------------------------------------------------------------------------------------------
void Flash_Read_Status(void)
{
    UINT8 u8Status;

    SS_PIN = 0;
    do{
        SPDR = READ_STATUS1;
        while((SPSR&0x80)==0x00);
        clr_SPIF;
   
        SPDR = 0xFF;
        while((SPSR&0x80)==0x00);
        u8Status = SPDR;
        clr_SPIF;
    }while((u8Status&0x01)==0x01);
    SS_PIN = 1;   
}
//-----------------------------------------------------------------------------------------------------------
void Flash_Erase_Verify(void)
{
    UINT16 u16CNT;   
    UINT8  u8Data;

    SS_PIN = 0;

    SPDR = READ_DATA;
    while((SPSR&0x80)==0x00);
    clr_SPIF;

    /* 24-bit Address */
    SPDR = 0x00;
    while((SPSR&0x80)==0x00);
    clr_SPIF;

    SPDR = 0x00;
    while((SPSR&0x80)==0x00);
    clr_SPIF;

    SPDR = 0x00;
    while((SPSR&0x80)==0x00);
    clr_SPIF;

    for(u16CNT=0;u16CNT<256;u16CNT++)
    {
        SPDR = 0x00;
        while((SPSR&0x80)==0x00);
        u8Data = SPDR;
        clr_SPIF;
        if(u8Data != 0xFF)
        {
            SPI_Error();
        }
    }

    SS_PIN = 1;
}
//-----------------------------------------------------------------------------------------------------------
void Flash_Program(void)
{
    UINT16 u16CNT;
   
    SS_PIN = 0;

    SPDR = PAGE_PROGRAM;
    while((SPSR&0x80)==0x00);
    clr_SPIF;

    /* 24-bit Address */
    SPDR = 0x00;
    while((SPSR&0x80)==0x00);
    clr_SPIF;

    SPDR = 0x00;
    while((SPSR&0x80)==0x00);
    clr_SPIF;

    SPDR = 0x00;
    while((SPSR&0x80)==0x00);
    clr_SPIF;

    /* Send the data to SPI_Flash buffer */
    for(u16CNT=0;u16CNT<256;u16CNT++)
    {
        SPDR = (UINT8)u16CNT;
        while((SPSR&0x80)==0x00);
        clr_SPIF;
    }
   
    SS_PIN = 1;   
}
//-----------------------------------------------------------------------------------------------------------
void Flash_Program_Verify(void)
{
    UINT16 u16CNT;   
    UINT8  u8Data;

    SS_PIN = 0;

    SPDR = READ_DATA;
    while((SPSR&0x80)==0x00);
    clr_SPIF;

    /* 24-bit Address */
    SPDR = 0x00;
    while((SPSR&0x80)==0x00);
    clr_SPIF;

    SPDR = 0x00;
    while((SPSR&0x80)==0x00);
    clr_SPIF;

    SPDR = 0x00;
    while((SPSR&0x80)==0x00);
    clr_SPIF;

    for(u16CNT=0;u16CNT<256;u16CNT++)
    {
        SPDR = 0x00;
        while((SPSR&0x80)==0x00);
        u8Data = SPDR;
        clr_SPIF;
        if(u8Data != (UINT8)u16CNT)
        {
            SPI_Error();
        }
    }

    SS_PIN = 1;
}
//-----------------------------------------------------------------------------------------------------------
void main(void)
{      
    UINT8 u8MID,u8DID;

    /* Note
       MCU power on system clock is HIRC (22.1184MHz), so Fsys = 22.1184MHz
    */
   
    Set_All_GPIO_Quasi_Mode;
    InitialUART0_Timer3(115200);             /* 9600 Baud Rate*/
    SPI_Initial();

    Read_MID_DID(&u8MID,&u8DID);

    if((u8MID != 0xEF)&&(u8DID != 0x14))
    {
        SPI_Error();
    }

    /* The procedure of SPI Flash at erase mode */
    Flash_Write_Enable();
    Flash_Chip_Erase();
    Flash_Read_Status();
    Flash_Write_Disable();
   
    Flash_Erase_Verify();

    /* The procedure of SPI Flash at program mode */
    Flash_Write_Enable();
    Flash_Program();
    Flash_Read_Status();
    Flash_Write_Disable();

    /* Program verify */
    Flash_Program_Verify();

    printf("\nFinished the SPI Demo Code and test pass!!!\n");
    while(1);
}
//-----------------------------------------------------------------------------------------------------------


使用特权

评论回复
沙发
小灵通2018|  楼主 | 2019-5-13 22:15 | 只看该作者
如果有需要,就参考这个例子做就行了。

使用特权

评论回复
板凳
xinpian101| | 2019-5-14 22:05 | 只看该作者
Flash操作还不多,我都是用内部flash弄。

使用特权

评论回复
地板
xuanhuanzi| | 2019-5-14 22:28 | 只看该作者
例子通俗易懂,多谢。

使用特权

评论回复
5
zhuomuniao110| | 2019-5-15 00:22 | 只看该作者
寄存器操作,手册要熟练。

使用特权

评论回复
6
捉虫天师| | 2019-5-15 00:32 | 只看该作者
这个芯片很火。

使用特权

评论回复
7
643757107| | 2019-5-15 20:01 | 只看该作者
早就会的了。

使用特权

评论回复
8
antusheng| | 2019-5-15 21:59 | 只看该作者
这是用的SPI接口的Flash,应该也可以操作其他的东西吧

使用特权

评论回复
9
zhuotuzi| | 2019-5-18 00:26 | 只看该作者
新唐的003端口真全面。

使用特权

评论回复
10
643757107| | 2019-5-18 00:30 | 只看该作者
这个函数可以直接拿走用的。

使用特权

评论回复
11
幸福小强| | 2019-5-18 16:53 | 只看该作者
宏定义的妙用。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

116

主题

1442

帖子

4

粉丝