⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 avr的at45db041读写程序.txt

📁 AT45DB161D芯片的读写驱动程序,有多款程序,包括有51,AVR,MSP430等,需要的朋友可以拿去看看,很有帮助.
💻 TXT
📖 第 1 页 / 共 2 页
字号:
/*******************************************************
描述: 主 存读取指定页地址与字节地址固写长度

参数: 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 + -