?? at45db161d.c
字號:
/****************************************Copyright (c)**************************************************
**
**
**--------------File Info-------------------------------------------------------------------------------
*/
/********************************************************************************************************************
** 函數(shù)名稱: 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); /* 發(fā)送0xFF clock out 0xFF */
}
/*******************************************************************************************************************
** 函數(shù)名稱: void SPI_Clk400k() Name: void SPI_Clk400k()
** 功能描述: 設(shè)置SPI的時鐘小于400kHZ Function: set the clock of SPI less than 400kHZ
** 輸 入: 無 Input: NULL
** 輸 出: 無 Output: NULL
********************************************************************************************************************/
void SPI_Clk400k(void)
{
SPI_SPCCR = 128; /* 設(shè)置SPI時鐘分頻值為128 Set the value of dividing frequency to 128 */
}
/*******************************************************************************************************************
** 函數(shù)名稱: void SPI_ClkToMax() Name: void SPI_ClkToMax()
** 功能描述: 設(shè)置SPI的clock到最大值 Function: set the clock of SPI to maximum
** 輸 入: 無 Input: NULL
** 輸 出: 無 Output: NULL
********************************************************************************************************************/
void SPI_ClkToMax(void)
{
SPI_SPCCR = 8; /* 設(shè)置SPI時鐘分頻值為8 Set the value of dividing frequency to 8 */
}
/*******************************************************************************************************************
** 函數(shù)名稱: void SPI_SendByte() Name: void SPI_SendByte()
** 功能描述: 通過SPI接口發(fā)送一個字節(jié) Function: send a byte by SPI interface
** 輸 入: INT8U byte: 發(fā)送的字節(jié) Input: INT8U byte: the byte that will be send
** 輸 出: 無 Output: NULL
********************************************************************************************************************/
void SPI_SendByte(INT8U byte)
{
INT8U temp;
SPI_SPDR = byte; /* 發(fā)送數(shù)據(jù)放入SPI數(shù)據(jù)寄存器 */
while(0 == (SPI_SPSR & 0x80)); /* 等待SPIF置位,即等待數(shù)據(jù)發(fā)送完畢 */
/* wait for SPIF being set, that is, wait for finishing of data being send */
temp = SPI_SPDR;
}
/*******************************************************************************************************************
** 函數(shù)名稱: INT8U SPI_RecByte() Name: INT8U SPI_RecByte()
** 功能描述: 從SPI接口接收一個字節(jié) Function: receive a byte from SPI interface
** 輸 入: 無 Input: NULL
** 輸 出: 收到的字節(jié) Output: the byte that be received
********************************************************************************************************************/
INT8U SPI_RecByte(void)
{
SPI_SPDR = 0xFF;
while(0 == (SPI_SPSR & 0x80)); /* 等待SPIF置位,即等待收到數(shù)據(jù) */
/* wait for SPIF being set, that is, wait for being received data */
return(SPI_SPDR); /* 讀取收到的字節(jié) read the byte received */
}
/*******************************************************************************************************************
** 函數(shù)名稱: 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 */
}
/*******************************************************************************************************************
** 函數(shù)名稱: 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 */
}
/*******************************************************************************************************************
** 函數(shù)名稱: 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(); /* 設(shè)置SPI頻率小于等于400kHZ set frequency of SPI below 400kHZ */
SPI_SPCR = (0x01 << 4) + (0x01 << 5); /* 設(shè)置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,準(zhǔn)備好為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();
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -