📄 flash.c
字号:
#include "flash.h"
#include <csl_mcbsp.h>
#include <csl_gpio.h>
Uint16 BlockWr[128];
void SPIclk(Uint16 ClkPhase)
{
int i;
if(ClkPhase==0)
MCBSP_FSET(PCR0,CLKXP,0);
else
MCBSP_FSET(PCR0,CLKXP,1);
for(i = 0; i < 100; i++);
}
void SPItx(Uint16 TxPhase)
{
if(TxPhase==0)
MCBSP_FSET(PCR0,DXSTAT,0);
else
MCBSP_FSET(PCR0,DXSTAT,1);
}
Uint16 SPIrx(void)
{
Uint16 RxTmp;
RxTmp=MCBSP_FGET(PCR0,DRSTAT);
return(RxTmp);
}
void SPIcs(Uint16 IO4Phase)
{
int i;
if(IO4Phase==0)
GPIO_FSET(IODATA,IO4D,0);
else
GPIO_FSET(IODATA,IO4D,1);
for(i = 0; i < 100; i++);
}
Uint16 sRd1Byte(void)
{
Uint16 i,RdDatTemp, j;
Uint16 Rdbit;
RdDatTemp=0x00;
for(i=0;i<8;i++)
{
SPIclk(0);
SPIclk(1);
Rdbit=SPIrx();
RdDatTemp<<=1;
if(Rdbit==1)
RdDatTemp|=0x01;
else
RdDatTemp&=0xfe;
}
return(RdDatTemp);
}
void sWr1Byte(Uint16 WrDatP)
{
Uint16 WrDatPTmp,i, j;
WrDatPTmp=WrDatP;
for(i=0;i<8;i++)
{
WrDatPTmp&=0x80;
if(WrDatPTmp==0x80)
SPItx(1);
else
SPItx(0);
SPIclk(0);
SPIclk(1);
WrDatP<<=1;
WrDatPTmp=WrDatP;
}
}
void sWr1Word(Uint16 WrDatP)
{
Uint16 WrDatPTmp,i, j;
WrDatPTmp = WrDatP;
for(i = 0; i < 16; i++)
{
WrDatPTmp &= 0x8000;
if(WrDatPTmp == 0x8000)
SPItx(1);
else
SPItx(0);
SPIclk(0);
SPIclk(1);
WrDatP<<=1;
WrDatPTmp=WrDatP;
}
}
void FlashWrEn(void)
{
SPIcs(1);
SPIcs(0);
sWr1Byte(0x06);
SPIcs(1);
}
/* read status register, return value of register */
Uint16 FlashRdReg(void)
{
Uint16 RdTemp;
SPIcs(1);
SPIcs(0);
sWr1Byte(0x05);
RdTemp=sRd1Byte();
SPIcs(1);
return(RdTemp);
}
/* read status register and wait for write ending */
void ChkWIP(void)
{
while(FlashRdReg() & 0x01 == 0x01);
}
/* read 1 byte according to address RdAddr */
Uint16 FlashRd(Uint32 RdAddr)
{
Uint16 Tmp;
Uint16 WrDatTmp;
Uint16 RdDatTmp;
SPIcs(1);
SPIcs(0);
sWr1Byte(0x03);
WrDatTmp = (RdAddr >> 16) & 0x00FF;
sWr1Byte(WrDatTmp);
WrDatTmp = (RdAddr >> 8) & 0x00FF;
sWr1Byte(WrDatTmp);
WrDatTmp = RdAddr & 0x00FF;
sWr1Byte(WrDatTmp);
RdDatTmp=sRd1Byte();
SPIcs(1);
ChkWIP();
return(RdDatTmp);
}
/* write 1 page (256 bytes) */
void FlashWr(Uint32 WrAddr)
{
Uint16 WrDatTmp;
Uint16 i,j;
FlashWrEn();
SPIcs(1);
SPIcs(0);
/* write instruction opcode */
sWr1Byte(0x02);
/* write page start address(24bit) */
WrDatTmp = (WrAddr >> 16) & 0x00FF;
sWr1Byte(WrDatTmp);
WrDatTmp = (WrAddr >> 8) & 0x00FF;
sWr1Byte(WrDatTmp);
WrDatTmp = WrAddr & 0x00FF;
sWr1Byte(WrDatTmp);
/* write one page */
for(i = 0; i < 128;i++)
{
WrDatTmp = BlockWr[i];
sWr1Word(WrDatTmp);
}
SPIcs(1);
ChkWIP();
}
void EraseChip()
{
FlashWrEn();
SPIcs(1);
SPIcs(0);
/* write instruction opcode */
sWr1Byte(0xC7);
SPIcs(1);
ChkWIP();
}
void FlashWrReg(Uint16 RegP)
{
FlashWrEn();
SPIcs(1);
SPIcs(0);
sWr1Byte(0x01);
sWr1Byte(RegP);
SPIcs(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -