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

📄 at45db081.c

📁 SPI串行总线的AT45DB081的C语言控制源程序
💻 C
字号:
/*================================================================*/
/*功能说明:            SPI总线子程序                             */
/*文件名:		SPI.C                                     */
/*相关程序说明:本程序是读写AD451803的DATAFLASH                   */
/*子程序编号:                                                     */
/*撰写人: DEALE           撰写时间:2003-12                      */
/*================================================================*/
#include "upsd3200.h"
#include "absacc.h"
#include "PortDefine.h"
#include "intrins.h"
#include "UPSDHAD.h"

xdata unsigned char Spi_Read_Buffer[264];
xdata unsigned char Spi_Write_Buffer[264];

unsigned char C_Sta;
extern void delay_nop(unsigned int delayt);
void Init_Spi()
{
	BUSY=1;
	CONTROL_B=0;
	DIRECTION_B|=0x10;
	DATAOUT_B|=0x10;
	SCK=0;
}  
//Opcode--操作命令52H
//================================================================//
/*功能说明:            SPI总线主存储器读操作子程序               */
/*函数名:             MainMemRead                                */
/*入口参数:  Page_address--页地址(12bit)                         */
/*            Byte_address--字节地址(9bit)                        */
/*            Num_data--读字节数目                                */
/*中间参数:                                                      */
/*出口参数:             	                 	          */
/*子程序编号:                                                     */
/*撰写人:                 撰写时间:2003-12 15:45                */
//================================================================//
void MainMemRead(unsigned int Page_address,unsigned int Byte_address,unsigned int Num_data)
{
  unsigned char ctrl_j,address[4];
  unsigned char Opcode=0x52;
  unsigned int  Temp_PageAdd,Temp_ByteAdd,Ctrl_Num=0;
  unsigned int  Temp_address=0x8000;		//高3位为保留字
  bit		Turn_flag=0;
//============================== 
ReadSta:
  Temp_PageAdd=Page_address; 
  Temp_ByteAdd=Byte_address;
  Temp_PageAdd&=0x0fff;
  Temp_PageAdd<<=1;
  Temp_address|=Temp_PageAdd;
  address[1]=(char)(Temp_address);
  Temp_address>>=8;
  address[0]=(char)(Temp_address);
  Temp_ByteAdd&=0x01ff;
  address[3]=(char)(Temp_ByteAdd);
  Temp_ByteAdd>>=8;
  address[2]=(char)(Temp_ByteAdd);
  address[1]|=address[2];
  while(!BUSY);
  DATAOUT_B&=0xEF;
  SpiDelay(20);	
  Senddata(0x52);
  Senddata(address[0]);  	
  Senddata(address[1]);
  Senddata(address[3]);
  for(ctrl_j=0;ctrl_j<4;ctrl_j++)Senddata(0xff);
  SpiDelay(10);
  SCK=1;
  SpiDelay(10);
  SCK=0;
  SpiDelay(10);
  for(;Ctrl_Num<Num_data;Ctrl_Num++)
  {
 	if(Byte_address==264)			//翻页操作
 	{
 		Page_address++;
 		Byte_address=0;
 		Temp_address=0x8000;
 		Turn_flag=1;
 		break;
	}
 	Spi_Read_Buffer[Ctrl_Num]=Readdata();
 	Byte_address++;
  }  			
  SpiDelay(20);
  DATAOUT_B|=0X10;
  SpiDelay(20);
  
  if(Turn_flag){Turn_flag=0;goto ReadSta;}
}

//================================================================//
/*功能说明:            SPI总线主存储器写操作子程序               */
/*函数名:             MainMemWrite                               */
/*入口参数:  Page_address--页地址(12bit)                         */
/*            Byte_address--字节地址(9bit)                        */
/*            Num_data--写字节数目                                */
/*中间参数:                                                      */
/*出口参数:             	                 	          */
/*子程序编号:                                                     */
/*撰写人:                 撰写时间:2003-12 15:45                */
//================================================================//
void MainMemWrite(unsigned int Page_address,unsigned int Byte_address,unsigned int Num_data)
{
  unsigned char address[4];
  unsigned char Opcode=0x85;
  unsigned int  Temp_PageAdd,Temp_ByteAdd,Ctrl_Num=0;
  unsigned int  Temp_address=0x8000;		//高3位为保留字
  bit Turn_flag=0;
//============================== 
WriteSta:
  Temp_PageAdd=Page_address; 
  Temp_ByteAdd=Byte_address;
  Temp_PageAdd&=0x0fff;
  Temp_PageAdd<<=1;
  Temp_address|=Temp_PageAdd;
  address[1]=(char)(Temp_address);
  Temp_address>>=8;
  address[0]=(char)(Temp_address);
  Temp_ByteAdd&=0x01ff;
  address[3]=(char)(Temp_ByteAdd);
  Temp_ByteAdd>>=8;
  address[2]=(char)(Temp_ByteAdd);
  address[1]|=address[2];
  while(!BUSY);
  DATAOUT_B&=0xEF;
  SpiDelay(20);	
  Senddata(0x55);
  Senddata(address[0]);  	
  Senddata(address[1]);
  Senddata(address[3]);
  SpiDelay(20);	
  DATAOUT_B|=0X10;
  delay_nop(60);
  while(!BUSY);
  DATAOUT_B&=0xEF;
  SpiDelay(20);	        
  Senddata(0x85);
  Senddata(address[0]);  	
  Senddata(address[1]);
  Senddata(address[3]);
//=================================================
  for(;Ctrl_Num<Num_data;Ctrl_Num++)
  {
  	if(Byte_address==264)			//翻页操作
 	{
 		Page_address++;
 		Byte_address=0;
 		Temp_address=0x8000;
 		Turn_flag=1;
 		break;
	}  	
	Senddata(Spi_Write_Buffer[Ctrl_Num]);
 	Byte_address++;
  }
  DATAOUT_B|=0X10;
  delay_nop(60);
  while(!BUSY);
  if(Turn_flag){Turn_flag=0;goto WriteSta;}
}
//===========================================
//读取动态寄存器子程序
//===========================================
/*void ReadStatus()
{
    	unsigned char Opcode=0x57;
	DATAOUT_B&=0xEF;
	SpiDelay(1);
	Senddata(Opcode);
	SpiDelay(1);
 	SCK=1;
 	SpiDelay(2);
  	SCK=0;
  	SpiDelay(1);
  	C_Sta=Readdata();
 	SpiDelay(2);
  	DATAOUT_B|=0X10;
}*/	
//================================================================//
/*功能说明:            SPI总线通用写操作子程序                   */
/*函数名:             Senddata()                                 */
/*入口参数:  Ddata--写数据                                       */
/*            Number--写位数目                                    */
/*中间参数:                                                      */
/*出口参数:             	                 	          */
/*子程序编号:                                                     */
/*撰写人:                 撰写时间:2003-12 15:45                */
//================================================================//
void Senddata(unsigned char Ddata)
{
  unsigned char ctrl_i;
    	for(ctrl_i=0;ctrl_i<8;ctrl_i++)
  	{
  		SI=(bit)(Ddata&0x80);
  		Ddata=Ddata<<1;
  		SpiDelay(1);
  		SCK=1;
  		SpiDelay(2);
  		SCK=0;
  		SpiDelay(1);
  	}
}


//================================================================//
/*功能说明:            SPI总线通用读操作子程序                   */
/*函数名:             Readdata()                                */
/*入口参数:  Ddata--写数据                                       */
/*中间参数:                                                      */
/*出口参数:             	                 	          */
/*子程序编号:                                                     */
/*撰写人:                 撰写时间:2003-12 15:45                */
//================================================================//
unsigned char Readdata()
{
  unsigned char ctrl_i,Ddata;
  	for(ctrl_i=0;ctrl_i<8;ctrl_i++)
  	{
  		SCK=1;
  		SpiDelay(1);  		
  		Ddata=Ddata<<1;  		
  		Ddata|=SO;
  		SpiDelay(1);
  		SCK=0;
  		SpiDelay(1);
  	}
  return(Ddata);	
}









void SpiDelay(unsigned char ctrl_i)
{
	for(;ctrl_i>0;ctrl_i--)
	_nop_();
}
	

⌨️ 快捷键说明

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