📄 flash.c
字号:
void spi_Bitout(void)
{
if (ucBuffer & 0x80)
{
GpioDataRegs.GPFDAT.bit.GPIOF0=1;
}
else
{
GpioDataRegs.GPFDAT.bit.GPIOF0=0;
}
DelayMs(1);
GpioDataRegs.GPFDAT.bit.GPIOF2=0;
DelayMs(1);
GpioDataRegs.GPFDAT.bit.GPIOF2=1;
DelayMs(1);
}
void spi_Bitin(void)
{
ucBuffer &= 0x00FE;
GpioDataRegs.GPFDAT.bit.GPIOF2=0;
DelayMs(1);
GpioDataRegs.GPFDAT.bit.GPIOF2=1;
DelayMs(1);
if (GpioDataRegs.GPFDAT.bit.GPIOF1==1)
{
ucBuffer|= 0x01;
}
}
void write_spi(unsigned char luck)
{
unsigned char i;
ucBuffer=(unsigned int)luck;
for (i = 0; i < 8; i++)
{
spi_Bitout();
ucBuffer = ucBuffer << 1;
}
}
void read_spi(void)
{
unsigned char i;
ucBuffer = 0;
for (i = 0; i < 8; i++)
{
ucBuffer = ucBuffer << 1;
spi_Bitin();
}
}
void McEEP_Poll(void)
{
DF_FLASH_NOSELECT;
DelayMs(1);
while (GpioDataRegs.GPFDAT.bit.GPIOF1==1) {};
DF_FLASH_SELECT;
}
void check_state(void)
{
unsigned int state_reg;
DF_FLASH_SELECT;
DelayMs(1);
write_spi(READ_STATE_REGISTER);
DelayMs(1);
read_spi();
DF_FLASH_NOSELECT;
state_reg = ucBuffer & 0x00FF;
while((state_reg & 0x80) == 0) ;
}
void DF_write_buf1(unsigned int start_address,unsigned int length)
{
unsigned int i;
if ((528-start_address)>=length)
{
check_state();
DF_FLASH_SELECT;
DelayMs(1);
write_spi(BUFFER_1_WRITE);
write_spi(0x00);
write_spi((unsigned char)(start_address >> 8));
write_spi((unsigned char)start_address);
for (i=flag1;i< (flag1+length);i++)
write_spi(data_in[i]);
DF_FLASH_NOSELECT;
}
}
void write_to_flash(unsigned int page_addr,unsigned int page_start_addr,unsigned int length)
{ unsigned int i,temp1,temp2,temp3,temp5;
temp1=528-page_start_addr;
if(length<temp1)
{ flag1=0;
DF_write_buf1(page_start_addr,length);
DF_buf1_to_mm(page_addr);
}
else
{ flag1=0;
DF_write_buf1(page_start_addr,temp1);
DF_buf1_to_mm(page_addr);
temp2=(unsigned int)((length-temp1)/528);
if(temp2>0)
{ for(i=0;i<temp2;i++)
{ page_addr++;
flag1 = temp1 + i*528;
DF_write_buf1(0,528);
DF_buf1_to_mm(page_addr);
}
temp5 = (length-temp1) % 528;
page_addr++;
flag1 = temp1+temp2 * 528;
DF_write_buf1(0,temp5);
DF_buf1_to_mm(page_addr);
}
else
{ page_addr++;
temp3 = length-temp1;
flag1=temp1;
DF_write_buf1(0,temp3);
DF_buf1_to_mm(page_addr);
}
}
}
//将指定缓冲区中的数据写入主存储区的指定页
void DF_buf1_to_mm(unsigned int page)
{
check_state();
if (page<4096)
{
DF_FLASH_SELECT;
write_spi(BF1_TO_MM_PAGE_PROG_WITH_ERASE);
write_spi((unsigned char)(page>>6));
write_spi((unsigned char)(page<<2));
write_spi(0x00);
DF_FLASH_NOSELECT;
}
}
void read_from_flash(unsigned int page_addr,unsigned int page_start_addr, unsigned int length)
{ unsigned int i,temp1,temp2,temp3,temp5;
temp1=528-page_start_addr;
if(length<=temp1)
{ flag3=0;
DF_read_page(page_addr,page_start_addr,length);
}
else
{ temp2=(unsigned int)((length-temp1)/528);
flag3=0;
DF_read_page(page_addr,page_start_addr,temp1);
if(temp2>0)
{
for(i=0;i<temp2;i++)
{
page_addr++;
flag3=temp1;
DF_read_page(page_addr,0,528);
}
temp3 = (length-temp1)%528;
page_addr++;
flag3=temp1+temp2*528;
DF_read_page(page_addr,0,temp3);
}
else
{
page_addr++;
temp5 = length-temp1;
flag3=temp1;
DF_read_page(page_addr,0,temp5);
}
}
}
void DF_read_page(unsigned int cpage,unsigned int cpage_sta,unsigned int clenth)
{
unsigned int temp1,i,temp2;
check_state();
DF_FLASH_SELECT;
write_spi(MM_PAGE_READ);
write_spi((unsigned char)(cpage>>6));
temp1=(unsigned char)(cpage & 0x003F);
temp2=((temp1<<2)|(unsigned char)(cpage_sta>>8));
write_spi(temp2);
write_spi((unsigned char)(cpage_sta));
write_spi(0x00);
write_spi(0x00);
write_spi(0x00);
write_spi(0x00);
for (i=flag3;i<( flag3+clenth);i++)
{
read_spi();
DF_buffer[i] = (unsigned char)(ucBuffer & 0xFF);
}
DF_FLASH_NOSELECT;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -