📄 flash.c
字号:
#include <iom8v.h>
#include "mytype.h"
#include "uart.h"
#include "spi.h"
extern uint8 table[];
uint8 read_string[19]={0};//
/***************************************************************************************
读取一个字节
*****************************************************************************************/
uint8 Read_abyte(uint32 address)
{
uint8 data;
uint8 address2,address1,address0;
address2=(uint8)(address>>16);
address1=(uint8)(address>>8);
address0=(uint8)address;
while((Read_RDSR())&0x01);
CS_0;
Spi_MT(0x03);
Spi_MT(address2);
Spi_MT(address1);
Spi_MT(address0);
data=Spi_MR();
CS_1;
return data;
}
/***************************************************************************************
写入一个字节
*****************************************************************************************/
void Write_abyte(uint32 address,uint8 write_data)
{
uint8 address2,address1,address0;
address2=(uint8)(address>>16);
address1=(uint8)(address>>8);
address0=(uint8)address;
while((Read_RDSR())&0x01);
WriteEN();
CS_0;
Spi_MT(0x02);
Spi_MT(address2);
Spi_MT(address1);
Spi_MT(address0);
Spi_MT(write_data);
CS_1;
}
/***************************************************************************************
写入写使能命令
*****************************************************************************************/
void WriteEN(void)
{
CS_0;
Spi_MT(0x06);
CS_1;
}
/***************************************************************************************
写入写禁止命令
*****************************************************************************************/
void WriteDisable(void)
{
CS_0;
Spi_MT(0x04);
CS_1;
}
/***************************************************************************************
写入段擦除使能命令
*****************************************************************************************/
void Sector_Erase(uint32 address)
{
uint8 address2,address1,address0;
address2=(uint8)(address>>16);
address1=(uint8)(address>>8);
address0=(uint8)address;
while((Read_RDSR())&0x01);
WriteEN();
CS_0;
Spi_MT(0xd8);
Spi_MT(address2);
Spi_MT(address1);
Spi_MT(address0);
CS_1;
Prints("Erase sector ",0);
Send_abyte(table[address2/10]);
Send_abyte(table[address2%10]);
Prints(" completed...",1);
}
/***************************************************************************************
写入片擦除使能命令
*****************************************************************************************/
void Bulk_Erase(void)
{
WriteEN();
while((Read_RDSR())&0x01);
CS_0;
Spi_MT(0xc7);
CS_1;
Prints("Bulk Erawe completed...",1);
}
/***************************************************************************************
延时X/100ms
*****************************************************************************************/
void DelayX100ms(uint32 x)
{
uint32 i;
while(x--)
{
i=1295;
while(i--);
}
}
/***************************************************************************************
读取状态寄存器。
*****************************************************************************************/
uint8 Read_RDSR(void)
{
uint8 read_data;
//Prints("Run Read_RDSR()...",1);
CS_0;
Spi_MT(0x05);
//Prints("Run Spi_MT()...",1);
read_data=Spi_MR();
//Prints("Run Spi_MR()...",1);
CS_1;
return(read_data);
}
/**************************************************************
写入一串字节。
****************************************************************/
void Write_string(uint8 *string,uint32 address,uint16 n)
{
uint16 i;
uint8 address2,address1,address0;
address2=(uint8)(address>>16);
address1=(uint8)(address>>8);
address0=(uint8)address;
while((Read_RDSR())&0x01);
WriteEN();
CS_0;
Spi_MT(0x02);
Spi_MT(address2);
Spi_MT(address1);
Spi_MT(address0);
for(i=0;i<n;i++)
{
Spi_MT(*string);
string++;
}
CS_1;
Prints("Write string start addr ",0);
Send_abyte('0');
Send_abyte('x');
Send_abyte('0');
Send_abyte(table[address2%16]);
Send_abyte(table[address1/6]);
Send_abyte(table[address1%16]);
Send_abyte(table[address0/16]);
Send_abyte(table[address0%16]);
Prints(" completed...",1);
}
/**************************************************************
读入一串字节。
****************************************************************/
void Read_string(uint32 address,uint32 n)
{
uint8 i;
uint8 address2,address1,address0;
address2=(uint8)(address>>16);
address1=(uint8)(address>>8);
address0=(uint8)address;
while((Read_RDSR())&0x01);
WriteEN();
CS_0;
Spi_MT(0x03);
Spi_MT(address2);
Spi_MT(address1);
Spi_MT(address0);
for(i=0;i<n;i++)
{
read_string[i]=Spi_MR();
}
CS_1;
}
/**************************************************************
写保护
****************************************************************/
void Write_Protect()
{
while((Read_RDSR())&0x01);
WriteEN();
CS_0;
Spi_MT(0x02);
Spi_MT(0X9C);
CS_1;
Prints("Chip Write Protect...",1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -