?? flash.#1
字號:
//頭文件
/////////////////////////////
#include "c8051F320.h"
#include "stdio.h"
////////////////////////////////////////////////////////////////////////////////////////////////////
//位定義
sbit FLASH_WP =P2^0; //命令鎖存
sbit FLASH_WE =P2^1; //地址鎖存
sbit FLASH_ALE =P2^2; //寫保護
sbit FLASH_CLE =P2^3; //片選
sbit FLASH_CE =P2^4; //寫使能
sbit FLASH_RE =P2^5; //讀使能
sbit FLASH_RB =P2^6; //忙指示
sbit FLASH_SE =P2^7;
//P1口為數據口
//注釋掉的函數在需要時可以取掉注釋即可
///////////////////////////////////////////////////////////////////////////////////////////////////
//FLASH函數聲明
void Flash_Init(void); //FLASH初始化
//unsigned int Get_Flash_ID(void); //讀FLASH的ID號
//unsigned char Get_Flash_Status(void); //讀FLASH的狀態
unsigned char Flash_Erase_Block(unsigned int BlockNum); //擦除FLASH中的第BlockNum個BLOCK,擦除成功則返回1
void Flash_Read_Page(unsigned int BLockNum,unsigned char BlockPageNum,unsigned char *P,unsigned int Data_Length);
//讀出第BlockNum個BLOCK中第BlockPageNum個PAGE中的內容,長度為Data_Length
unsigned char Flash_Write_Page(unsigned int BLockNum,unsigned char BlockPageNum,unsigned char *P,unsigned int Data_Length);
//意義同上
void Flash_Write_Command(unsigned char command); //寫命令
void Flash_Write_Address(unsigned char address); //寫地址
void Flash_Write_Data(unsigned char num); //寫一字節數據
unsigned char Flash_Read_Data(void); //讀一字節數據
//void Test_Flash(void); //FLASH測試函數,首先讀取FLASH的ID號,然后寫入512字節數據,再讀出來,判斷是否正確
extern void Time_Delay(unsigned int time);
////////////////////////////////////////////////////////////////////////////////////////////////////
void Flash_Init()
{
unsigned int i=0;
P1=0xff;
P2MDOUT=0xff;
FLASH_SE=0;FLASH_WP=1;FLASH_CE=0;FLASH_ALE=0;
FLASH_CLE=0;FLASH_WE=1;FLASH_RE=1;FLASH_RB=1; //控制位的初始狀態
Flash_Write_Command(0xff); //復位命令
Time_Delay(50); //延時50ms
}
/*
unsigned int Get_Flash_ID(void)
{
unsigned int id=0;
Flash_Write_Command(0x90); //讀ID命令
Flash_Write_Address(0x00); //地址
id=Flash_Read_Data(); //讀ID的高8位
id *=256;
id+=Flash_Read_Data(); //讀ID的低8位
return(id);
}
*/
/*
unsigned char Get_Flash_Status()
{
unsigned char status=0;
Flash_Write_Command(0x70);
status=Flash_Read_Data();
return(status);
}*/
unsigned char Flash_Erase_Block(unsigned int BlockNum)
{
unsigned char Address_M=0,Address_H=0;
unsigned int PageNum=0;
unsigned char status=0;
PageNum=BlockNum*32; //計算PAGE地址(這是該BLOCK中的第一個PAGE),每個BLOCK含32個PAGE
Address_M=PageNum & 0xff;
Address_H=(PageNum>>8) & 0xff; //擦除BLOCK時,只需要輸入地址的高兩字節,此處為計算地址的高兩字節
Flash_Write_Command(0x60); //發送擦除命令
Flash_Write_Address(Address_M);
Flash_Write_Address(Address_H); //發送地址
Flash_Write_Command(0xd0); //啟動擦除
P2MDOUT =0xbf;
FLASH_RB=1; //FLASH_RB漏極開路輸出
while(!FLASH_RB) //判斷是否擦除完畢
{}
Flash_Write_Command(0x70); //發送讀狀態命令
status=Flash_Read_Data(); //讀狀態
if(status & 0x01) //如果有錯誤,則返回false
{
return(0);
}
else //否則返回true
{
return(1);
}
}
void Flash_Read_Page(unsigned int BLockNum,unsigned char BlockPageNum,unsigned char *P,unsigned int Data_Length)
{
unsigned int i=0;
unsigned int PageNum=0;
unsigned char Address_L=0,Address_M=0,Address_H=0;
PageNum=BLockNum*32+BlockPageNum; //計算該PAGE在整個FLASH中的PAGE地址
Address_L=0;
Address_M=PageNum & 0xff;
Address_H=(PageNum>>8) & 0xff;
Flash_Write_Command(0x00); //將內部指針指向A區
Flash_Write_Address(Address_L); //寫地址
Flash_Write_Address(Address_M);
Flash_Write_Address(Address_H);
for(i=0;i<Data_Length;i++)
{
*(P+i)=Flash_Read_Data(); //讀數據
}
}
unsigned char Flash_Write_Page(unsigned int BLockNum,unsigned char BlockPageNum,unsigned char *P,unsigned int Data_Length)
{
unsigned int i=0;
unsigned int PageNum=0;
unsigned char Address_L=0,Address_M=0,Address_H=0;
unsigned char status=0;
PageNum=BLockNum*32+BlockPageNum; //計算該PAGE在整個FLASH中的PAGE地址
Address_L=0;
Address_M=PageNum & 0xff;
Address_H=(PageNum>>8) & 0xff;
Flash_Write_Command(0x00); //將內部指針指向A區
Flash_Write_Command(0x80); //寫FLASH命令
Flash_Write_Address(Address_L); //寫地址
Flash_Write_Address(Address_M);
Flash_Write_Address(Address_H);
for(i=0;i<Data_Length;i++)
{
Flash_Write_Data(*(P+i)); //將數據寫入緩沖區
}
Flash_Write_Command(0x10); //啟動寫入,將數據從緩沖區寫入到FLASH
P2MDOUT =0xbf; //FLASH_RB漏極開路輸出
FLASH_RB=1;
while(!FLASH_RB) //判斷是否操作完畢
{}
Flash_Write_Command(0x70); //發送讀狀態命令
status=Flash_Read_Data(); //讀狀態
if(status & 0x01) //如果有錯誤,則返回false
{
return(0);
}
else //否則返回true
{
return(1);
}
}
void Flash_Write_Command(unsigned char command)
{
FLASH_ALE=0; //地址鎖存禁止
FLASH_CLE=1; //命令鎖存使能
FLASH_WE =0; //寫使能信號,上升沿有效
P1MDOUT =0xff; //設置P1為推挽輸出
P1=command;
FLASH_WE =1; //命令在上升沿寫入
FLASH_CLE=0; //命令鎖存禁止
FLASH_ALE=1;
}
void Flash_Write_Address(unsigned char address)
{
FLASH_WE=1;
FLASH_CLE=0; //命令鎖存禁止
FLASH_ALE=1; //地址鎖存使能
FLASH_WE =0; //寫使能信號,上升沿有效
P1MDOUT =0xff; //設置P1為推挽輸出
P1=address;
FLASH_WE =1; //上升沿寫入
FLASH_ALE=0; //地址鎖存禁止
}
void Flash_Write_Data(unsigned char num)
{
FLASH_WE=1;
FLASH_CLE=0; //命令鎖存禁止
FLASH_ALE=0; //地址鎖存禁止
FLASH_WE =0; //寫使能信號, 上升沿有效
P1MDOUT =0xff; //設置P1為推挽輸出
P1=num;
FLASH_WE =1; //命令在上升沿寫入
}
unsigned char Flash_Read_Data(void)
{
unsigned char num=0;
FLASH_CLE =0; //命令鎖存禁止
FLASH_ALE =0; //地址鎖存禁止
P1MDOUT =0x00; //設置P1為漏極開路輸出
P1 =0xff;
FLASH_RE =0; //讀信號使能
P2MDOUT =0xbf; //FLASH_RB漏極開路輸出
FLASH_RB=1;
while(!FLASH_RB) //判斷是否操作完畢
{}
num=P1;
FLASH_RE=1;
return(num);
}
/*
void Test_Flash()
{
unsigned int Flash_ID;
xdata unsigned char Buffer[512];
unsigned int i=0,dat=0;
Flash_ID=Get_Flash_ID();
printf("Flash_ID is %u\n",Flash_ID);
for(i=0;i<512;i++)
{Buffer[i]=i;}
for(i=0;i<256;i++)
{Buffer[256+i]=i;}
Flash_Write_Page(1,1,Buffer,512);
for(i=0;i<512;i++)
{Buffer[i]=0;}
Flash_Read_Page(1,1,Buffer,512);
for(i=0;i<512;i++)
{
dat=Buffer[i];
printf("the No.%u data is %u\n",i,dat);
}
}*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -