📄 at45db041.c
字号:
#include"AT45DB041.h"
#include<assert.h>
#include <stdio.h>
/******************************************************************************************
*函数 名: SPI0_WR
*描 述: SPI接口模拟读写函数,发数据时,高位在前;
*出口参数 : 读SPI从器件的一个字节
*入口参数 : wr_byt :主SPI 发送给从SPI器件的 数据
******************************************************************************************/
static uchar SPI_WR(uchar wr_byt)
{
uchar RDAT = 0xFF;
uchar CNT = 8;
do
{
ClearAT45_SCK();
if( wr_byt & 0x80 )
{
SetAT45_SI();
}
else
{
ClearAT45_SI();
}
RDAT <<=1;
SetAT45_SCK();
wr_byt <<= 1;
ClearAT45_SO();
if( TestAT45_SO )
{
RDAT ++;
}
}while( --CNT );
ClearAT45_SCK();
return RDAT;
}
/******************************************************************************************
*函数 名: ReadStatesReg
*描 述: 读AT45DB041的状态寄存器;
*出口参数 : 状态寄存器的值;
*入口参数 : 无;
******************************************************************************************/
static uchar ReadStatesReg( void )
{
uchar i = 0x80;
ClearAT45_CS();
SPI_WR(0xd7);
i = SPI_WR(0);
SetAT45_CS();
return i;
}
/******************************************************************************************
*函数 名: Data_RDBuffer
*描 述: 从缓冲区读一个字节的数据
*出口参数 : 读到的字节
*入口参数 : Buffer:读取的缓冲区;
adr : 缓冲区的地址
******************************************************************************************/
/*
uchar Data_RDBuffer(uchar Buffer, uint addr )
{
uchar *p = (uchar *)&addr;
uchar a=0;
volatile uchar BufferID = 0;
#if DEBUG
assert( addr < 264 );
#endif
BufferID = ( (Buffer == USE_BUFFER1)?READ_BUFFER1:READ_BUFFER2);
ClearAT45_CS();
SPI_WR (BufferID) ;
SPI_WR (0) ;
SPI_WR (*p) ;
SPI_WR (*(p+1)) ;
SPI_WR (0x00) ;
a = SPI_WR (0) ;
SetAT45_CS();
return a;
}
*/
/******************************************************************************************
*函数 名: Data_WRBuffer
*描 述: 向缓冲区写一个字节的数据
*出口参数 : 无
*入口参数 : Buffer:缓冲区;
adr : 缓冲区的地址
byte_data:写入的字节
******************************************************************************************/
/*
void Data_WRBuffer(uchar Buffer, uint addr, uchar byte_data )
{
uchar *p = (uchar *)&addr;
volatile uchar BufferID = 0;
#if DEBUG
assert( addr < 264 );
#endif
BufferID = ( (Buffer == USE_BUFFER1)?WRITE_BUFFER1:WRITE_BUFFER2);
ClearAT45_CS();
SPI_WR (BufferID) ;
SPI_WR (0) ;
SPI_WR (*p) ;
SPI_WR (*(p+1)) ;
SPI_WR (byte_data) ;
SetAT45_CS();
}
*/
/******************************************************************************************
*函数名称: SeriesWriteBufferData
*函数入参: uint addr:要写的地址,(要小于 264)
uchar lenth: 写的字节长度
uchar Buffer :
uchar *RdDate: 写入值的存放数组
*函数出参: 无
*功能描述: 连续写BUFFER区
******************************************************************************************/
void SeriesWriteBufferData(uchar Buffer, uint addr,uint lenth, const uchar *byte_data )
{
uchar BufferID = 0;
uint i=0;
#if DEBUG
assert( ( addr < 264) && (( 264 -addr ) >= lenth) );
#endif
BufferID = ( (Buffer == USE_BUFFER1)?WRITE_BUFFER1:WRITE_BUFFER2);
ClearAT45_CS();
SPI_WR (BufferID) ; //"发送写命令字 84:向 BUFF1 写入数据"
SPI_WR (0) ; //"最高8位"
SPI_WR ((uchar)(addr>>8)) ; //"中间8位"
SPI_WR((uchar)addr) ; //"最低8位 "
for( i = lenth ; i >0; i--)
{
SPI_WR(*byte_data) ;
byte_data++;
}
SetAT45_CS();
}
/******************************************************************************************
*函数名称: SeriesRdBufferData
*函数入参: uint adr:要读的起始地址值;(要小于 528)
uchar lenth: 读的字节长度
uchar Buffer : 1:Buffer1 ,2: Buffer2
uchar *RdDate: 读到的值存放数组
*函数出参:
*功能描述:连续读BUFFER 区的值
******************************************************************************************/
void SeriesRdBufferData(uchar Buffer, uint addr,uint lenth,volatile uchar *RdDate )
{
uint i=0;
uchar BufferID = 0;
#if DEBUG
assert( ( addr < 264) && ( 264 -addr ) >= lenth );
#endif
BufferID = ( (Buffer == USE_BUFFER1)?READ_BUFFER1:READ_BUFFER2);
ClearAT45_CS();
SPI_WR(BufferID) ; //"发送读命令字 D4:读BUFF1"
SPI_WR(0) ; //"最高8位空"
SPI_WR((uchar)(addr>>8)) ; //" 6位空 + 2有效位"
SPI_WR((uchar)addr) ; //"最低8有效位 "
SPI_WR(0x00) ; //"发送空命令"
for( i = lenth ; i >0; i--)
{
*RdDate= SPI_WR(0) ; //"读数据"
RdDate++;
}
SetAT45_CS();
}
/******************************************************************************************
*函数名称: WriteBufferDateToMainMerroy
*函数入参: uint MainMerroyAddr:要写的主存页,
uchar Buffer : 1:Buffer1 ,2: Buffer2
*函数出参: 无
*功能描述: 将 BUFF 中的数据 写到 主存的MainMerroyAddr页
******************************************************************************************/
void WriteBufferDateToMainMerroy( uchar Buffer,uint MainMerroyAddr )
{
uchar BufferID = 0;
#if DEBUG
assert( MainMerroyAddr < 2048);
#endif
BufferID = ( (Buffer == USE_BUFFER1)?BUFFER1_TO_MAINPAGE_E:BUFFER2_TO_MAINPAGE_E);
ClearAT45_CS();
SPI_WR (BufferID) ; //"发送写命令字 将 BUFF 数据存入 主存 "
SPI_WR ( (uchar )(MainMerroyAddr >> 7)) ;
SPI_WR ((uchar )(MainMerroyAddr << 1)) ;
SPI_WR (0) ; //"最低8位 "
SetAT45_CS();
while( (ReadStatesReg()&0x80) == 0 ) ; //"等待AT45空闲"
}
/******************************************************************************************
*函数名称: ContinusReadMainMerroy
*函数入参: uint pAddr:要读的页地址
uint add :要读的页内地址
uint lenth: 要读的长度
uchar *dat : 读出的数据存放数组
*函数出参:读从指定地址开始的 lenth长度的数据,存放在dat数组中
*功能描述:
*说 明: 通过 2007年6月1日
******************************************************************************************/
void ContinusReadMainMerroy(uint pAddr,uint add,uint lenth,volatile uchar *dat)
{
uint i = 0;
#if DEBUG
assert( (pAddr < 2048 ) && ( add <264 ) &&((264 -add) >= lenth) );
#endif
ClearAT45_CS();
SPI_WR (CONTINUES_READ) ;
SPI_WR ((uchar )( pAddr >> 7 )) ;
SPI_WR ( (uchar )( (pAddr<<1) | (add >>8))) ;
SPI_WR ((uchar )(add)) ;
SPI_WR (0) ;
for( i = 0; i< lenth; i++)
{
*(dat + i) = SPI_WR (0) ;
}
SetAT45_CS();
}
/******************************************************************************************
*函数名称: ChipEra
*函数入参: 无
*函数出参: 无
*功能描述: 擦除整个芯片
******************************************************************************************/
void ChipEra(void )
{
ClearAT45_CS();
SPI_WR (0xc7) ;
SPI_WR (0x94) ;
SPI_WR (0x80) ;
SPI_WR (0x9a) ;
SetAT45_CS();
while( (ReadStatesReg()&0x80) == 0 ) ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -