找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3083|回复: 1
打印 上一主题 下一主题
收起左侧

2M字节的串行Flash芯片At45DB161D单片机驱动代码+头文件at45db161_drv.h

[复制链接]
跳转到指定楼层
楼主
ID:75263 发表于 2015-3-25 00:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//----------------------------------------------------------
// ATMEL串行Flash芯片At45DB161D驱动
// 采用512字节/页模式以提高代码的时间/空间效率
//----------------------------------------------------------
#include "..\include\AT89X52.H"
#include "..\include\at45db161_drv.h"

//芯片的CS信号==由P20~P22经过3-8线译码器产生的Y2
//若采用其他方式产生CS信号,应修改AT45161_CS()函数
uint CS=0xff;
void AT45161_CS(uchar v)
{
    CS |= 0x07;          //???? ?111
    if(v==0) CS &= 0xfa; //???? ?010
    P2 = CS;
}
//----------------------------------------------------------
// 字节写函数
//----------------------------------------------------------
void Flash_Byte_Write(uchar v)
{
    uchar i;
    for(i=0; i<8; i++)
    {                                       //vvvv位值=>MOSI
        if(v&0x80) AT45161_MOSI = 1;
        else       AT45161_MOSI = 0;
        AT45161_CLK = 0;            //CLK为低,准备产生上升沿
        v <<= 1;                              //准备下一个位
        AT45161_CLK = 1;   //CLK为高,产生一个上升沿,移进一位
    }
}
//----------------------------------------------------------
// 字节读函数
// 注意进入次函数之前要确保FLASH_CLK引脚为高
//----------------------------------------------------------
void Flash_Byte_Read(uchar* v)
{
    uchar i;
    *v = 0x00;
    AT45161_MISO = 0x01;                    //设置AT45161_MISO对应的Px_y为输入
    for(i=0; i<8; i++)
    {
        AT45161_CLK = 0;       //CLK为低,产生下降沿,移出一位
        (*v) <<= 1;
        if(AT45161_MISO) (*v) += 0x01;    //取移出的那一位值
        AT45161_CLK = 1;            //CLK为高,准备产生下降沿
    }
}
//----------------------------------------------------------
// 函数: Flash_Init()
// 参数:
// 说明: 复位AT45DB161芯片到512Bytes/Page模式,注意本函数仅
//       运行一次就够了
// 返回: 无
// 创建:
// 修改:
//----------------------------------------------------------
void Flash_Init()
{
    AT45161_CLK = 1;                               //CLK为高
    AT45161_CS(0);
    Flash_Byte_Write(0x3d);//设置为512字节/页模式的命令==0x3d2a80a6
    Flash_Byte_Write(0x2a);
    Flash_Byte_Write(0x80);
    Flash_Byte_Write(0xa6);
    AT45161_CS(1);
}
//----------------------------------------------------------
// 函数: Flash_Write(...)
// 参数: address:写AT45DB161D的起始地址
//       data:被写数据的缓冲区
//       nbytes:要写入的字节数
// 说明: 写一定字节的数据到AT45DB161D指定地址
// 返回: 无
// 创建:
// 修改:
// 命令格式:连续写=8位命令82H+3位任意+21位地址
//                 1000 0010  ???a aaaa aaaa aaaa aaaa aaaa
//----------------------------------------------------------
void Flash_Write(ulong address, uchar* buf, uint nbytes)
{
    uint i;
    uchar status = 0;
    AT45161_CLK = 1;                               //CLK为高
    AT45161_CS(0);
    address |= ((ulong)0x82<<24);
    for(i=0; i<4; i++)                      //4字节命令/地址
        Flash_Byte_Write((address>>(24-8*i)) &0xff);
    while(nbytes--) Flash_Byte_Write(*buf++);
    AT45161_CS(1);
    while((status & 0x80) == 0)  
    {                    //读回状态寄存器,Bit7=1说明写成功了
        AT45161_CS(0);   //注意读状态寄存器时对CS信号的要求!
        Flash_Byte_Write(0xD7);
        Flash_Byte_Read(&status);
        AT45161_CS(1);
    }
    AT45161_CS(1);
}
//----------------------------------------------------------
// 函数: Flash_Read(...)
// 参数: address:读AT45DB161D的起始地址
//       buf:数据缓冲区
//       nbytes:要读入的字节数
// 说明: 从AT45DB161D指定地址开始读一定字节数的数据到buf
// 返回: 无
// 创建:
// 修改:
// 命令格式:连续读=8位命令E8H+3位任意+21位地址+32个填充位
//                 1110 1000  ???a aaaa aaaa aaaa aaaa aaaa ....
//----------------------------------------------------------
void Flash_Read(ulong address, char* buf, uint nbytes)
{
    uchar i;
    AT45161_CLK = 1;
    AT45161_CS(0);
    address |= ((ulong)0xE8<<24);   //注意ulong强制类型转换!
    for(i=0; i<4; i++)                      //4字节命令/地址
        Flash_Byte_Write((address>>(24-8*i))&0xff);
    for(i=0; i<4; i++) Flash_Byte_Write(0xff); //4字节填充位
    while(nbytes--) Flash_Byte_Read(buf++);
    AT45161_CS(1);
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:75263 发表于 2015-3-25 00:10 | 只看该作者
下面是头文件的内容:
#ifndef __AT45DB161_DRV__
#define __AT45DB161_DRV__

#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long

#define AT45161_MISO P0_3
#define AT45161_MOSI P0_4
#define AT45161_CLK  P0_5

void Flash_Init();
void Flash_Write(ulong address, uchar* buf, uint nbytes);
void Flash_Read(ulong address, uchar* buf, uint nbytes);

#endif
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表