|
51單片機(jī)讀寫25X16程序,簡單昨懂
全部源碼下載:
51讀寫W25X16程序.rar
(45.03 KB, 下載次數(shù): 54)
2016-11-17 14:00 上傳
點擊文件名下載附件
預(yù)覽:
- #include <intrins.h> //包含位移和_nop_();
- #include "STC12C5A60S2.H"
- //***************************************************************
- void WriteDisable (void); //寫禁止
- void WriteEnable (void); //寫允許
- unsigned char W25X_BUSY_OrNot (void); //判忙碌
- void W25X_ChipErase(void); //片擦除
- void W25X_BlockErase(unsigned long Addre24);
- void W25X_SectorErase(unsigned long Addre24); //擦除資料圖示的4KB空間
- //讀數(shù)據(jù)可以無限次,這里是由緩沖決定的大小
- void W25X_Flash_Byte_Read (unsigned long Addre24,unsigned char Quantity);//多字節(jié)讀FLASH(1~256) -W25X32-000000-3FFF00(4M)-
- void W25X_Flash_Byte_Write(unsigned long Addre24,unsigned char Quantity); //往FLASH里寫一個或多個字節(jié)(小于256字節(jié))
- unsigned char Read_OneByte(void); //從SPI收8位數(shù)
- void Send_OneByte(unsigned char DATA8);
- void InitSerial(void); //串行口初始化.通信速率9600bps 在22.1184MHz晶振頻率
- void Delay100ms(unsigned int _100ms); //100ms級延時
- //進(jìn)度: 發(fā)一個指令OK 寫允許OK 讀狀態(tài)OK 讀寫一個字節(jié)OK
- unsigned char xdata Send_DATA[256]; //要發(fā)送的數(shù)據(jù)
- unsigned char xdata Recv_DATA[256]; //已接收的數(shù)據(jù), 如2個數(shù),則為Recv_DATA[0] Recv_DATA[1]
- unsigned char * Send_Pionter;
- unsigned char * Recv_Pionter;
- void main()
- {
- unsigned char BUSY; //判忙碌
- unsigned long Addre24; //24位的Flash地址
- unsigned char x=0;
- unsigned char A;
- unsigned char B;
- unsigned char C;
- unsigned long D;
- //************************
- A=0; B=0; C=0; D=0;
- Delay100ms(2);
- if(x)
- {
- WriteDisable (); //寫禁止
- W25X_ChipErase(); //片擦除
- W25X_SectorErase(Addre24); //4K擦除
- W25X_BlockErase (Addre24); //64K塊擦除
- BUSY=W25X_BUSY_OrNot(); //判忙碌
- W25X_Flash_Byte_Read (Addre24,21); //讀FLASH
- W25X_Flash_Byte_Write(Addre24,21); //寫入
- }
- //*************************
- P1M0=0xB0;
- InitSerial(); //串行口初始化.通信速率9600bps 在22.1184MHz晶振頻率
- Send_Pionter = &Send_DATA[0]; //發(fā)送指針取地址
- Recv_Pionter = &Recv_DATA[0]; //接收指針取地址
- for (D=0;D<256;D++)
- {
- Send_DATA[D]=D;
- Recv_DATA[D]=0;
- }
- W25X_SectorErase(Addre24); Delay100ms (4); //4K擦除
-
- //**************************
-
- W25X_Flash_Byte_Write(0x000000,255); //寫N個數(shù)
- W25X_Flash_Byte_Read (0x000000,255); //讀X個數(shù)
-
- while(1)
- {
- SBUF =A;
- while(TI==0);
- TI=0;
- SBUF =Recv_DATA[A] ;
- while(TI==0);
- TI=0;
- Delay100ms(1);
- A++;
- }
- } // End of Main
- //*******************END of Main****************************
- // ----W25X系統(tǒng)Flash讀寫---SUNYA注----
- //sbit CS = P1^4; //選通
- //sbit DIO = P1^5; //單片機(jī)輸出
- //sbit DO = P1^6; //FLASH輸出
- //sbit SCLK = P1^7; //時鐘
- //讀寫SPI口模擬模式3,時鐘平時為高電平
- //#define W25X_ReadStatus 0x05 //讀狀態(tài)寄存器
- //#define W25X_WriteStatus 0x01 //寫狀態(tài)寄存器
- //#define W25X_ReadDATA8 0x03 //普讀_數(shù)據(jù)
- //#define W25X_FastRead 0x0B //快讀_數(shù)據(jù)
- //#define W25X_DualOutput 0x3B //快讀_雙輸出
- //#define W25X_Write 0x02 //寫_數(shù)據(jù)_0~255個字節(jié)
- //#define W25X_S_Erase 0x20 //扇區(qū)擦除4KB
- //#define W25X_B_Erase 0xD8 //塊區(qū)擦除64KB
- //#define W25X_C_Erase 0xC7 //整片格式化
- //#define W25X_PowerDown 0xB9 //待機(jī)
- //#define W25X_PowerON_ID 0xAB //開機(jī)或是讀ID
- //#define W25X_JEDEC_ID 0x9F //十六位的JEDEC_ID
- //#define W25X_WriteEnable 0x06 //寫充許
- //#define W25X_WriteDisable 0x04 //寫禁止
- //#define W25X_BUSY 0x01 //FLASH忙
- //#define W25X_NotBUSY 0x00 //FLASH閑 這是自定義的
- //***************判BUSY********************************
- unsigned char W25X_BUSY_OrNot (void) //在讀和寫之前得先判斷FLASH是否BUSY
- { //BUSY的原因是擦除,或是連續(xù)讀寫
- unsigned char k; //如果沒有以上方式,不必判定可以寫讀
- SCLK=1;
- _nop_();
- CS=0;
- Send_OneByte(W25X_ReadStatus); //讀狀態(tài)寄存器
- k=Read_OneByte(); //讀一個字節(jié)
- k=k&0x01;
- CS=1;_nop_();
- SCLK=1;
- if(k)return (W25X_BUSY);
- else return (W25X_NotBUSY);
- } //end of check BUSY
- //***********************************************
- void W25X_Flash_Byte_Write(unsigned long Addre24,unsigned char Quantity) //往FLASH里寫一個或多個字節(jié)(小于255)
- { //連續(xù)寫的時候,地址最后八位必須從00開始寫 *如果256個字節(jié)都讀滿或?qū)憹M,三字節(jié)地址最后一個字節(jié)必須為0*
- unsigned char Addre3; //否則當(dāng)?shù)刂吩竭^分面時,會從本頁的00從新開始,造成錯寫
- unsigned char Addre2; //^^現(xiàn)在本函數(shù)沒啟用連寫連讀
- unsigned char Addre1;
- unsigned char J; //計字節(jié)數(shù)
- unsigned char x;
- while(W25X_BUSY_OrNot ()); //判BUSY 等到Flash閑才能操作
- WriteEnable(); //寫允許
- SCLK=1;
- Addre1=Addre24;
- Addre24=Addre24>>8;
- Addre2=Addre24;
- Addre24=Addre24>>8;
- Addre3=Addre24; //把地址拆開來
-
- CS=0;
- Send_OneByte(W25X_Write); //命令
- Send_OneByte(Addre3);
- Send_OneByte(Addre2);
- Send_OneByte(Addre1);
- for (J=0;J<Quantity;J++)
- {
- Send_OneByte(Send_DATA[J]); //寫字節(jié)
- }
- CS=1;
- _nop_();_nop_();
- SCLK=1;
- for(x=0;x<200;x++) //延時一點點
- {
- _nop_();_nop_();
- }
- Addre24=0; //地址清0
- } //寫FLASH結(jié)束
- //***********************************************
- void W25X_Flash_Byte_Read (unsigned long Addre24,unsigned char Quantity) //從Flash里讀出小于256字節(jié)數(shù)
- {
- unsigned char xdata DATA8[256]; //要返回的字節(jié)
- unsigned char * DATA; //定義一個指針
- unsigned char J; //計字節(jié)數(shù)
- unsigned char Addre3;
- unsigned char Addre2;
- unsigned char Addre1;
-
- while(W25X_BUSY_OrNot ()); //判BUSY
- DATA=&DATA8[0]; //指針指向DATA8[256]
- Addre1=Addre24;
- Addre24=Addre24>>8;
- Addre2=Addre24;
- Addre24=Addre24>>8;
- Addre3=Addre24; //把地址拆開來
-
- CS=0;
- Send_OneByte(W25X_ReadDATA8);//命令讀
- Send_OneByte(Addre3);
- Send_OneByte(Addre2);
- Send_OneByte(Addre1);
- for (J=0;J<Quantity;J++)
- {
- Recv_DATA[J]=Read_OneByte(); //讀一個字節(jié)
- }
- CS=1;
- _nop_();_nop_();
- SCLK=1;
- _nop_();_nop_();
- Addre24=0; //地址清0
- } //讀FLASH結(jié)束
- //*********************************************** OK
- void Send_OneByte(unsigned char DATA8) //從SPI發(fā)8位數(shù)
- { //上升沿寫入
- unsigned char x;
-
- for (x=0;x<8;x++)
- {
- SCLK=0;
- if(DATA8&0x80)DIO=1;
- else DIO=0;
- SCLK=1;
- DATA8=DATA8<<1;
- }
- //發(fā)完后SCLK為1
- } //end of Send_OneByte
- //*********************************************** OK
- unsigned char Read_OneByte(void) //從SPI收8位數(shù)
- { //下降沿輸出
- unsigned char DATA8;
- unsigned char x;
- SCLK=1;
- DATA8=0x00;
- for (x=0;x<8;x++)
- {
- _nop_();
- SCLK=0;
- DATA8=DATA8<<1;
- if(DO)DATA8=DATA8|0x01;
- SCLK=1;
- }
- return (DATA8);
- //完成后SCLK=1
- }//end of Read_OneByte
- //**************片擦除 (MAX_80S)****************** OK
- void W25X_ChipErase(void)
- {
- //BUSY ?
- WriteEnable(); //寫允許
- SCLK=1;
- CS=0;
- Send_OneByte(W25X_C_Erase);//整片擦除命令
- CS=1; //從CS=1時開始執(zhí)行擦除
- SCLK=1;
- }
- //*************** 4K扇擦除************************ OK
- void W25X_SectorErase(unsigned long Addre24) //擦除資料圖示的4KB空間
- {
- //判BUSY或許放這里
- unsigned char Addre3;
- unsigned char Addre2;
- unsigned char Addre1;
- WriteEnable(); //寫允許
- Addre1=Addre24;
- Addre24=Addre24>>8;
- Addre2=Addre24;
- Addre24=Addre24>>8;
- Addre3=Addre24; //把地址拆開來
- SCLK=1;
- CS=0;
- Send_OneByte(W25X_S_Erase);//整扇擦除命令
- Send_OneByte(Addre3);
- Send_OneByte(Addre2);
- Send_OneByte(Addre1);
- CS=1;
- _nop_();
- SCLK=1;
- _nop_();_nop_();
- Addre24=0; //地址清0
- }
- //*************** 64K頁/塊擦除************************* OK
- void W25X_BlockErase(unsigned long Addre24) //擦除資料圖示的64KB空間
- {
- //判BUSY或許放這里
- unsigned char Addre3;
- unsigned char Addre2;
- unsigned char Addre1;
- WriteEnable(); //寫允許
- Addre1=Addre24;
- Addre24=Addre24>>8;
- Addre2=Addre24;
- Addre24=Addre24>>8;
- Addre3=Addre24; //把地址拆開來
- SCLK=1;
- CS=0;
- Send_OneByte(W25X_B_Erase);//整扇擦除命令
- Send_OneByte(Addre3);
- Send_OneByte(Addre2);
- Send_OneByte(Addre1);
- CS=1;
- _nop_();_nop_();
- SCLK=1;
- _nop_();_nop_();
- Addre24=0; //地址清0
- }
- //*************** 寫允許 **************************** OK
- void WriteEnable (void)
- {
- SCLK=1;
- CS=0;
- Send_OneByte(W25X_WriteEnable);
- CS=1;
- SCLK=1;
- }
- //*************** 寫禁止 **************************** OK
- void WriteDisable (void)
- {
- SCLK=1;
- CS=0;
- Send_OneByte(W25X_WriteDisable);
- CS=1;
- SCLK=1;
- }
- //******************************************************** OK
- void Delay100ms(unsigned int _100ms) //100ms級延時
- {
- unsigned char n,i,ms,loop;
- for(loop=12;loop>0;loop--) //STC12C5412AD為快速單片機(jī),此100ms延時要快6倍
- { ms=_100ms; //晶體為11.0592MHz
- for(;ms>0;ms--)
- for(n=145;n>0;n--)
- for(i=251;i>0;i--)_nop_();
- }
- }
- //***************************************//串行口初始化 OK
- void InitSerial(void) //串行口初始化.通信速率9600bps 在22.1184MHz晶振頻率
- {
- SCON = 0x50;
- BRT = 250;
- AUXR = 0x11; //使用獨立波特率發(fā)生器
- AUXR1= 0x80;
- ES=1;
- EA=1;
- /*
- TR1=0;
- ET1=0; //定時器1禁止中斷
- TMOD=TMOD&0xCF;
- TMOD=TMOD|0x20; //通信方式2
- TH1=0xFF; //波特率:bps
- TL1=0xFF; //1位起始位,8位數(shù)據(jù)位,2位停止位,無校驗
- SCON=0xD8;
- PCON=0x80;
- TR1=1; //開啟定時
- ES=1;
- */
- //IE=IE|0x90; //開中斷,允許串口中斷
- }
- //***************************************************************
復(fù)制代碼
|
評分
-
查看全部評分
|