📄 at45db.c
字号:
#include <iom64.h>
#include <inavr.h>
//#include <eeprom.h>
#include "stdio.h"
#include "string.h"
#include "stdio.h"
#include "type.h"
#include "at45db.h"
void Init_45db161()
{
BITS_DB_CS;
BITS_DB_RST;
BITS_DB_SI;
BITS_DB_SCK;
}
U8 Read_45db161(U8* Read_Buffer,U32 Read_Addr,U8 Read_Len)
{
U16 page_addr,byte_addr;
U8 command1,command2,command3,command4;
page_addr = Read_Addr/528;
byte_addr = Read_Addr%528;
BITC_DB_SCK;
BITC_DB_CS;
command1 = 0x52;//command1 = 0x68
command2 = (page_addr>>6)&0xFF; //command2 page_addr bit11~bit6
command3 = ((page_addr<<2)&0xFC)|((byte_addr>>8)&0x03);
command4 = byte_addr&0xFF;
db161_write_byte(command1);
db161_write_byte(command2);
db161_write_byte(command3);
db161_write_byte(command4);
db161_write_byte(0);
db161_write_byte(0);
db161_write_byte(0);
db161_write_byte(0);
BITS_DB_SCK;
BITC_DB_SCK;
while(Read_Len--)
{
*Read_Buffer++ = db161_read_byte();
}
BITS_DB_CS;
return TRUE;
}
/**************************************************************************
** 函数名称: db161_write
** 功能描述: 写45DB
** 输 入: add:45D卡地址,ln:字节长度,out:数据指针
**
** 输 出: TRUE:正确
** FALSE:错误
**
** 全局变量:
** 调用模块:db161_rd_status,db161_mpgbuf1_tran,db161_buf1_wr
** db161_buf1mpg_tran,db161_mpgtobuf1_cmp
** 作 者:
** 日 期:
**---------------------------------------------------------------------------
** 修改人: 朱胜春
** 日 期: 2005年4月11日
**---------------------------------------------------------------------------
****************************************************************************/
U8 db161_write(U8 *outdata, U32 add, U16 ln)
{
//U8 xdata *aa=0XC000;
U16 page_addr,byte_addr,wr_ln;
page_addr = add/528;
byte_addr = add%528;
while (ln)
{
wr_ln = ((528 - byte_addr)<ln)? (528 - byte_addr):ln; //wr_ln:要写入的字节
if (!(db161_rd_status() & BIT7_RDY))
{
return (FALSE);
}
db161_mpgbuf1_tran(page_addr); //先读PAGE到BUF1
if (!(db161_rd_status() & BIT7_RDY) )
{
return (FALSE);
}
db161_buf1_wr(byte_addr, wr_ln, outdata); //写BUF1
db161_buf1mpg_tran(page_addr); //BUF1 ==〉PAGE
if (db161_mpgtobuf1_cmp(page_addr)==FALSE) //比较BUF1 和 PAGE
{
return (FALSE);
}
ln -= wr_ln;
outdata += wr_ln;
page_addr++;
byte_addr = 0;
}
return TRUE;
}
/**************************************************************************
** 函数名称: db161_mpgbuf1_tran
** 功能描述: main_page_memory-->buffer1
** 输 入: page_addr--页地址
**
** 输 出: void
**
**
** 全局变量:
** 调用模块:db161_write_byte
**
** 作 者:
** 日 期:
**---------------------------------------------------------------------------
** 修改人: 朱胜春
** 日 期: 2005年4月11日
**---------------------------------------------------------------------------
****************************************************************************/
void db161_mpgbuf1_tran(U16 page_add)
{
U8 command,command1,command2;
command = 0x53;
command1 = (page_add>>6)&0xff;
command2 = (page_add<<2)&0xff;
BITC_DB_CS;// = 0;
mcu_DelayUs(1);
db161_write_byte(command);
db161_write_byte(command1);
//db161_write_byte((U8)(page_add>>6));
db161_write_byte(command2);
//db161_write_byte((U8)(page_add<<2));
db161_write_byte(0);
BITS_DB_CS;// = 1;
mcu_DelayUs(20);
}
/**************************************************************************
** 函数名称: db161_buf1_wr
** 功能描述: 写buffer1
** 输 入: byte_addr--字节地址,ln--数据字节数,outdata--数据指针
**
** 输 出: void
**
**
** 全局变量:
** 调用模块:db161_write_byte
**
** 作 者:
** 日 期:
**---------------------------------------------------------------------------
** 修改人: 朱胜春
** 日 期: 2005年4月11日
**---------------------------------------------------------------------------
****************************************************************************/
void db161_buf1_wr(U16 byte_add, U16 lengh, U8 *outDATA)
{
U16 i;
U8 command,command1,command2;
command = 0x84;
command1 = (byte_add>>8)&0xff;
command2 =(char)byte_add ;//& 0xff;
//mcu_DelayUs(10);
BITC_DB_CS;// =0;
// mcu_DelayUs(5);
mcu_DelayUs(1);
db161_write_byte(command);
db161_write_byte(0);
db161_write_byte(command1);
//db161_write_byte((U8)(page_add>>8));
db161_write_byte(command2);
//db161_write_byte((U8)page_add);
for(i=0; i<lengh; i++)
{
db161_write_byte(*outDATA++);
}
BITS_DB_CS;// =1;
// mcu_DelayUs(10);
mcu_DelayUs(1);
}
/**************************************************************************
** 函数名称: db161_buf1mpg_tran
** 功能描述: buffer1-->main_page_memory
** 输 入: page_addr
**
** 输 出: void
**
**
** 全局变量:
** 调用模块:db161_write_byte
**
** 作 者:
** 日 期:
**---------------------------------------------------------------------------
** 修改人: 朱胜春
** 日 期: 2005年4月11日
**---------------------------------------------------------------------------
****************************************************************************/
void db161_buf1mpg_tran(U16 page_addr)
{
U8 command,command1,command2;
command = 0x83;
command1 = (page_addr>>6)&0xff;
command2 = (page_addr<<2)&0xff;
BITC_DB_CS;// = 0;
mcu_DelayUs(1);
db161_write_byte(command);
db161_write_byte(command1);
// db161_write_byte((uchar)(page_addr>>6));
db161_write_byte(command2);
// db161_write_byte((uchar)(page_addr<<2));
db161_write_byte(0);
BITS_DB_CS;// = 1; //CS high
// mcu_DelayUs(10);
mcu_DelayUs(1);
//return TRUE;
}
/**************************************************************************
** 函数名称: db161_mpgtobuf1_cmp
** 功能描述: 比较Main Memory Page 和 buffer1
** 输 入: page_add
**
** 输 出: TRUE:相同
** FALSE:不同
**
** 全局变量:
** 调用模块:db161_write_byte,db161_rd_status
**
** 作 者:
** 日 期:
**---------------------------------------------------------------------------
** 修改人: 朱胜春
** 日 期: 2005年4月11日
**---------------------------------------------------------------------------
****************************************************************************/
U8 db161_mpgtobuf1_cmp(U16 page_add)
{
U8 command,command1,command2;
U16 i;
command = 0x60;
command1 = (page_add>>6)&0xff;
command2 = (page_add<<2)&0xff;
BITC_DB_CS;// = 0;
mcu_DelayUs(1);
db161_write_byte(command);
//db161_write_byte((U8)(page_add>>6));
db161_write_byte(command1);
//db161_write_byte((U8)(page_add<<2));
db161_write_byte(command2);
db161_write_byte(0);
BITS_DB_CS;// = 1;
mcu_DelayUs(1);
for (i=0xffff;i>0;i--)
{
if( db161_rd_status() & BIT7_RDY )
{
if(db161_rd_status() & BIT6_COMP)
return (FALSE);
else
return (TRUE);
}
}
return (FALSE);
}
//
void mcu_DelayUs(U16 nUs)
{
U8 kk=5;
while(kk--)
while(nUs--);
}
/**************************************************************************
** 函数名称: db161_write_byte
** 功能描述: 向45DB中写一个字节
** 输 入: DATA
**
** 输 出:void
**
** 全局变量:
** 调用模块:
**
** 作 者:
** 日 期:
**---------------------------------------------------------------------------
** 修改人: 朱胜春
** 日 期: 2005年4月11日
**---------------------------------------------------------------------------
****************************************************************************/
void db161_write_byte(U8 DATA)
{
U8 i;
//__disable_interrupt();
for(i=0; i<8; i++)
{
if(DATA & 0x80)
BITS_DB_SI;// = 1;
else
BITC_DB_SI;// = 0;
//_db45161_clk_cir();
BITS_DB_SCK;// = 1;
BITC_DB_SCK;// = 0;
DATA = DATA <<1;
}
//__enable_interrupt();
}
/**************************************************************************
** 函数名称: db161_rd_status
** 功能描述: 从45DB中读当前状态
** 输 入: void
**
** 输 出:data1
**
** 全局变量:
** 调用模块:db161_write_byte,db161_read_byte
**
** 作 者:
** 日 期:
**---------------------------------------------------------------------------
** 修改人: 朱胜春
** 日 期: 2005年4月11日
**---------------------------------------------------------------------------
****************************************************************************/
U8 db161_rd_status(void)
{
U8 command,data1;
command = 0x57;//Status Register Read
BITC_DB_SCK;// =0;
BITC_DB_CS;// = 0;
mcu_DelayUs(1);
db161_write_byte(command);
//===dec=======
// _db45161_clk_cir();
BITS_DB_SCK;// = 1;
BITC_DB_SCK;// = 0;
//===dec=======
data1 = db161_read_byte();
BITS_DB_CS;// = 1;
return (data1);
}
/**************************************************************************
** 函数名称: db161_read_byte
** 功能描述: 从45DB中读一个字节
** 输 入: void
**
** 输 出:tempchar
**
** 全局变量:
** 调用模块:
**
** 作 者:
** 日 期:
**---------------------------------------------------------------------------
** 修改人: 朱胜春
** 日 期: 2005年4月11日
**---------------------------------------------------------------------------
****************************************************************************/
U8 db161_read_byte(void)
{
U8 i, tempchar=0;
BITS_DB_SO;
for(i=0; i<8; i++)
{
tempchar = tempchar << 1;
BITS_DB_SCK;// = 1;
if(PORTE&(1<<DB_SO) != 0)
tempchar +=1;
BITC_DB_SCK;// = 0;
}
return tempchar;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -