久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3535|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美精| 精品国产视频 | 国产成人综合亚洲欧美94在线 | 亚洲一区二区三区在线播放 | 人干人操 | 精品在线一区二区三区 | 777777777亚洲妇女 | 天天操天天干天天爽 | 国产精品乱码一区二区三区 | 超碰日本 | 97伦理影院 | 中文字幕第十页 | 伊人精品在线视频 | 成人av在线大片 | 三级成人在线 | 日本中文字幕日韩精品免费 | 久久99精品久久久久久国产越南 | 久久中文字幕一区 | 国内精品视频在线 | 色姑娘av | 国产在线观看福利 | 亚洲欧美一区二区三区国产精品 | 国产成人免费视频 | 狠狠爱综合网 | 免费一区二区在线观看 | 中文字幕一区二区三区日韩精品 | 91精品国产综合久久久久 | 一区二区在线不卡 | 亚洲一区二区三区高清 | 成人网av| 暴草美女 | 日本不卡一区二区三区在线观看 | 日韩在线观看一区 | 米奇成人网 | 一区在线视频 | 影音先锋中文字幕在线观看 | 日韩在线免费 | 亚洲精品久久久久中文字幕二区 | 亚洲欧美激情网 | 天堂网avav| 成人av一区二区三区 |