⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 at45db.c

📁 基于EWAVR平台下at45DB161、at45DB321驱动
💻 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 + -