|
- #include "all.h"
- uchar xdata W25X16_Write_Buffer[256];//寫入的數(shù)據(jù)
- uchar xdata W25X16_Read_Buffer[256];//讀出的數(shù)據(jù)
- ////發(fā)送數(shù)據(jù)
- //uchar SPI_Flash_Send_Byte(uchar dat)
- //{
- // while(!(SPI_DIO&0x02));//等待發(fā)送緩沖區(qū)為空//SPI_SR=TXE位
- // Flash_DO=dat;//將發(fā)送的數(shù)據(jù)送到數(shù)據(jù)寄存器
- // while(!(SPI_DIO&0x01));//等待接收緩沖區(qū)非空//SPI_SR=RXNE位
- // return SPI_DR;
- //}
- //向W25X16發(fā)送一個字節(jié)
- void SPI_Flash_Send_Reg(uchar dat)
- {
- uchar idata i;
- _nop_();
- _nop_();
- Flash_SCLK=1;
- _nop_();
- _nop_();
- for(i=0;i<8;i++)
- {
- Flash_SCLK=0;
- _nop_();
- _nop_();
- Flash_DIO=(bit)(dat&0x80);//先傳送高位
- _nop_();
- _nop_();
- Flash_SCLK=1;//上升沿輸入數(shù)據(jù)
- _nop_();
- _nop_();
- dat<<=1;
- }
- }
- //向W25X16讀一個字節(jié)
- uchar SPI_Flash_Read_Data()
- {
- uchar idata i;
- uchar idata dat;
- _nop_();
- _nop_();
- Flash_SCLK=1;
- // _NOP_();
- // _NOP_();
- for(i=0,dat=0;i<8;i++)
- {
- Flash_SCLK=0;
- _nop_();
- _nop_();
- dat<<=1;//高位
- if(Flash_DO)//如果高位為1
- dat|=0x01;
- Flash_SCLK=1;//一個上升沿讀一次
- _nop_();
- _nop_();
- }
- return dat;
- }
- //1、寫使能
- void SPI_Flash_Write_Enable()
- {
- Flash_CS=0;//拉低選中芯片
- SPI_Flash_Send_Reg(0x06);//
- Flash_CS=1;//拉高不選中芯片
- }
- ////2.寫禁止指令
- //void SPI_Flash_Write_Forbid()
- //{
- // Flash_CS=0;//拉低選中芯片
- // SPI_Flash_Send_Reg(0x04);//
- // Flash_CS=1;//拉高不選中芯片
- //}
- //3.讀狀態(tài)寄存器//測試擦除是否完成
- void SPI_Flash_Read_Status()
- {
- uchar Flash_statue=0;//狀態(tài)寄存器值變量
- Flash_CS=0;//拉低選中芯片
- SPI_Flash_Send_Reg(0x05);//
- do
- {
- //Flash_statue=SPI_Send_byte(0xff);//
- Flash_statue=SPI_Flash_Read_Data();//
- }
- while(Flash_statue&0x01);//等待芯片非忙綠狀態(tài)
- Flash_CS=1; //拉高不選中芯片
-
-
- }
- ////4.寫狀態(tài)寄存器指令
- //void SPI_Flash_Write_Status()
- //{
- // Flash_CS=0;//拉低選中芯片
- // SPI_Flash_Write_Enable();//使能
- // SPI_Flash_Send_Reg(0x01);//
- // SPI_Flash_Send_Reg(0x00);//寫入狀態(tài)的數(shù)據(jù)
- // //通過寫入的狀態(tài)的值可以把芯片的部分或全部設(shè)置成只讀
- // //
- // Flash_CS=1;//拉高不選中芯片
- //}
- //5.讀數(shù)據(jù)指令
- void SPI_Flash_Read_Byte(uchar *pBuffer,ulong ReadAddr,uint NumRead)
- {
- Flash_CS=0;//拉低選中芯片
- SPI_Flash_Send_Reg(0x03);//
- //24位地址
- SPI_Flash_Send_Reg((ReadAddr&0xff0000)>>16);//先發(fā)送高8位
- SPI_Flash_Send_Reg((ReadAddr&0xff00)>>8);//再發(fā)送中間8位
- SPI_Flash_Send_Reg(ReadAddr&0xff);//低8位
-
- while(NumRead--)
- {
- *pBuffer=SPI_Flash_Read_Data();//讀一個字節(jié)的數(shù)據(jù)
- pBuffer++;//指向下一個要讀取的地址
- }
-
- Flash_CS=1;//拉高不選中芯片
- }
- ////6.快速讀數(shù)據(jù)指令
- //void SPI_Flash_Fast_Read_Data(uchar *pBuffer,ulong *ReadAddr,uint NumRead)
- //{
- // Flash_CS=0;//拉低選中芯片
- // SPI_Flash_Send_Reg(0x0B);//
- //
- // SPI_Flash_Send_Reg((ReadAddr&0xff0000)>>16);先發(fā)送高8位
- // SPI_Flash_Send_Reg((ReadAddr&0xff00)>>8);再發(fā)送中間8位
- // SPI_Flash_Send_Reg(ReadAddr&0xff);低8位
- //
- // SPI_Flash_Send_Reg(0xff);//等待8個時鐘
- //
- // while(NumRead--)
- // {
- // *pBuffer=SPI_Flash_Read_Data();//讀一個字節(jié)的數(shù)據(jù)
- // pBuffer++;//指向下一個要讀取的地址
- // }
- //
- // Flash_CS=1;//拉高不選中芯片
- //}
- ////7.快速讀雙輸出數(shù)據(jù)指令
- ////雙讀數(shù)據(jù)的讀取函數(shù)
- //uchar SPI_Flash_Fast_Read_Data()
- //{
- // uchar idata i;
- // uchar idata dat=0;
- //
- // //雙讀
- // for(i=0;i<4;i++)
- // {
- // //讀取DO 的數(shù)據(jù)
- // Flash_SCLK=1;
- // _NOP_();
- // _NOP_();
- // dat<<=1;//高位
- // if(Flash_DO)//如果高位為1
- // dat|=0x01;
- // Flash_SCLK=0;//下降沿
- // _NOP_();
- // _NOP_();
- // //讀取DIO的數(shù)據(jù)
- // dat<<=1;//高位
- // if(Flash_DIO)//如果高位為1
- // dat|=0x01;
- // Flash_SCLK=1;//上升沿
- // _NOP_();
- // _NOP_();
- // }
- //}
- //void SPI_Flash_Fast_Two_Read_Data(uchar *pBuffer,ulong *ReadAddr,uint NumRead)
- //{
- // Flash_CS=0;//拉低選中芯片
- // SPI_Flash_Send_Reg(0x3B);//
- //
- // SPI_Flash_Send_Reg((ReadAddr&0xff0000)>>16);先發(fā)送高8位
- // SPI_Flash_Send_Reg((ReadAddr&0xff00)>>8);再發(fā)送中間8位
- // SPI_Flash_Send_Reg(ReadAddr&0xff);低8位
- //
- // SPI_Flash_Send_Reg(0xff);//等待8個時鐘
- // while(NumRead--)
- // {
- // *pBuffer=SPI_Flash_Fast_Read_Data();//讀一個字節(jié)的數(shù)據(jù)
- // pBuffer++;//指向下一個要讀取的地址
- // }
- //
- // Flash_CS=1;//拉高不選中芯片
- //}
- //8.頁編程指令
- void SPI_Flash_Write_Page(uchar *pBuffer,ulong WriteAddr,uint NumWrite)
- {
- SPI_Flash_Write_Enable();//先使能對芯片的操作
- Flash_CS=0;//拉低選中芯片
- SPI_Flash_Send_Reg(0x02);//
-
- SPI_Flash_Send_Reg((WriteAddr&0xff0000)>>16);//先發(fā)送高8位
- SPI_Flash_Send_Reg((WriteAddr&0xff00)>>8);//再發(fā)送中間8位
- SPI_Flash_Send_Reg(WriteAddr&0xff);//低8位
-
- while(NumWrite--)
- {
- SPI_Flash_Send_Reg(*pBuffer);//發(fā)送欲寫入flash的數(shù)據(jù)
- pBuffer++;//指向下一個要寫入的地址
- }
- Flash_CS=1;//拉高不選中芯片
- SPI_Flash_Read_Status();//等待寫操作結(jié)束
- }
- ////頁地址不對齊
- //void SPI_Flash_Write_Addr(uchar *pBuffer,ulong WriteAddr,uint NumWrite)
- //{
- // uchar Numofpage=0,Numofsingle=0,addr=0,count=0,time=0;//剩下的
- // addr=WriteAddr%256;//判斷要寫入的地址是否頁對齊
- // count=256-addr;//剩下的地址
- // Numofpage=NumWrite/256;//一共寫多少整頁
- // Numofsingle=NumWrite%256;//還剩多少字節(jié)
- //
- // if(addr==0)//判斷寫入的地址是否頁對齊
- // {
- // if(Numofpage===0)//如果只需寫一頁
- // {
- // SPI_Flash_Write_Page(pBuffer,WriteAddr,NumWrite);
- // }
- // else//不止寫一頁
- // {
- // while(Numofpage--)
- // {
- // SPI_Flash_Write_Page(pBuffer,WriteAddr,256);
- // WriteAddr+=256;//換下一頁
- // pBuffer+=256;
- // }
- // SPI_Flash_Write_Page(pBuffer,WriteAddr,Numofsingle);//把剩下的字節(jié)寫完
- // }
- // else //要寫入的地址不是頁對齊的地址
- // {
- // if(Numofpage==0)//只需要寫一頁
- // {
- // if(count<Numofsingle)//判斷要剩下的地址如果不夠?qū)懽止?jié)
- // {
- // temp=Numofsingle-count;//還剩下的字節(jié)
- // SPI_Flash_Write_Page(pBuffer,WriteAddr,count);//寫滿一頁
- // WriteAddr+=count;//換下一頁
- // pBuffer+=count;
- // SPI_Flash_Write_Page(pBuffer,WriteAddr,temp);//往新的一頁里寫剩下的數(shù)據(jù)
- // }
- // else//剩下的地址夠?qū)懽止?jié)
- // {
- // SPI_Flash_Write_Page(pBuffer,WriteAddr,NumWrite);
- // }
- // }
- // else//不止寫一頁
- // {
- // NumWrite-=count;//先把空的地址填滿之后還剩的字節(jié)
- // Numofpage=NumWrite/256;//總共還要寫多少頁
- // Numofsingle=NumWrite%256;//還剩下的字節(jié)數(shù)
- // SPI_Flash_Write_Page(pBuffer,WriteAddr,count);//把空的地址填滿
- // WriteAddr+=count;//換下一頁
- // pBuffer+=count;
- // while(Numofpage--)//整頁
- // {
- // SPI_Flash_Write_Page(pBuffer,WriteAddr,256);
- // WriteAddr+=256;//換下一頁
- // pBuffer+=256;
- // }
- // if(Numofsingle!=0)
- // {
- // SPI_Flash_Write_Page(pBuffer,WriteAddr,Numofsingle);//把剩下的寫完
- // }
- // }
- // }
- // }
- //}
- ////9.塊擦除指令(64KB)256頁
- //void SPI_Flash_Block_Erase(ulong BlockAddr)
- //{
- // SPI_Flash_Write_Enable();//寫使能
- // Flash_CS=0;//拉低選中芯片
- // SPI_Flash_Send_Reg(0xD8);//
- //
- // SPI_Flash_Send_Reg((BlockAddr&0xff0000)>>16);先發(fā)送高8位
- // SPI_Flash_Send_Reg((BlockAddr&0xff00)>>8);再發(fā)送中間8位
- // SPI_Flash_Send_Reg(BlockAddr&0xff);低8位
- //
- // Flash_CS=1;//拉高不選中芯片
- // SPI_Flash_Read_Status();//等待塊清除操作完成
- //}
- //10.扇區(qū)擦除(4KB)16頁
- void SPI_Flash_Section_Erase(ulong SectionAddr)
- {
- SPI_Flash_Write_Enable();//寫使能
- Flash_CS=0;//拉低選中芯片
- SPI_Flash_Send_Reg(0x20);//
-
- SPI_Flash_Send_Reg((SectionAddr&0xff0000)>>16);//先發(fā)送高8位
- SPI_Flash_Send_Reg((SectionAddr&0xff00)>>8);//再發(fā)送中間8位
- SPI_Flash_Send_Reg(SectionAddr&0xff);//低8位
-
- Flash_CS=1;//拉高不選中芯片
- SPI_Flash_Read_Status();//等待扇區(qū)操作完成
- }
- ////11.芯片擦除指令
- //void SPI_Flash_Chip_Erase()
- //{
- // SPI_Flash_Write_Enable();//寫使能
- // Flash_CS=0;//拉低選中芯片
- // SPI_Flash_Send_Reg(0xc7);//
- // Flash_CS=1;//拉高不選中芯片
- // SPI_Flash_Read_Status();//等待塊清除操作完成
- //}
- ////12.芯片掉電命令
- //void SPI_Flash_Power-Fail()
- //{
- // Flash_CS=0;//拉低選中芯片
- // SPI_Flash_Send_Reg(0xB9);//
- // Flash_CS=1;//拉高不選中芯片
- // SPI_Flash_Read_Status();//等待塊清除操作完成
- //}
- //13.芯片掉電釋放/器件ID命令
- //14.芯片制造商/器件ID命令
- ////15.JEDEC ID序列指令
- //ulong SPI_Flash_Read_ID()
- //{
- // ulong temp=0,temp1=0,temp2=0,temp3=0;//Flash暫存變量
- // Flash_CS=0;//拉低選中芯片
- // SPI_Flash_Send_Reg(0x9F);//
- // SPI_Flash_Send_Reg(0xff);
- // temp1=SPI_Flash_Read_Data();//從flash讀取第一個字節(jié)數(shù)據(jù)
- // SPI_Flash_Send_Reg(0xff);
- // temp2=SPI_Flash_Read_Data();//從flash讀取第一個字節(jié)數(shù)據(jù)
- // SPI_Flash_Send_Reg(0xff);
- // temp3=SPI_Flash_Read_Data();//從flash讀取第一個字節(jié)數(shù)據(jù)
- // Flash_CS=1;//拉高不選中芯片
- // temp=(((temp1<<16)|temp2<<8)|temp3);//拼合數(shù)據(jù)組成ID序列
- // return temp;//返回序列號
- //}
復(fù)制代碼
本人大二新生,暑假期間寫了一點點基本程序,開發(fā)版是STC8A8K的,我在初學(xué)期間發(fā)現(xiàn)在這個板子的資料比較少,學(xué)習(xí)起來不太方便。以下程序本人都親自測試過,有個別沒有搞明白的,本人也都做了標記,希望能給初學(xué)者一點幫助,另外歡迎大佬糾正錯誤,完善程序。
|
-
TIM圖片20190825201502.png
(40.74 KB, 下載次數(shù): 65)
下載附件
2019-8-25 20:17 上傳
-
TIM圖片20190825201526.png
(56.96 KB, 下載次數(shù): 62)
下載附件
2019-8-25 20:17 上傳
-
-
STC8A8K原理圖.pdf
2019-8-25 20:18 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
258.34 KB, 下載次數(shù): 63, 下載積分: 黑幣 -5
原理圖
-
-
STC8手冊-20180507.pdf
2019-8-25 20:18 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
8.21 MB, 下載次數(shù): 43, 下載積分: 黑幣 -5
數(shù)據(jù)手冊
-
-
stc8a8k單個程序.zip
2019-8-25 20:18 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
1.01 MB, 下載次數(shù): 176, 下載積分: 黑幣 -5
單個程序
-
-
stc8a8k.zip
2019-8-25 20:19 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
98.75 KB, 下載次數(shù): 125, 下載積分: 黑幣 -5
一個工程多個文件
|