📄 cflash.cpp
字号:
//#define SMISPIMutexPro 11
#define CMDRead25MH 0x03
#define CMDRead50MH 0x0B
#define CMDErase4K 0x20
#define CMDErase32K 0x52
#define CMDErase64K 0xD8
#define CMDEraseAll 0x60
#define CMDByteProgram 0x02
#define CMDWordProgram 0xAD
#define CMDReadStatus 0x05
#define CMDEnWriteStatus 0x50
#define CMDWriteStatus 0x01
#define CMDWriteEnable 0x06
#define CMDWriteDisable 0x04
#include "class.h"
//#include "FlashCommand.h"
//CSMISPI CFlash:: spi(Flash_SO,Flash_SCK,Flash_CE1,Flash_SI);
CFlash::CFlash(INT8U Flashcs):spi(Flashcs)
{
}
void CFlash::Delay8us(void)
{ INT16U i;
INT8U temp;
for(i=0;i<500;i++)
{
temp=ReadStatus();
if((temp&0x01)==0x00) break;
}
}
/*void CFlash::WriteWait(void)
{
INT8U temp;
do
{
temp=ReadStatus();
}
while(temp&0x01);
}*/
void CFlash::WriteStatus(INT8U Data)
{
//INT8U temp;
WriteEnable();
spi.SpiOpen();
spi.SpiSendByte(CMDEnWriteStatus);
spi.SpiClose();
Delay8us();
spi.SpiOpen();
spi.SpiSendByte(CMDWriteStatus);
spi.SpiSendByte(Data);
spi.SpiClose();
//Delay8us();
}
INT8U CFlash::ReadStatus(void)
{
INT8U temp;
spi.SpiOpen();
spi.SpiSendByte(CMDReadStatus);
temp=spi.SpiReadByte();
spi.SpiClose();
//Delay8us();
return temp;
}
void CFlash::WriteEnable(void)//软件使能 写操作
{
//INT8U temp;
spi.SpiOpen();
spi.SpiSendByte(CMDWriteEnable);
spi.SpiClose();
//Delay8us();
// Delay8us();
}
void CFlash::WriteDisable(void)
{
spi.SpiOpen();
spi.SpiSendByte(CMDWriteDisable);
spi.SpiClose();
//Delay8us();
}
INT8U CFlash:: ReadByte(INT32U addr)
{
INT32U tempaddr;
INT8U tempdata;
INT8U tempval;
INT8U err;
OSSemPend(GSPISem, 0, & err);
tempaddr=addr;
spi.SpiOpen();
spi.SpiSendByte(CMDRead25MH);
tempdata=tempaddr>>16;
spi.SpiSendByte(tempdata);
tempdata=tempaddr>>8;
spi.SpiSendByte(tempdata);
tempdata=tempaddr;
spi.SpiSendByte(tempdata);
tempval=spi.SpiReadByte();
spi.SpiClose();
err = OSSemPost(GSPISem);
return tempval;
}
void CFlash:: ReadNByte(INT32U addr,INT32U count,INT8U *buf)
{
INT32U tempaddr;
INT32U i;
INT32U cnt;
INT8U tempdata;
INT8U err;
OSSemPend(GSPISem, 0, & err);
cnt=count;
tempaddr=addr;
spi.SpiOpen();
spi.SpiSendByte(CMDRead25MH);
tempdata=tempaddr>>16;
spi.SpiSendByte(tempdata);
tempdata=tempaddr>>8;
spi.SpiSendByte(tempdata);
tempdata=tempaddr;
spi.SpiSendByte(tempdata);
for(i=0;i<cnt;i++)
*(buf+i)=spi.SpiReadByte();
spi.SpiClose();
err = OSSemPost(GSPISem);
}
void CFlash::WriteByte(INT32U addr,INT8U val)
{
INT32U tempaddr;
INT8U tempdata;
INT8U tempval;
//INT8U err;
//INT8U temp;
tempval=val;
tempaddr=addr;
INT8U tempsta=ReadStatus();
if(tempsta&&0x1c)
WriteStatus(0x00);
WriteEnable();
spi.SpiOpen();
spi.SpiSendByte(CMDByteProgram);
tempdata=tempaddr>>16;
spi.SpiSendByte(tempdata);
tempdata=tempaddr>>8;
spi.SpiSendByte(tempdata);
tempdata=tempaddr;
spi.SpiSendByte(tempdata);
spi.SpiSendByte(tempval);
spi.SpiClose();
Delay8us();
//WriteWait();
WriteDisable();
}
void CFlash::WriteNByte(INT32U addr,INT8U *buf,INT16U val)
{
INT32U tempaddr;
INT16U i;
INT16U tempval;
INT8U err;
tempaddr=addr;
tempval=val;
OSSemPend(GSPISem, 0, & err);
for(i=0;i<val;i++)
{
WriteByte(tempaddr,buf[i]);
tempaddr++;
}
err = OSSemPost(GSPISem);
}
/* void CFlash::WriteNByte(INT32U addr,INT8U *buf,INT16U val)yhychange
{
INT32U tempaddr;
INT16U i;
INT16U tempval;
INT8U err;
INT8U m=0;
tempaddr=addr;
tempval=val;
OSSemPend(GSPISem, 0, & err);
m=tempval%2;
tempval=(tempval/2)*2;
WriteWordAAI(addr,buf,tempval);
if(m==1)
{
tempaddr+=tempval;
WriteByte(tempaddr,buf[tempval]);
}
//for(i=0;i<val;i++)
// {
// WriteByte(tempaddr,buf[i]);
// tempaddr++;
// }
err = OSSemPost(GSPISem);
}*/
void CFlash::WriteWordAAI(INT32U addr,INT8U *buf,INT32U cnt)
{
INT32U tempaddr;
INT32U i=0;
INT8U tempdata;
INT32U tempval;
//INT8U temp;
tempval=cnt;
tempaddr=addr;
//WriteEnable();
//spi.SpiOpen();
// spi.SpiSendByte(0x70);
// spi.SpiClose();
// Delay8us();
WriteEnable();
spi.SpiOpen();
spi.SpiSendByte(CMDWordProgram);
tempdata=tempaddr>>16;
spi.SpiSendByte(tempdata);
tempdata=tempaddr>>8;
spi.SpiSendByte(tempdata);
tempdata=tempaddr;
spi.SpiSendByte(tempdata);
spi.SpiSendByte(buf[i++]);
spi.SpiSendByte(buf[i++]);
spi.SpiClose();
//spi.SpiOpen();
//do
//{
///temp=spi.SpiCheckSI();
//}
// while(temp==TRUE);
Delay8us();
while(i<tempval)
{
spi.SpiOpen();
spi.SpiSendByte(0xAD);
spi.SpiSendByte(buf[i++]);
spi.SpiSendByte(buf[i++]);
spi.SpiClose();
//spi.SpiOpen();
//do
//{
// temp=spi.SpiCheckSI();
// }
//while(temp==TRUE);
Delay8us();
}
spi.SpiOpen();
spi.SpiSendByte(CMDWriteDisable);
Delay8us();
// do
//{
// temp=spi.SpiCheckSI();
// }
// while(temp==TRUE);
spi.SpiClose();
//spi.SpiOpen();
// spi.SpiSendByte(0x80);
//spi.SpiClose();
// Delay8us();
WriteDisable();
}
void CFlash::EraseChip(void)
{
WriteEnable();
spi.SpiOpen();
spi.SpiSendByte(CMDEraseAll);
spi.SpiClose();
//Delay8us();
OSTimeDly(OS_TICKS_PER_SEC/10);
}
void CFlash::Erase4KB(INT32U add)
{
INT8U tempdata;
INT32U tempaddr=add;
INT8U i;
INT8U err;
OSSemPend(GSPISem, 0, & err);
INT8U tempsta=ReadStatus();
if(tempsta&&0x1c)
WriteStatus(0x00);
WriteEnable();
spi.SpiOpen();
spi.SpiSendByte(CMDErase4K);
tempdata=tempaddr>>16;
spi.SpiSendByte(tempdata);
tempdata=tempaddr>>8;
spi.SpiSendByte(tempdata);
tempdata=tempaddr;
spi.SpiSendByte(tempdata);
spi.SpiClose();
for(i=0;i<10;i++)
{
//OSTimeDly(OS_TICKS_PER_SEC/200);
Xms(30);
tempdata=ReadStatus();
if((tempdata&0x01)==0x00)
break;
}
err = OSSemPost(GSPISem);
}
void CFlash::Erase32KB(INT32U add)
{
INT8U tempdata;
INT32U tempaddr=add;
WriteEnable();
spi.SpiOpen();
spi.SpiSendByte(CMDErase32K);
tempdata=tempaddr>>16;
spi.SpiSendByte(tempdata);
tempdata=tempaddr>>8;
spi.SpiSendByte(tempdata);
tempdata=tempaddr;
spi.SpiSendByte(tempdata);
spi.SpiClose();
OSTimeDly(OS_TICKS_PER_SEC/50);
}
void CFlash::Erase64KB(INT32U add)
{
INT8U tempdata;
INT32U tempaddr=add;
WriteEnable();
spi.SpiOpen();
spi.SpiSendByte(CMDErase64K);
tempdata=tempaddr>>16;
spi.SpiSendByte(tempdata);
tempdata=tempaddr>>8;
spi.SpiSendByte(tempdata);
tempdata=tempaddr;
spi.SpiSendByte(tempdata);
spi.SpiClose();
OSTimeDly(OS_TICKS_PER_SEC/50);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -