📄 at45db.c
字号:
#define AT45DB_H_H
#include "config.h"
void AT45DB_WR(unsigned char c);
unsigned char AT45DB_RD(void);
/*********************************************************
函数名称:void AT45DB_BufferToPage(uint addr_page,uchar buffer_num)
功能描述:把缓冲区的数据写到指定页
入口参数:addr_page,要写入的也地址;buffer_num,缓冲区选择
出口参数:无
调用模块:void AT45DB_WR(void)
影响变量:无
*********************************************************/
void AT45DB_BufferToPage(uint addr_page,uchar buffer_num)
{
uchar var[4];
AT45DB_BUSY = 1;
_nop_();
if(AT45DB_BUSY ==0) return;
if(buffer_num == 0) var[0]=AT45DB_BUF1_TO_MME;
else
var[0]=AT45DB_BUF2_TO_MME;
var[1]=(uchar)(addr_page>>7);
var[2]=(uchar)(addr_page<<1);
var[3]=0; //为任意码
AT45DB_SCK=0; // 准备SPI mode3
Select_138(SEL_AT0);
_nop_(); _nop_(); _nop_();
AT45DB_WR(var[0]);
AT45DB_WR(var[1]);
AT45DB_WR(var[2]);
AT45DB_WR(var[3]);
Select_138(SEL_62256);
}
/*********************************************************
函数名称:void AT45DB_ArrayRead(uchar *ptr,uint addr_page,uint addr_begin,uint len)
功能描述:连续的读页数据,可以读取页中指定地址的数据
入口参数:ptr,读取数据存入的首址;addr_page,页地址;addr_begin,指定地址单元;len,要读取数据的长度;
出口参数:无
调用模块:void AT45DB_WR(void)
影响变量:无
*********************************************************/
void AT45DB_ArrayRead(uchar *ptr,uint addr_page,uint addr_begin,uint len)
{
uchar var[4];
uchar i;
uint idata cnt;
AT45DB_BUSY = 1;
_nop_();
cnt=0x0ccc;
while(cnt--) //大约延时20MS
{
if(AT45DB_BUSY == 0) break;
}
var[0]=AT45DB_ARRAY_READ;
var[1]=(uchar)(addr_page>>7);
var[2]=(uchar)(addr_page<<1);
var[2]=var[2]&0xFE;
var[2]=var[2]|( (uchar)(addr_begin>>8) );
var[3]=(uchar)addr_begin;
AT45DB_SCK=0; // 准备SPI mode3
Select_138(SEL_AT0);
_nop_(); _nop_(); _nop_();
AT45DB_WR(var[0]);
AT45DB_WR(var[1]);
AT45DB_WR(var[2]);
AT45DB_WR(var[3]);
AT45DB_WR(0); //再发送32位任意码
AT45DB_WR(0);
AT45DB_WR(0);
AT45DB_WR(0);
for(i=0;i<len;i++)
{
*(ptr+i)=AT45DB_RD();
}
Select_138(SEL_NO);
}
/*********************************************************
函数名称:void AT45DB_BufferWrite( uchar *ptr,uint addr_buffer,uint len,uchar buffer_num)
功能描述:先写数据到指定的缓冲区,可以写到指定地址的缓冲区
入口参数:ptr,要写入数据的首址;addr_buffer,写到缓冲区的地址;len,要写入数据的长度;buffer_num,缓冲区0、缓冲区1选择
出口参数:无
调用模块:void AT45DB_WR(void)
影响变量:无
*********************************************************/
void AT45DB_BufferWrite( uchar *ptr,uint addr_buffer,uint len,uchar buffer_num)
{
uchar var[4],i;
if(buffer_num == 0) var[0]=AT45DB_BUF1_WRITE;
else
var[0]=AT45DB_BUF2_WRITE;
var[1]=0; //任意码
var[2]=(uchar)(addr_buffer>>8);
var[3]=(uchar)(addr_buffer);
AT45DB_SCK=0; //准备SPI模式3
Select_138(SEL_AT0);
_nop_(); _nop_(); _nop_();
AT45DB_WR(var[0]);
AT45DB_WR(var[1]);
AT45DB_WR(var[2]);
AT45DB_WR(var[3]);
for(i=0;i<len;i++)
{
AT45DB_WR( *(ptr+i) );
}
Select_138(SEL_62256);
}
uchar AT45DB_RD(void)
{
unsigned char i,b;
CS_62256=1;
b = 0x00;
AT45DB_SO = 1;
_nop_();_nop_();_nop_();
for(i =0; i <8; i++) {
b = b<<1;
AT45DB_SCK = 1;
_nop_();
AT45DB_SCK = 0;
_nop_();_nop_();_nop_();
if(AT45DB_SO) b |= 0x01;
else b &= 0xfe;
}
// AT45D_SCK = 0;
// _nop_();
CS_62256=0;
return b;
}
void AT45DB_WR(uchar c)
{
unsigned char i;
for(i =0; i <8; i++) {
AT45DB_SCK = 0;
_nop_();
if(c & 0x80) AT45DB_SI = 1;
else AT45DB_SI = 0;
_nop_();_nop_();_nop_();
c = c<<1;
AT45DB_SCK = 1;
_nop_();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -