flash.c

来自「读取FLASH的厂商ID和芯片ID-读取FLASH的厂商ID和芯片ID」· C语言 代码 · 共 101 行

C
101
字号
#include "PublHead.h"

#define ADDRESS(addr)               (volatile U16 *)(FLASH_ADDR|(addr))

/*
函数    读取FLASH的厂商ID和芯片ID
*/
extern Ulong ReadFlashID(void)
{
    volatile U16 * ptr;
    UNION32 Id;

    // 进入产商ID模式
    ptr = ADDRESS(0x5555<<1);
    *ptr = 0xaa;
    ptr = ADDRESS(0x2aaa<<1);
    *ptr = 0x55;
    ptr = ADDRESS(0x5555<<1);
    *ptr = 0x90;
    // 读取产商ID
    ptr = ADDRESS(0<<1);
    Id.i[1] = *ptr;
    ptr = ADDRESS(1<<1);
    Id.i[0] = *ptr;
    // 退出产商ID模式
    *ptr = 0xf0;
    return(Id.l);
}

extern Boolean FlashErase(Ulong addr,Uint SecOrBlk)
{
    volatile U16 * ptr;

#ifdef PC_PLATFORM
       return Pc_FlashErase(addr,SecOrBlk);
#endif


    ptr = ADDRESS(0x5555<<1);
    *ptr = 0xaa;
    ptr = ADDRESS(0x2aaa<<1);
    *ptr = 0x55;
    ptr = ADDRESS(0x5555<<1);
    *ptr = 0x80;
    ptr = ADDRESS(0x5555<<1);
    *ptr = 0xaa;
    ptr = ADDRESS(0x2aaa<<1);
    *ptr = 0x55;
    ptr = ADDRESS(addr);
    *ptr = SecOrBlk;
    while(1)
    {
        Uint temp1,temp2;

        temp1 = *ptr;
        temp2 = *ptr;
        if(temp1 == temp2)
        {
            if(temp1 != 0xffff)
            {
                return(FALSE);
            }
            else
            {
                return(TRUE);
            }
        }
    }
}

extern void FlashWriteOneWord(Ulong addr,Uint dt)
{
    volatile U16 * ptr;

    // 写入一个字节
    ptr = ADDRESS(0x5555<<1);       // 自动写入时序
    *ptr = 0xaa;
    ptr = ADDRESS(0x2aaa<<1);
    *ptr = 0x55;
    ptr = ADDRESS(0x5555<<1);
    *ptr = 0xa0;
    ptr = ADDRESS(addr);
    *ptr = dt;               // 写入数据
    while(1)                        // 等待写入完成
    {
        Uint temp1,temp2;

        temp1 = *ptr;
        temp2 = *ptr;
        if(temp1 == temp2)
        {
            temp1 = *ptr;
            temp2 = *ptr;
            if(temp1 == temp2)
            {
                break;
            }
        }
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?