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

📄 spi2.c

📁 实现ATmel公司的支持SPI总线的存储芯片AT45DB011B的存取操作
💻 C
字号:

/***********************文件说明**************************
	本文件是把AT45中常用的功能封装成函数,以供调用,具体函数功能以及参数说明
	详见各函数前的参数;

date   : 08.4.06(last modify) 
author : zdq@hdu
any question please contact :zdq823@gmail.com

 **********************************************************/


#include <aduc834.h>
#include "..\headers\SPI.h"
sbit    AT45_CS = P3^6 ;   	  //定义控制口
#define AT45_Off   AT45_CS = 1
#define AT45_On    AT45_CS = 0

/********************************************
 函数原型:  Uchar AT45_Host_Writebyte(Uchar Send_Data)

 函数功能:  向AT45芯片写一个字节

 输入参数:  要写入AT45芯片的数据(一字节)

 返回参数:  写入的数据(为以后检测用,一般不用)
/********************************************/
Uchar AT45_Host_Writebyte(Uchar Send_Data)
     {
        SPIDAT=Send_Data;
        while(!(SPICON&0x80));
        return SPIDAT;    // 通过读SPIDAT对ISPI位清零

     }

/********************************************
 函数原型:  Uchar AT45_Status_Read(void)

 函数功能:  检测AT45芯片是否处于写就绪状态

 输入参数:  无

 返回参数:  status register 的值 
/********************************************/
Uchar  AT45_Status_Read(void)
     {
        AT45_On;                     //片选AT45DB011B
        Host_Writebyte(AT45_Staus_RD);
        Host_Writebyte(0xff);
        AT45_Off;                   //结束
        return SPIDAT;
     }
/********************************************
 函数原型:  void  SPI_Init(void)

 函数功能:  SPI 寄存器等的初始化

 输入参数:  无

 返回参数:  无
/********************************************/
void  SPI_Init(void)
     {
        SPICON=0x30;// SPI使能,主模式 ,fos/8
        AT45_Off;//初始化高电平
    /*  IT0=1;
        EX0=1;
        EA=1;
        cs=1;    */
     }
/********************************************
 函数原型:  void AT45_Buffer_Write(Uint Buffer_Adderss,Uchar Send_Data)

 函数功能:  向AT45芯片Buffer写一字节数据

 输入参数:  要写入的单元地址Buffer_Adderss(9位,264bytes),要写入的数据(单字节);

 返回参数:  无 
/********************************************/
   void AT45_Buffer_Write(Uint Buffer_Adderss,Uchar Send_Data)
{
	Uchar Statu_Bit=0;
	Uchar Flash_Busy = 1;
	while(Flash_Busy)
	{
		Statu_Bit = AT45_Status_Read();
		if((Statu_Bit & 0x80))
		{
			Flash_Busy = 0;
		}
	}
	AT45_On;                       //select AT45
    AT45_Host_Writebyte(AT45_Buf_WR);  //buffer write opcode
    AT45_Host_Writebyte(0x00);
	AT45_Host_Writebyte((unsigned char)(Buffer_Adderss>>8));
	AT45_Host_Writebyte((unsigned char)Buffer_Adderss);

      /*	for(i=0;i<length;i++)
	{
	     AT45_Host_Writebyte(Read_pHeader[i]);
	}
      */

	SPIDAT=Send_Data ;
	while(!(SPICON&0x80)) ;
	AT45_Off;  //release AT45
}
/******************************************
         读缓冲函数 (buffer read)
/******************************************/
Uchar AT45_Buffer_Read(Uint Buffer_Adderss)
{
	Uint i=0;
	Uchar Statu_Bit=0;

    AT45_On; //select at45

    AT45_Host_Writebyte(AT45_Buf_RD);  //buffer read opcode
    AT45_Host_Writebyte(0x00);
	AT45_Host_Writebyte((unsigned char)(Buffer_Adderss>>8));
	AT45_Host_Writebyte((unsigned char)Buffer_Adderss);
	AT45_Host_Writebyte(0x00); //don't care bit

      /*	for(i=0;i<length;i++)
	{
	       Read_pHeader[i]=	Host_Readbyte();
	}*/
        SPIDAT=0XFF;
        while(!(SPICON&0x80)) ;
        return SPIDAT  ;

	AT45_Off;  //release at45
}
/********************************************
         缓冲向主存写函数
/*********************************************/
void AT45_MainMemory_Buffertransfer(Uint Page_Adderss)
{
	Uchar Statu_Bit = 0;
	Uchar Flash_Busy = 0;
	while(!Flash_Busy)
	{
		Statu_Bit = AT45_Status_Read();
		if((Statu_Bit & 0x80))
		{
			Flash_Busy = 1;
		}
	}
        AT45_On ;
       AT45_Host_Writebyte(AT45_Buf2MainMem_Erase);
       AT45_Host_Writebyte((Uchar)(Page_Adderss>>7));
       AT45_Host_Writebyte((Uchar)(Page_Adderss<<1));
       AT45_Host_Writebyte(0x00);
       AT45_Off  ;
}
/********************************************
 函数原型:  AT45_Mainmemory_Write

 函数功能:  通过缓存向AT45写数据

 输入参数:  页地址(9位),块地址(9位),需写入的数据

 返回参数:  无
/********************************************/
void AT45_Mainmemory_Write(Uint Page_Address,Uint Block_Address,Uchar Sent_Data)
{
	while(!(AT45_Status_Read()&0x80)) ;
	AT45_On;
	AT45_Host_Writebyte(AT45_MainMem_ThrougBuf_WR);
	AT45_Host_Writebyte((Uchar)(Page_Address>>7));
	AT45_Host_Writebyte((Uchar)(Page_Address<<1)|(Uchar)(Block_Address>>8));
	AT45_Host_Writebyte((Uchar)(Block_Address));
    AT45_Host_Writebyte(Sent_Data) ;
	AT45_Off;
}
/*************************************
           读主存子程序
/***************************************/
Uchar AT45_Mainmemory_Read(Uint Page_Address,Uint Block_Address)

{
        while(!(AT45_Status_Read()&0x80)) ;
        AT45_On;
        AT45_Host_Writebyte(AT45_MainMem_RD);
        AT45_Host_Writebyte((Uchar)(Page_Address>>7));	//6位无关位外加页地址高2位
        AT45_Host_Writebyte((Uchar)(Page_Address<<1)|(Uchar)(Block_Address>>8));  //页地址低七位和块地址高1位
        AT45_Host_Writebyte((Uchar)Block_Address);								  //块地址低8位
        AT45_Host_Writebyte(0x00);
        AT45_Host_Writebyte(0x00);
        AT45_Host_Writebyte(0x00);
        AT45_Host_Writebyte(0x00);        //4byte don't 'care bits
        AT45_Host_Writebyte(0xff);        //送一字节的时间正好是传送读出一字节数据的时间
        AT45_Off;
        return SPIDAT;

}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -