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

📄 at45db161d.c

📁 基于ARM7处理器的中断与串口在ucos下切换的演示程序
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               
**
**--------------File Info-------------------------------------------------------------------------------
*/

/********************************************************************************************************************
** 函数名称: void SPI_Delay()						Name:	  void SD_SPIDelay()
** 功能描述: SPI总线延时							Function: SPI Bus delay 
** 输   入: INT8U value: 延时值,不超过255		    Input:	  INT8U value : delay value,do not beyond 255
** 输   出: 无										Output:	  NULL
*********************************************************************************************************************/
#include  "config.h"

void SPI_Delay(INT8U value)
{
    INT8U i;

    for (i = 0; i < value; i++)
        SPI_SendByte(0xFF);						 	/* 发送0xFF clock out 0xFF */
}

/*******************************************************************************************************************
** 函数名称: void SPI_Clk400k()					Name:	  void SPI_Clk400k()
** 功能描述: 设置SPI的时钟小于400kHZ			Function: set the clock of SPI less than 400kHZ
** 输   入: 无									Input:	  NULL
** 输   出: 无									Output:	  NULL
********************************************************************************************************************/
void SPI_Clk400k(void)
{
	SPI_SPCCR = 128;    						/* 设置SPI时钟分频值为128  Set the value of dividing frequency to 128 */
}


/*******************************************************************************************************************
** 函数名称: void SPI_ClkToMax()				Name:	  void SPI_ClkToMax()
** 功能描述: 设置SPI的clock到最大值				Function: set the clock of SPI to maximum
** 输   入: 无									Input:	  NULL
** 输   出: 无									Output:	  NULL
********************************************************************************************************************/
void SPI_ClkToMax(void)
{
	SPI_SPCCR = 8;								/* 设置SPI时钟分频值为8  Set the value of dividing frequency to 8 */
}


/*******************************************************************************************************************
** 函数名称: void SPI_SendByte()				Name:	  void SPI_SendByte()
** 功能描述: 通过SPI接口发送一个字节			Function: send a byte by SPI interface
** 输   入: INT8U byte: 发送的字节				Input:	  INT8U byte: the byte that will be send
** 输   出: 无									Output:	  NULL
********************************************************************************************************************/
void SPI_SendByte(INT8U byte)
{
	INT8U temp;

	SPI_SPDR = byte;							/* 发送数据放入SPI数据寄存器 */
   
	while(0 == (SPI_SPSR & 0x80));				/* 等待SPIF置位,即等待数据发送完毕 */
												/* wait for SPIF being set, that is, wait for finishing of data being send */
 	temp = SPI_SPDR;
}


/*******************************************************************************************************************
** 函数名称: INT8U SPI_RecByte()				Name:	  INT8U SPI_RecByte()
** 功能描述: 从SPI接口接收一个字节				Function: receive a byte from SPI interface
** 输   入: 无									Input:	  NULL
** 输   出: 收到的字节							Output:	  the byte that be received
********************************************************************************************************************/
INT8U SPI_RecByte(void)
{
	SPI_SPDR = 0xFF;
   
 	while(0 == (SPI_SPSR & 0x80));				/* 等待SPIF置位,即等待收到数据 */
												/* wait for SPIF being set, that is, wait for being received data */
	return(SPI_SPDR); 							/* 读取收到的字节 read the byte received */
}



/*******************************************************************************************************************
** 函数名称: void SPI_CS_Assert()				Name:	  void SPI_CS_Assert()
** 功能描述: 片选SPI从机						Function: select the SPI slave 
** 输   入: 无									Input:	  NULL
** 输   出: 无									Output:	  NULL
********************************************************************************************************************/
void SPI_CS_Assert(void)
{
	SPI_CS_CLR();			   					/* 片选SPI从机  select the SPI slave */  
}


/*******************************************************************************************************************
** 函数名称: void SPI_CS_Deassert()				Name:	  void SPI_CS_Deassert()
** 功能描述: 不片选SPI从机						Function: not select the SPI slave 
** 输   入: 无									Input:	  NULL
** 输   出: 无									Output:	  NULL
********************************************************************************************************************/
void SPI_CS_Deassert(void)
{
	SPI_CS_SET();			    				/* 不片选SPI从机  not select the SPI slave */
}


/*******************************************************************************************************************
** 函数名称: void DataFlash_HardWareInit()				Name:	  void SD_HardWareInit()
** 功能描述: 初始化访问SD卡的硬件条件			Function: initialize the hardware condiction that access sd card
** 输   入: 无									Input:	  NULL
** 输   出: 无									Output:	  NULL
********************************************************************************************************************/
void DataFlash_HardWareInit(void)
{ 
	
	
	SPI_INIT();									/* 初始化SPI接口      initialize SPI interface */	

	SPI_RESET_GPIO();
	SPI_WP_GPIO();
	SPI_CS_GPIO();

	SPI_RESET_OUT();

	SPI_CS_OUT();

	SPI_WP_OUT();

    SPI_RESET_CLR();

    delay(1);

	SPI_RESET_SET();

	SPI_WP_SET();
		   
   	SPI_CS_SET();								/* CS置高	  				  set CS to high voltage */

 	SPI_Clk400k();								/* 设置SPI频率小于等于400kHZ  set frequency of SPI below 400kHZ */
   
 	SPI_SPCR = (0x01 << 4) + (0x01 << 5);		/* 设置SPI接口模式,MSTR = 1,CPOL = 1,CPHA = 0,LSBF=0 */
}		

unsigned char DataFlash_ReadStatus(void)
{
    unsigned char temp;

	SPI_WP_SET();
	SPI_CS_CLR();

	SPI_SendByte(0xD7);

	
    temp = SPI_RecByte();
	

	SPI_CS_SET();

	return temp;
}

//判断FLASH是否正忙,忙为1,准备好为0
unsigned char DataFlash_isBusy(void)
{ 

    unsigned char temp;

	
	SPI_CS_CLR();

	SPI_SendByte(0xD7);	

	temp = SPI_RecByte();

	SPI_CS_SET();

	if (temp & 0x80)
	{
        return 0;
	}
	else
	{
        return 1;
	}
}

//页擦除512
void Block_Erase(unsigned long Dst)
{
	SPI_CS_CLR();			/* enable device */
	SPI_SendByte(BLOCK_ERASE);		/* send WREN command */
	
	SPI_SendByte((char)(Dst>>3));
    SPI_SendByte((char)(Dst<<5));
    SPI_SendByte(0x00);
	SPI_CS_SET();
}

//编程一个页512
void Block_Program(unsigned char * dat,unsigned int num,unsigned int startpage,unsigned int startaddr)
{
    int i;
	
	SPI_CS_CLR();
	SPI_SendByte(MM_PAGE_PROG_THROUGH_B2);
	SPI_SendByte((char)(startpage>>6));
	SPI_SendByte((char)((startpage <<2)|(startaddr >>8)));
	SPI_SendByte((char)(startaddr));
	for(i=0;i<num;i++)
	{
       SPI_SendByte((unsigned char)*(dat+i));
	}
	SPI_CS_SET();

}

//读一个页512
void Block_Read(unsigned char *dat,unsigned int num,unsigned int startpage,unsigned int startaddr)
{
    int i;

	SPI_CS_CLR();
	SPI_SendByte(0x03);
	SPI_SendByte((char)(startpage>>6));
	SPI_SendByte((char)((startpage <<2)|(startaddr >>8)));
	SPI_SendByte((char)(startaddr));
	for (i=0;i<num;i++)
	{
       *(dat+i)=SPI_RecByte();
	}
	SPI_CS_SET();

}

⌨️ 快捷键说明

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