📄 avr的at45db041读写程序.txt
字号:
/*******************************************************
描述: 主 存读取指定页地址与字节地址固写长度
参数: page_adderss 主存的页地址<=2047
buffer_adderss 缓存字节地址0-263
*Read_pHeader 读出数据存贮地址指针
length 读入数据的长度,<=263
*******************************************************/
void AT45DB041B_ContinuousArrayRead(uint page_adderss,uint buffer_adderss,uchar *Read_pHeader,uint length)
{
uint i;
uchar statu_bit=0;
for(i=0;i<255;++i) //AT45DB041 busy
{
statu_bit=AT45DB041B_StatusRegisterRead();
if(testbit(statu_bit,7)) break;
}
SPI_CS_E;
SPI_HostWriteByte(0xe8);
SPI_HostWriteByte((uchar)(page_adderss>>7));
SPI_HostWriteByte((uchar)((page_adderss<<1)|(buffer_adderss>>8)));
SPI_HostWriteByte((uchar)buffer_adderss);
for(i=0;i<4;i++)
{
SPI_HostWriteByte(0x00);
}
for(i=0;i<length;i++)
{
Read_pHeader[i]=SPI_HostReadByte();
}
SPI_CS_D;
}
/*******************************************************
描述:主存转到缓存
参数:buffer 缓存选择0X01选取buffer 1, 0X02选取buffer 2,
page_adderss 主存的页地址<=2047
*******************************************************/
void AT45DB041B_MainMemoryBufferTransfer(uchar buffer,uint page_adderss)
{
uint i;
uchar statu_bit=0;
for(i=0;i<255;++i) //AT45DB041 busy
{
statu_bit=AT45DB041B_StatusRegisterRead();
if(testbit(statu_bit,7)) break;
}
SPI_CS_E;
switch(buffer)
{
case 1:SPI_HostWriteByte(0x53);break; //buffer 1 writ
case 2:SPI_HostWriteByte(0x55);break; //buffer 2 writ
}
SPI_HostWriteByte((uchar)(page_adderss>>7));
SPI_HostWriteByte((uchar)(page_adderss<<1));
SPI_HostWriteByte(0x00);
SPI_CS_D;
}
/*******************************************************
Status Register Format:
-----------------------------------------------------------------------
| bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
|--------|--------|-----|------|-----|-----|------|------|
|RDY/BUSY| COMP | 0 | 1 | 1 | 1 | X | X |
| -----------------------------------------------------------------------
bit7 - 忙标记,0为忙1为不忙
当Status Register的位0移出之后,
接下来的时钟脉冲序列将使SPI器件继续
将最新的状态字节送出
bit6 - 标记最近一次Main Memory Page和Buffer的比较结果,0相同,1不同。
bit5
bit4
bit3
bit2 - 这4位用来标记器件密度,对于AT45DB041B,这4位应该是0111,一共能标记
16种不同密度的器件。
bit1
bit0 - 这2位暂时无效
*******************************************************/
uchar AT45DB041B_StatusRegisterRead(void)
{
uchar i;
SPI_CS_E;
SPI_HostWriteByte(0xd7);
i=SPI_HostReadByte();
SPI_CS_D;
return i;
}
/*******************************************************
描述: 一、 将指定的数据写入buffer 中的指定地址(0-263)
二、带擦除将buffer 中的数据写入到指定的页中
参数: buffer 缓存选择0X01选取buffer 1, 0X02选取buffer 2,
buffer_adderss 缓存字节地址0-263
*writ_pHeader 待写入数据的指针
length 写入数据的长度,<=263
page_adderss 主存的页地址<=2047
*******************************************************/
void AT45DB041B_BufferToMainMemoryPageProgramWithBuilt_inErase(uchar buffer,uint buffer_adderss,uchar *writ_pHeader,uint length,uint page_adderss)
{
uint i=0;
uchar statu_bit=0;
AT45DB041B_BufferWrite(buffer,buffer_adderss,writ_pHeader,length);
for(i=0;i<1000;++i) //AT45DB041 busy
{
statu_bit=AT45DB041B_StatusRegisterRead();
if(testbit(statu_bit,7)) break;
}
SPI_CS_E;
switch(buffer)
{
case 1:SPI_HostWriteByte(0x83);break;
case 2:SPI_HostWriteByte(0x86);break;
}
SPI_HostWriteByte((unsigned char)(page_adderss>>7));
SPI_HostWriteByte((unsigned char)(page_adderss<<1));
SPI_HostWriteByte(0x00);
SPI_CS_D;
}
/*******************************************************
描述: 将指定的数据写入buffer 中的指定地址(0-263)
参数: buffer 缓存选择0X01选取buffer 1, 0X02选取buffer 2,
buffer_adderss 缓存字节地址0-263
*writ_pHeader 待写入数据的指针
length 写入数据的长度,<=263
*******************************************************/
void AT45DB041B_BufferWrite(uchar buffer,uint buffer_adderss,uchar *writ_pHeader,uint length)
{
uint i=0;
uchar statu_bit=0;
for(i=0;i<255;++i) //AT45DB041 busy
{
statu_bit=AT45DB041B_StatusRegisterRead();
if(testbit(statu_bit,7)) break;
}
SPI_CS_E;
switch(buffer)
{
case 1:SPI_HostWriteByte(0x84);break; //buffer 1 writ
case 2:SPI_HostWriteByte(0x87);break; //buffer 2 writ
}
SPI_HostWriteByte(0x00);
SPI_HostWriteByte((unsigned char)(buffer_adderss>>8));
SPI_HostWriteByte((unsigned char)buffer_adderss);
for(i=0;i<length;i++)
{
SPI_HostWriteByte(writ_pHeader[i]);
}
SPI_CS_D;
}
void SPI_HostWriteByte(uchar send_data)
{
SPDR=0;
SPDR=send_data;
while(!(SPSR&(1<<SPIF)));
}
uchar SPI_HostReadByte(void)
{
while(!(SPSR&(1<<SPIF)));
return SPDR;
}
AT45DB041B的模拟SPI程序
转载自牛气网站论坛,感谢szhxh的奉献
CODE:
AT45DB041B的模拟SPI程序,验证过无问题!
/*********************************************************************************
* 函数原型:unsigned char SPI_HostReadByte(void);
* 名 称:SPI_HostReadByte
* 功 能:从AT45DB041B通过SPI_SO口读入1BYTE数据
* 入口参数:无
* 出口参数:返回读入的1BYTE数据
**********************************************************************************/
unsigned char SPI_HostReadByte(void)
{
unsigned char i,rByte=0;
for(i=0;i<8;i++)
{
clr_spi_sck;
// delay_1us();
set_spi_sck;
// delay_1us();
rByte<<=1;
if(PINB&8) //m64 MISO---PB3
// if(PINB&0x40) //M16 MISO---PB6
{
rByte|=1;
}
}
return (rByte);
}
/*********************************************************************************
* 函数原型:void SPI_HostWriteByte(unsigned char wByte);
* 名 称:SPI_HostWriteByte
* 功 能:将1字节数据wByte由SPI_SI口写入AT45DB041B
* 入口参数:要写入的1BYTE数据
* 出口参数:无
**********************************************************************************/
void SPI_HostWriteByte(unsigned char wByte)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(wByte&0x80)
{
set_spi_si;
}
else
{
clr_spi_si;
}
wByte=wByte<<1;
clr_spi_sck;
// delay_1us();
set_spi_sck;
// delay_1us();
}
}
/*********************************************************************************
* 函数原型:unsigned char AT45DB041B_StatusRegisterRead(void);
* 名 称:AT45DB041B_StatusRegisterRead
* 功 能:由SPI_SI口读AT45DB041B的状态字
* 入口参数:无
* 出口参数:返回状态字
**********************************************************************************/
/*Status Register Format: */
/* ----------------------------------------------------------------------- */
/* | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 | */
/* |--------|--------|--------|--------|--------|--------|--------|--------| */
/* |RDY/BUSY| COMP | 0 | 1 | 1 | 1 | X | X | */
/* ----------------------------------------------------------------------- */
/* bit7 - 忙标记,0为忙1为不忙。 */
/* 当Status Register的位0移出之后,接下来的时钟脉冲序列将使SPI器件继续*/
/* 将最新的状态字节送出。 */
/* bit6 - 标记最近一次Main Memory Page和Buffer的比较结果,0相同,1不同。 */
/* bit5 */
/* bit4 */
/* bit3 */
/* bit2 - 这4位用来标记器件密度,对于AT45DB041B,这4位应该是0111,一共能标记 */
/* 16种不同密度的器件。 */
/* bit1 */
/* bit0 - 这2位暂时无效 */
/******************************************************************************/
unsigned char AT45DB041B_StatusRegisterRead(void)
{
unsigned char i;
clr_spi_cs;
SPI_HostWriteByte(0xd7);
i=SPI_HostReadByte();
set_spi_cs;
return (i);
}
/*********************************************************************************
* 函数原型:void AT45DB041B_ContinuousArrayRead(uint PA,uint BFA,unsigned char *pHeader,uint len);
* 名 称:AT45DB041B_ContinuousArrayRead
* 功 能:由SPI_SI口读AT45DB041B中指定首地址的数据块到数组pHeader[]
* 入口参数:
* PA - 页地址,0~2047
* BFA - 指定flash页中的起始读入地址
* rbuff - 存入指定数据的首地址
* len - 读出指定数据的长度
* 出口参数:无
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -