在实际项目中,遇到存储管理是比较麻烦的事情!以前也没有设计经验!这里我将详细讲解AT45DB041D数据flash的驱动程序的设计。驱动程序设计分为两部分,一是初始化:
[cpp] /*
* 函数名:void DFlashGpoiInit(void);
* 描 述:初始化数据Flash的GPIO口
*/
void DFlashGpoiInit(void){
IOCON_PIO_CFG_Type PIO_mode;
IOCON_StructInit(&PIO_mode);
PIO_mode.type = IOCON_PIO_0_14 | IOCON_PIO_0_15 |IOCON_PIO_0_16
| IOCON_PIO_0_17 | IOCON_PIO_0_18 |
IOCON_PIO_0_27; /* 配置flash的管脚为GPIO */
IOCON_SetFunc(&PIO_mode);
GPIO_SetDir(LPC_GPIO0, 14, GPIO_DIR_OUTPUT); /* 配置为输出@SCLK */
GPIO_SetDir(LPC_GPIO0, 15, GPIO_DIR_OUTPUT); /* 配置为输出@SSEL */
GPIO_SetDir(LPC_GPIO0, 16, GPIO_DIR_OUTPUT); /* 配置为输出@MOSI */
GPIO_SetDir(LPC_GPIO0, 18, GPIO_DIR_OUTPUT); /* 配置为输出@nRESET_Flash */
GPIO_SetDir(LPC_GPIO0, 27, GPIO_DIR_OUTPUT); /* 配置为输出@nWP */
GPIO_SetDir(LPC_GPIO0, 17, GPIO_DIR_INPUT); /* 配置为输入@MISO */
F_nRESET_FlashH; /* 设置复位脚为高 */
F_nWPH; /* 设置写保护为高电平 */
}
第二部就是模拟SPI完成写的操作:
[cpp]
/*
* 函 数 名:void Spi_Wirte(void)
* 功能描述:写一个8bit的数据
*/
void Spi_Wirte(uint8_t data){
uint8_t i;
for(i=0;i<8;i++){
F_SCLKL;
if((data&0x80)==0x00000080){
F_MOSIH;
}
else{
F_MOSIL;
}
data=data<<1;
F_SCLKH;
}
}
第三部就是完成读的操作:
[cpp]
/*
* The DataFlash is designed to always clock its data out on the falling edge of the SCK
* signal and clock data in on the rising edge of SCK
*/
/*
* 函 数 名:void Spi_Read(void)
* 功能描述:读一个8bit的数据
*/
uint8_t Spi_Read(void){
uint8_t temp=0,i=0;
for(i=0;i<8;i++){
F_SCLKH;
F_SCLKL;
if(GPIO_GetPinValue(SPI_PORT,IO_MISO)&0x01==1){
temp=(temp<<1)|0x01;
}
else{
temp=(temp<<1);
}
}
return temp;
}
第三部就是完成数据flash内容的读操作:
[cpp]
/*********************************************************************************
* 函数原型:void DFlash_ContinuousArrayRead(INT32U PA,INT32U BFA,unsigned char *pHeader,INT32U len);
* 名 称:DFlash_ContinuousArrayRead
* 功 能:由SPI_SI口读AT45DB041B中指定首地址的数据块到数组pHeader[]
* 入口参数:
* PA - 页地址,0~2047
* BFA - 指定flash页中的起始读入地址
* rbuff - 存入指定数据的首地址
* len - 读出指定数据的长度
* 出口参数:无
**********************************************************************************/
void DFlash_ContinuousArrayRead(uint32_t PA,uint32_t BFA,uint8_t *pHeader,uint32_t len)
{
uint8_t i=0,j=0;
while(i++<255)
{
if(DFlash_RegisterStatusRead()&0x80)