亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

標(biāo)題: 2M字節(jié)的串行Flash芯片At45DB161D單片機(jī)驅(qū)動(dòng)代碼+頭文件at45db161_drv.h [打印本頁(yè)]

作者: niuniu    時(shí)間: 2015-3-25 00:10
標(biāo)題: 2M字節(jié)的串行Flash芯片At45DB161D單片機(jī)驅(qū)動(dòng)代碼+頭文件at45db161_drv.h
//----------------------------------------------------------
// ATMEL串行Flash芯片At45DB161D驅(qū)動(dòng)
// 采用512字節(jié)/頁(yè)模式以提高代碼的時(shí)間/空間效率
//----------------------------------------------------------
#include "..\include\AT89X52.H"
#include "..\include\at45db161_drv.h"

//芯片的CS信號(hào)==由P20~P22經(jīng)過(guò)3-8線譯碼器產(chǎn)生的Y2
//若采用其他方式產(chǎn)生CS信號(hào),應(yīng)修改AT45161_CS()函數(shù)
uint CS=0xff;
void AT45161_CS(uchar v)
{
    CS |= 0x07;          //???? ?111
    if(v==0) CS &= 0xfa; //???? ?010
    P2 = CS;
}
//----------------------------------------------------------
// 字節(jié)寫函數(shù)
//----------------------------------------------------------
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為低,準(zhǔn)備產(chǎn)生上升沿
        v <<= 1;                              //準(zhǔn)備下一個(gè)位
        AT45161_CLK = 1;   //CLK為高,產(chǎn)生一個(gè)上升沿,移進(jìn)一位
    }
}
//----------------------------------------------------------
// 字節(jié)讀函數(shù)
// 注意進(jìn)入次函數(shù)之前要確保FLASH_CLK引腳為高
//----------------------------------------------------------
void Flash_Byte_Read(uchar* v)
{
    uchar i;
    *v = 0x00;
    AT45161_MISO = 0x01;                    //設(shè)置AT45161_MISO對(duì)應(yīng)的Px_y為輸入
    for(i=0; i<8; i++)
    {
        AT45161_CLK = 0;       //CLK為低,產(chǎn)生下降沿,移出一位
        (*v) <<= 1;
        if(AT45161_MISO) (*v) += 0x01;    //取移出的那一位值
        AT45161_CLK = 1;            //CLK為高,準(zhǔn)備產(chǎn)生下降沿
    }
}
//----------------------------------------------------------
// 函數(shù): Flash_Init()
// 參數(shù):
// 說(shuō)明: 復(fù)位AT45DB161芯片到512Bytes/Page模式,注意本函數(shù)僅
//       運(yùn)行一次就夠了
// 返回: 無(wú)
// 創(chuàng)建:
// 修改:
//----------------------------------------------------------
void Flash_Init()
{
    AT45161_CLK = 1;                               //CLK為高
    AT45161_CS(0);
    Flash_Byte_Write(0x3d);//設(shè)置為512字節(jié)/頁(yè)模式的命令==0x3d2a80a6
    Flash_Byte_Write(0x2a);
    Flash_Byte_Write(0x80);
    Flash_Byte_Write(0xa6);
    AT45161_CS(1);
}
//----------------------------------------------------------
// 函數(shù): Flash_Write(...)
// 參數(shù): address:寫AT45DB161D的起始地址
//       data:被寫數(shù)據(jù)的緩沖區(qū)
//       nbytes:要寫入的字節(jié)數(shù)
// 說(shuō)明: 寫一定字節(jié)的數(shù)據(jù)到AT45DB161D指定地址
// 返回: 無(wú)
// 創(chuàng)建:
// 修改:
// 命令格式:連續(xù)寫=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字節(jié)命令/地址
        Flash_Byte_Write((address>>(24-8*i)) &0xff);
    while(nbytes--) Flash_Byte_Write(*buf++);
    AT45161_CS(1);
    while((status & 0x80) == 0)  
    {                    //讀回狀態(tài)寄存器,Bit7=1說(shuō)明寫成功了
        AT45161_CS(0);   //注意讀狀態(tài)寄存器時(shí)對(duì)CS信號(hào)的要求!
        Flash_Byte_Write(0xD7);
        Flash_Byte_Read(&status);
        AT45161_CS(1);
    }
    AT45161_CS(1);
}
//----------------------------------------------------------
// 函數(shù): Flash_Read(...)
// 參數(shù): address:讀AT45DB161D的起始地址
//       buf:數(shù)據(jù)緩沖區(qū)
//       nbytes:要讀入的字節(jié)數(shù)
// 說(shuō)明: 從AT45DB161D指定地址開(kāi)始讀一定字節(jié)數(shù)的數(shù)據(jù)到buf
// 返回: 無(wú)
// 創(chuàng)建:
// 修改:
// 命令格式:連續(xù)讀=8位命令E8H+3位任意+21位地址+32個(gè)填充位
//                 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強(qiáng)制類型轉(zhuǎn)換!
    for(i=0; i<4; i++)                      //4字節(jié)命令/地址
        Flash_Byte_Write((address>>(24-8*i))&0xff);
    for(i=0; i<4; i++) Flash_Byte_Write(0xff); //4字節(jié)填充位
    while(nbytes--) Flash_Byte_Read(buf++);
    AT45161_CS(1);
}



作者: niuniu    時(shí)間: 2015-3-25 00:10
下面是頭文件的內(nèi)容:
#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




歡迎光臨 (http://www.denmoz.com/bbs/) Powered by Discuz! X3.1