📄 test_flash.c
字号:
#include <msp430x14x.h>
extern unsigned char Flash_Data[528]={0}; //当作为写操作中间变量时 //横向每中断100次写一次FLASH,那么需要500个字节
//纵向每中断167次写一次FLASH,那么需要501个字节
//当作为读操作中间变量时 //横向:从FLASH中读出数据,计算Hi,然后把Hi再放到Flash_Data[500],再写回FLASH
//纵向:从FLASH中读出数据,计算方差
extern unsigned char Zong_target[528]={0}; //用于存放纵向测量的指标,每88个横截面存一次指标88×6=528
extern unsigned char Heng_target[528]={0}; //用于存放横向测量的指标,每176个100m存一次指标176×3=528
unsigned char Flash_Data1[528]={0};
//unsigned char Flash_Data2[528]={0};
void AT45DB161_cs_availability(void);
void AT45DB161_cs_invalidationy(void);
void AT45DB161_si_low(void);
void AT45DB161_si_high(void);
void AT45DB161_sck_low(void);
void AT45DB161_sck_high(void);
unsigned char AT45DB161_so(void);
void init_read_write(void);
void resolve_read_write(void);
void write_AT45DB161_byte(unsigned char data);
unsigned char read_AT45DB161_byte(void);
void sck_high_low(void);
void Auto_cmd_Through_buf(unsigned char cmd,unsigned int page,unsigned int adr);
//===============================================================================
//extern unsigned char Flash_Data[528];Flash_Data[528]
void memory_Page_to_Buffer(unsigned char cmd,unsigned int page);
void buffer_read(unsigned char cmd,unsigned int adr);
void buffer_write(unsigned char cmd,unsigned int adr);
void Buffer_Main_Memory(unsigned char cmd,unsigned int page,unsigned int adr);
void Main_Memory_Page_Read(unsigned int page,unsigned int adr);
unsigned char read_AT45DB161_register(void);
void M430_to_MemoryE(unsigned char cmd,unsigned int page,unsigned int adr);
void M430_to_MemoryE1(unsigned char cmd,unsigned int page,unsigned int adr);
void M430_to_MemoryE2(unsigned char cmd,unsigned int page,unsigned int adr);
void M430_to_MemoryNOE(unsigned char cmd,unsigned int page,unsigned int adr);
void M430_Buffer_MemoryE(unsigned char cmd,unsigned int page,unsigned int adr);
void M430_Buffer_MemoryE1(unsigned char cmd,unsigned int page,unsigned int adr);
void M430_Buffer_MemoryE2(unsigned char cmd,unsigned int page,unsigned int adr);
//================================================================================
void init_AT45DB161(void);
void read_AT45DB161_430(unsigned int page_adr);
void write_AT45DB161_430(unsigned int page_adr);
//===============================================================================
//
//P64 SO IN
//P65 CS OUT 低有效
//P66 SCK OUT
//P67 SI OUT
// RDY/BUSY 接高电平
//RESET 接高电平,不复位
// WP 接 高电平允许写
void init_AT45DB161(void)
{
P6OUT|=0xe0; //1110 0000 CS SCK SI输出1
}
//片选有效
void AT45DB161_cs_availability(void)
{
P6OUT&=0xDF; //1101 1111 CS=0 P65 CS
}
//片选无效
void AT45DB161_cs_invalidationy(void)
{
P6OUT|=0x20; //0010 0000 CS=1 P65 CS
}
//SI置低
void AT45DB161_si_low(void)
{
P6OUT&=0x7F; //0111 1111 SI=0 P67 SI
}
//p23--SI置高
void AT45DB161_si_high(void)
{
P6OUT|=0x80; //1000 0000 SI=1 P67 SI
}
//SCK置低
void AT45DB161_sck_low(void)
{
P6OUT&=0xbf; //1011 1111 SCK=0 P66 SCK
}
//SCK置高
void AT45DB161_sck_high(void)
{
P6OUT|=0x40; //0100 0000 SCK=1 P66 SCK
}
//准备读写FLASH,创造条件
void init_read_write(void)
{
AT45DB161_sck_low(); //SCK=0
AT45DB161_cs_availability(); //CS=0
}
//放弃读写FLASH
void resolve_read_write(void)
{
AT45DB161_sck_low(); //SCK=0
AT45DB161_cs_invalidationy(); //CS=1
}
//读SO状态
unsigned char AT45DB161_so(void)
{
unsigned char c;
c=P6IN;
c=c&0x10;
if(c==0)
{
c=0;
}
else
{
c=1;
}
return(c);
}
//写1个字节
void write_AT45DB161_byte(unsigned char data)//-------------------------
{
unsigned int i;
AT45DB161_sck_low();
for(i=0;i<8;i++)
{
if(data>=0x80)
{
AT45DB161_si_high();
}
else
{
AT45DB161_si_low();
}
AT45DB161_sck_high();
AT45DB161_sck_low();
data=data<<1;
}
AT45DB161_sck_low();
}
//读1个字节
unsigned char read_AT45DB161_byte(void)//-------------------------
{
unsigned int i,j;
unsigned char data,c;
AT45DB161_sck_low();//AT45DB161_sck_high();
data=0;
for(i=0;i<8;i++)
{
data=data<<1;
AT45DB161_sck_high();//AT45DB161_sck_low();
for(j=0;j<=10;j++);
c=AT45DB161_so();
if(c==1)
{
data=data|0x01;
}
AT45DB161_sck_low();// AT45DB161_sck_high();
}
AT45DB161_sck_low(); //AT45DB161_sck_high();
return(data);
}
void sck_high_low(void)
{
AT45DB161_sck_high();
AT45DB161_sck_low();
}
//
void Auto_cmd_Through_buf(unsigned char cmd,unsigned int page,unsigned int adr)//-------------------------
{
// 例如:page=0000 1111 1111 0000 adr=0000 0000 1000 1111
int lzg1,lzg2;
char lcx1,lcx2,lcx3;
lzg1=page<<2; // 0011 1111 1100 0000
lzg2=adr>>8; // 0000 0000 0000 0000
lzg1=lzg1|lzg2; // lzg1= 0011 1111 1100 0000
lzg2=adr&0x00ff; // lzg2= 0000 0000 1000 1111
lcx1=(char)lzg1; //lcx1放中间地址 1100 0000
lcx2=(char)(lzg1>>8); //lcx2放高地址 0011 1111
lcx3=(char)(adr&0xff); //lcx3放低地址 1000 1111
init_read_write();
write_AT45DB161_byte(cmd);
write_AT45DB161_byte(lcx2);
write_AT45DB161_byte(lcx1);
write_AT45DB161_byte(lcx3); // 最终命令字帧:0011 1111 1100 0000 1000 1111
//resolve_read_write(); //其他方式的结束符号
}
//==============================================================================================
//=============应用程序 1============
//======直接从主存储器读到430中======
//==============================================================================================
void Main_Memory_Page_Read(unsigned int page,unsigned int adr)//从FLASH中读数据,放到Flash_Data1[528]中//-------------------------
{
unsigned int i;
Auto_cmd_Through_buf(0x52,page,adr);
write_AT45DB161_byte(0);
write_AT45DB161_byte(1);
write_AT45DB161_byte(2);
write_AT45DB161_byte(3);
sck_high_low();
for(i=adr;i<528;i++)
{
Flash_Data1[i-adr]=read_AT45DB161_byte();
}
resolve_read_write(); //10011100 RDY/BUSY CMP
}
//==============================================================================================
//=============应用程序 2============
//======= 从缓冲区到430内存 ========
//====缓冲器读====
//54H Buffer 1 Read
//56H Buffer 2 Read
//==============================================================================================
void buffer_read(unsigned char cmd,unsigned int adr)
{
unsigned int i;
Auto_cmd_Through_buf(cmd,0,adr);
write_AT45DB161_byte(0);
sck_high_low();
for(i=adr;i<528;i++)
{
Flash_Data[i-adr]=read_AT45DB161_byte();
}
resolve_read_write(); //10011100 RDY/BUSY CMP
}
//==============================================================================================
//=============应用程序 3============
//=======从430内存到缓冲区=========
//====缓冲器写===
//84H Buffer 1 Write 87H Buffer 2 Write
//==============================================================================================
void buffer_write(unsigned char cmd,unsigned int adr)//-------------------------
{
unsigned int i;
Auto_cmd_Through_buf(cmd,0,adr);
for(i=adr;i<528;i++)
{
write_AT45DB161_byte(Flash_Data[i-adr]);
}
resolve_read_write(); //10011100 RDY/BUSY CMP
}
void buffer_write1(unsigned char cmd,unsigned int adr)//-------------------------
{
unsigned int i;
Auto_cmd_Through_buf(cmd,0,adr);
for(i=adr;i<528;i++)
{
write_AT45DB161_byte(Zong_target[i-adr]);
}
resolve_read_write(); //10011100 RDY/BUSY CMP
}
void buffer_write2(unsigned char cmd,unsigned int adr)//-------------------------
{
unsigned int i;
Auto_cmd_Through_buf(cmd,0,adr);
for(i=adr;i<528;i++)
{
write_AT45DB161_byte(Heng_target[i-adr]);
}
resolve_read_write(); //10011100 RDY/BUSY CMP
}
//==============================================================================================
//=============应用程序 4============
//===主存储器写到BUFF===
//53H Main Memory Page to Buffer 1 Transfer
//55H Main Memory Page to Buffer 2 Transfer
//===主存储器和BUFF比较===
//60H Main Memory Page to Buffer 1 Compare
//61H Main Memory Page to Buffer 2 Compare
//==============================================================================================
void memory_Page_to_Buffer(unsigned char cmd,unsigned int page)
{
Auto_cmd_Through_buf(cmd,page,0);
resolve_read_write();
}
//==============================================================================================
//=============应用程序 5============
//====================
//83H Buffer 1 to Main Memory Page Program with Built-In Erase
// 缓冲器1到主存储器页并檫除
//86H Buffer 2 to Main Memory Page Program with Built-In Erase
// 缓冲器2到主存储器页并檫除
//88H Buffer 1 to Main Memory Page Program without Built-In Erase
// 缓冲器1到主存储器页不檫除
//89H Buffer 2 to Main Memory Page Program without Built-In Erase
// 缓冲器2到主存储器页不檫除
//====================
//82H Main Memory Page Program Through Buffer 1 (含BA8 BA7 。。。BA0)
// 主存储器到BUFFER1
//85H Main Memory Page Program Through Buffer 2 (含BA8 BA7 。。。BA0)
// 主存储器到BUFFER2
//58H Auto Page Rewrite Through Buffer 1
// 自动写到缓冲器1
//59H Auto Page Rewrite Through Buffer 2
// 自动写到缓冲器2
//==============================================================================================
void Buffer_Main_Memory(unsigned char cmd,unsigned int page,unsigned int adr)
{
Auto_cmd_Through_buf(cmd,page,adr);
//write_AT45DB161_byte(0);
//write_AT45DB161_byte(1);
resolve_read_write();
}
//==============================================================================================
//=============应用程序 6============
//===========状态积存器的读=========
//==============================================================================================
unsigned char read_AT45DB161_register(void)
{
unsigned char c;
init_read_write();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -