📄 at45db021b ò»
字号:
/***************************/
/* atmel dataflash */
/****AT45DB021B 驱动程序****/
/***************************/
/****模拟SPI端口驱动方式****/
/*copyright GreenStar 2002*/
//擦除 第 page_addr 页
void erase_page(unsigned int idata page_addr)
{
unsigned int idata a;
a=page_addr;
a<<=1;
send_byte(0x81);
send_byte((unsigned char)(a>>8));
send_byte((unsigned char)(a));
send_byte(0x00);
flash_cs=1;
waitNms(8);
}
//模拟SPI数据输出
void send_byte(unsigned char a)
{
unsigned char idata i;
flash_sck=0;
flash_cs=0;
for (i=0;i<8;i++)
{
a<<=1;
flash_si=CY;
flash_sck=1;
flash_sck=0;
}
}
//模拟SPI数据输入
unsigned char get_byte()
{
unsigned char idata i,d=0;
flash_cs=0;
flash_sck=0;
for(i=8;i>0;i--)
{
flash_sck=1;
flash_sck=0;
d=2*d+(unsigned char)flash_so;
}
return(d);
}
//读状态寄存器
unsigned char flash_status()
{
unsigned char idata d;
send_byte(0x57);
d=get_byte();
flash_cs=1;
return(d);
}
//写缓冲
void flash_buff_write(unsigned char idata index ,unsigned int idata star_addr,
unsigned int idata len,unsigned char idata *buffer)
{
unsigned char idata i;
send_byte(0x84+index*3); //缓冲区1为84H 缓冲区2为87H
send_byte(0x00);
send_byte((unsigned char)(star_addr>>8));
send_byte((unsigned char)star_addr);
for (i=0;i<len;i++)
send_byte(buffer[i]);
flash_cs=1;
}
//读缓冲
void flash_buff_read(unsigned char idata index ,unsigned int idata star_addr,
unsigned int idata len, unsigned char idata *buffer)
{
unsigned char idata i;
send_byte(0x54+index*2); //缓冲区1为54H 缓冲区2为56H
send_byte(0x00);
send_byte((unsigned char)(star_addr>>8));
send_byte((unsigned char)star_addr);
send_byte(0x00);
for (i=0;i<len;i++)
buffer[i]=get_byte();
flash_cs=1;
}
// buff1 给第page页//
void flash_prog_no_erase(unsigned int idata page)
{
unsigned long idata a;
a=page;
a<<=9;
send_byte(0x88);
send_byte((unsigned char)(a>>16));
send_byte((unsigned char)(a>>8));
send_byte(0x00);
flash_cs=1;
waitNms(16);
}
//读取指定页
void flash_read(unsigned int idata star_page,unsigned int idata star_addr,
unsigned int idata len, unsigned char idata *in_out)
{
unsigned char idata i;
unsigned long idata a=0;
a=star_page;
a<<=9;
a=a+star_addr;
send_byte(0x68);
send_byte((unsigned char)(a>>16));
send_byte((unsigned char)(a>>8));
send_byte((unsigned char)a);
send_byte(0x00);
send_byte(0x00);
send_byte(0x00);
send_byte(0x00);
for (i=0;i<len;i++)
in_out[i]=get_byte();
flash_cs=1;
}
//页比较
void flash_buf_comp(unsigned int idata page)
{
unsigned long idata a;
a=page;
a<<=9;
send_byte(0x60);
send_byte((unsigned char)(a>>16));
send_byte((unsigned char)(a>>8));
send_byte(0x00);
flash_cs=1;
waitNms(1);
}
//将FLASH 指定页复制到缓冲
void flash_pageto_buffer(unsigned char idata index,unsigned int idata page_addr)
{
unsigned long idata a=0;
a=page_addr;
a<<=9;
send_byte(0x53+index*2);
send_byte((unsigned char)(a>>16));
send_byte((unsigned char)(a>>8));
send_byte((unsigned char)a);
flash_cs=1;
NOP1ms;
}
//将缓冲写入FLASH
void flash_write(unsigned int idata star_page,unsigned int idata star_addr,
unsigned int idata len, unsigned char idata *in_out)
{
unsigned char idata c,d;
flash_pageto_buffer(0x00,star_page);
erase_page(star_page);
flash_buff_write(0x00,star_addr,len,in_out);
flash_prog_no_erase(star_page);
}
//延时 Nms
void waitNms(unsigned char idata n)
{
unsigned char idata i,ii;
for(i=n;i>0;i--)
for (ii=100;ii>0;ii--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
//测试段
void main()
{
unsigned char idata a,i,j;
unsigned char idata buff1[66];
unsigned int idata d;
erase_page(1);
flash_buff_write(0x00,10,0x08,buff1);
flash_prog_no_erase(1);
flash_pageto_buffer(0,1);
flash_buf_comp(1);
flash_read(1,10,8,buff2);
c=flash_status();
a=10;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -