📄 at45db161d.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 + -