打印

请问:at45db081d怎么对page页addr地址写入Nbyte数据?

[复制链接]
3078|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
voidx|  楼主 | 2009-12-9 17:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
znmcu| | 2009-12-18 15:29 | 只看该作者
AT45DB161.c

#include "at45db161.h"
#include "spi.h"
/*******************************************************
        +---------------------------------------+
        | 振南电子 驱动程序模块 AT45DB161  部分 |
        +---------------------------------------+
  此源码版权属 振南 全权享有,如欲引用,敬请署名并告知
        严禁随意用于商业目的,违者必究,后果自负
         振南电子
             ->产品网站 http://www.znmcu.cn/
             ->产品网店 http://shop.znmcu.cn/
             ->产品咨询 QQ:987582714
               MSN:yzn07@126.com
                     WW:yzn07
           
********************************************************/
/******************************************************************
- 功能描述:读取AT45DB161的状态
- 隶属模块:AT45DB161模块
- 函数属性:内部
- 参数说明:无
- 返回说明:无
- 注:无
******************************************************************/
unsigned char AT45DB161_ReadStatus()
{
unsigned char status;
AT45DB161_CS=0;   
SPI_WriteByte(0xd7);
status=SPI_ReadByte();
AT45DB161_CS=1;
return status;   
}
/***********************************************************************
- 功能描述:从某一扇区的某个位置开始读取一定长度的数据,放入数据缓冲区
- 隶属模块:AT45DB161模块
- 函数属性:外部,供用户调用
- 参数说明:addr:扇区地址
             start:扇区内的起始位置
    len:要读取的数据长度
    pbuf:指向数据缓冲中的指针
- 返回说明:无
- 注:无
***********************************************************************/
void AT45DB161_ReadBytes(unsigned int addr,unsigned int start,unsigned int len,unsigned char *pbuf)
{     
unsigned int i;     
while(!(AT45DB161_ReadStatus()&0x80));
AT45DB161_CS=0;   
SPI_WriteByte(0xe8);   
SPI_WriteByte((unsigned char)(addr>>6));   
SPI_WriteByte((unsigned char)((addr<<2)|(start>>8)));
SPI_WriteByte((unsigned char)start);
for(i=0;i<4;i++) SPI_WriteByte(0x00);
for(i=0;i<len;i++) pbuf[i]=SPI_ReadByte();
AT45DB161_CS=1;
}
/***********************************************************************
- 功能描述:向某一个数据缓冲通道中从某一位置开始写入一定长度的数据
- 隶属模块:AT45DB161模块
- 函数属性:外部,供用户调用
- 参数说明:nbuf:缓冲通道
             start:扇区内的起始位置
    len:要读取的数据长度
    pbuf:指向数据缓冲中的指针
- 返回说明:无
- 注:无
***********************************************************************/
void AT45DB161_WriteBuffer(unsigned char nbuf,unsigned int start,unsigned int len,unsigned char *pbuf)
{
unsigned int i;
while(!(AT45DB161_ReadStatus()&0x80));   
AT45DB161_CS=0;   
switch(nbuf)
{
  case 1:
         SPI_WriteByte(0x84);
   break;
  case 2:
         SPI_WriteByte(0x87);
   break;
}
  SPI_WriteByte(0x00);
  SPI_WriteByte((unsigned char)(start>>8));
  SPI_WriteByte((unsigned char)start);
  for(i=0;i<len;i++) SPI_WriteByte(pbuf[i]);
  AT45DB161_CS=1;   
}
/****************************************************************************
- 功能描述:通过某一条缓冲通道将一定长度的数据写入到某一扇区中的某个位置上去
- 隶属模块:AT45DB161模块
- 函数属性:内部
- 参数说明:nbuf:缓冲通道
             start:扇区内的起始位置
    len:要写入的数据长度
    pbuf:指向数据缓冲中的指针
- 返回说明:无
- 注:无
***************************************************************************/
void AT45DB161_WriteBytes(unsigned char nbuf,unsigned int addr,unsigned int start,unsigned int len,unsigned char *pbuf)
{
AT45DB161_WriteBuffer(nbuf,start,len,pbuf);
while(!(AT45DB161_ReadStatus()&0x80));   
AT45DB161_CS=0;
switch(nbuf)
{
  case 1:
         SPI_WriteByte(0x83);
   break;
  case 2:
         SPI_WriteByte(0x86);
   break;
}
SPI_WriteByte((unsigned char)(addr>>6));
SPI_WriteByte((unsigned char)(addr<<2));
SPI_WriteByte(0x00);
AT45DB161_CS=1;
}
/****************************************************************************
- 功能描述:读取AT45DB161的扇区数据(512字节)到缓冲区
- 隶属模块:AT45DB161模块
- 函数属性:外部,供用户调用
- 参数说明:addr:扇区地址
    pbuf:指向数据缓冲中的指针
- 返回说明:无
- 注:无
***************************************************************************/
void AT45DB161_ReadSector(unsigned long addr,unsigned char *pbuf)
{
AT45DB161_ReadBytes(addr,0,512,pbuf);
}
/****************************************************************************
- 功能描述:将缓冲区中的数据写入AT45DB161的扇区(512字节)
- 隶属模块:AT45DB161模块
- 函数属性:外部,供用户调用
- 参数说明:addr:扇区地址
    pbuf:指向数据缓冲中的指针
- 返回说明:无
- 注:无
***************************************************************************/
void AT45DB161_WriteSector(unsigned long addr,unsigned char *pbuf)
{
AT45DB161_WriteBytes(1,addr,0,512,pbuf);
}


AT45DB161.h

#ifndef  _AT45DB161_H_
#define  _AT45DB161_H_
/*******************************************************
        +---------------------------------------+
        | 振南电子 驱动程序模块 AT45DB161  部分 |
        +---------------------------------------+
  此源码版权属 振南 全权享有,如欲引用,敬请署名并告知
        严禁随意用于商业目的,违者必究,后果自负
         振南电子
             ->产品网站 http://www.znmcu.cn/
             ->产品网店 http://shop.znmcu.cn/
             ->产品咨询 QQ:987582714
               MSN:yzn07@126.com
                     WW:yzn07
           
********************************************************/
#include "reg51.h"
//sbit SPI_SI   =P1^5;
//sbit SPI_SCK  =P1^7;
sbit AT45DB161_RESET=P1^0;
sbit AT45DB161_CS   =P0^0;
//sbit SPI_SO   =P1^6;
void AT45DB161_ReadBytes(unsigned int addr,unsigned int start,unsigned int len,unsigned char *pbuf);
void AT45DB161_WriteBytes(unsigned char nbuf,unsigned int addr,unsigned int start,unsigned int len,unsigned char *pbuf);
void AT45DB161_ReadSector(unsigned long addr,unsigned char *pbuf);
void AT45DB161_WriteSector(unsigned long addr,unsigned char *pbuf);
#endif

使用特权

评论回复
板凳
znmcu| | 2009-12-18 15:29 | 只看该作者
spi.c


#include "spi.h"

/*******************************************************

        +------------------------------------+
        |  振南电子  驱动程序模块  SPI  部分 |
        +------------------------------------+

  此源码版权属 振南 全权享有,如欲引用,敬请署名并告知
        严禁随意用于商业目的,违者必究,后果自负
         振南电子
             ->产品网站 http://www.znmcu.cn/
             ->产品网店 http://shop.znmcu.cn/
             ->产品咨询 QQ:987582714
               MSN:yzn07@126.com
                     WW:yzn07
           
********************************************************/

unsigned char bdata dat; //dat是可位寻址的变量

sbit dat7=dat^7;
sbit dat6=dat^6;
sbit dat5=dat^5;
sbit dat4=dat^4;
sbit dat3=dat^3;
sbit dat2=dat^2;
sbit dat1=dat^1;
sbit dat0=dat^0; //取出dat的各个位

/******************************************************************
- 功能描述:IO模拟SPI,发送一个字节
- 隶属模块:SPI模块
- 函数属性:外部,供用户调用
- 参数说明:x:要发送的字节
- 返回说明:无返回
- 注:很多情况下,SPI是需要有较高的速度的,此函数中不使用任何循环
       结构,如for(;;) while等等,并且使用了位寻址就是为了提高速度
******************************************************************/

void SPI_WriteByte(unsigned char x)
{
dat=x;  //将x赋给可位寻址的dat,这样下面可以直接得到各个位,不需要用位运算,提高效率

SPI_SI=dat7;
SPI_CLK=0;
SPI_CLK=1; //位在时钟的上升沿被写入

SPI_SI=dat6;
SPI_CLK=0;
SPI_CLK=1;

SPI_SI=dat5;
SPI_CLK=0;
SPI_CLK=1;

SPI_SI=dat4;
SPI_CLK=0;
SPI_CLK=1;

SPI_SI=dat3;
SPI_CLK=0;
SPI_CLK=1;

SPI_SI=dat2;
SPI_CLK=0;
SPI_CLK=1;

SPI_SI=dat1;
SPI_CLK=0;
SPI_CLK=1;

SPI_SI=dat0;
SPI_CLK=0;
SPI_CLK=1;
}

/******************************************************************
- 功能描述:IO模拟SPI,读取一个字节
- 隶属模块:SPI模块
- 函数属性:外部,供用户调用
- 参数说明:无
- 返回说明:读到的字节
- 注:很多情况下,SPI是需要有较高的速度的,此函数中不使用任何循环
       结构,如for(;;) while等等,并且使用了位寻址就是为了提高速度
******************************************************************/

unsigned char SPI_ReadByte()
{  
SPI_SO=1;       //51的IO在作读取时,先将其置高

SPI_CLK=1;
SPI_CLK=0;      //时钟下降沿,从设备的数据输出端(即SPI_SO)产生新数据
dat7=SPI_SO;  //直接把位写到dat的相应位上去,提高效率

SPI_CLK=1;
SPI_CLK=0;
dat6=SPI_SO;

SPI_CLK=1;
SPI_CLK=0;
dat5=SPI_SO;

SPI_CLK=1;
SPI_CLK=0;
dat4=SPI_SO;

SPI_CLK=1;
SPI_CLK=0;
dat3=SPI_SO;

SPI_CLK=1;
SPI_CLK=0;
dat2=SPI_SO;

SPI_CLK=1;
SPI_CLK=0;
dat1=SPI_SO;

SPI_CLK=1;
SPI_CLK=0;
dat0=SPI_SO;

return (dat);
}


spi.h


#ifndef  _SPI_H_
#define  _SPI_H_

/*******************************************************

        +------------------------------------+
        |  振南电子  驱动程序模块  SPI  部分 |
        +------------------------------------+

  此源码版权属 振南 全权享有,如欲引用,敬请署名并告知
        严禁随意用于商业目的,违者必究,后果自负
         振南电子
             ->产品网站 http://www.znmcu.cn/
             ->产品网店 http://shop.znmcu.cn/
             ->产品咨询 QQ:987582714
               MSN:yzn07@126.com
                     WW:yzn07
           
********************************************************/

#include "reg51.h"

sbit SPI_CLK=P1^7;  //SPI同步时钟  输出
sbit SPI_SI =P1^5;  //SPI同步数据  输出
sbit SPI_SO =P1^6;  //SPI同步数据  输入

void SPI_WriteByte(unsigned char x);
unsigned char SPI_ReadByte();

#endif

main.c


#include
#include "AT45db161.h"
#include "myfun.h"

unsigned char buf[512];

void main(void)
{
  unsigned long i;
   
  for(i=0;i<512;i++)
  {
   buf[i]=i;
  }
  AT45DB161_WriteSector(1000,buf);
  for(i=0;i<512;i++)
  {
   buf[i]=0;
  }  
  AT45DB161_ReadSector(1000,buf);
  for(i=0;i<512;i++)
  {
   P2=~buf[i];
   delay(60000);
  }  
  
  while(1);
}


使用特权

评论回复
地板
天地有源| | 2009-12-18 17:13 | 只看该作者
访问AT45DBXXXX 最好用硬件SPI接口,效率会高很多,用软件模拟SPI,速度是个大问题,因为这种芯片都写都是按page算的.

使用特权

评论回复
5
znmcu| | 2009-12-18 19:26 | 只看该作者
SPI程序部分是分立出来的,为了程序移植性强一些,可以在spi.c中对SPI进行修改,使用硬件SPI,使用SPI当然是快的。不过有的MCU没有硬件SPI,也就只能用软件的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:上官一出惊天地,   金虹一现震江湖。

35

主题

118

帖子

2

粉丝