📄 at45db161d.c
字号:
/****************************************Copyright (c)**************************************************
** 上海三浪电子科技有限公司
**
** http://www.san-lang.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: at45db041.c
**创 建 人: 杨春华
**最后修改日期: 2008年6月11日
**描 述: μCOS-II下at45db041应用程序头文件
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 杨春华
** 版 本: v1.0
** 日 期: 2008年6月11日
** 描 述: 原始版本
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define AT45DB161D_GLOBAL
#include "main.h"
/*
学问之美,在于使人一头雾水;
诗歌之美,在于煽动男女出轨;
女人之美,在于傻得无怨无悔;
男人之美,在于谎话说得白天见鬼 !
*/
/*
****************************************************************************************************
* 描述: SPI口初始化(GPIO配置、控制参数)。
* 函数原型: void SPI_Init(void)
* 入口参数:
* 出口参数:
* 附加信息: 工作模式=主,移位方向=MSB在先,CPOL=1,CPHA=0;
****************************************************************************************************
*/
void SPIInit(void)
{
PCONP |=0x01<<8;
IO0DIR |= 0x00000001<<16; //SPI_CS
AT45DB161D_Disable();
S0SPCCR = 0x08; // 设置SPI时钟分频
S0SPCR = 0x30; // 设置SPI接口模式,MSTR=1,CPOL=1,CPHA=0,LSBF=0
}
/*
****************************************************************************************************
* 描述: 读取AT45DB161D状态寄存器
* 函数原型: uint8 AT45DB161D_ReadRegister(void)
* 入口参数:
* 出口参数: 返回状态寄存器的值
* 附加信息:
****************************************************************************************************
*/
uint8 AT45DB161D_ReadRegister(void)
{
AT45DB161D_Enable(); // 片选
S0SPDR = 0x57;
while (0 == (S0SPSR&0x80)); // 等待SPIF置位,即等待数据发送完毕
S0SPDR = 0xff;
while (0 == (S0SPSR&0x80));
AT45DB161D_Disable();
return S0SPDR;
}
/*
****************************************************************************************************
* 描述: AT45DB161D主存储页转存到缓冲
* 函数原型: void AT45DB161D_MMPTB(uint16 PageNum)
* 入口参数: PgaeNum ---- 页地址
* 出口参数:
* 附加信息:
****************************************************************************************************
*/
void AT45DB161D_MMPTB(uint16 PageNum)
{
AT45DB161D_Enable(); // 片选
S0SPDR = 0x53;
while (0 == (S0SPSR&0x80)); // 等待SPIF置位,即等待数据发送完毕
S0SPDR = (uint8)(PageNum>>8);
while (0 == (S0SPSR&0x80));
S0SPDR = (uint8)PageNum;
while (0 == (S0SPSR&0x80));
S0SPDR = 0x00;
while (0 == (S0SPSR&0x80));
AT45DB161D_Disable();
while(!(AT45DB161D_ReadRegister()&0x80)); //器件忙等待(主内存至缓存转存)
}
/*
****************************************************************************************************
* 描述: AT45DB161D页写
* 函数原型: uint8 AT45DB161D_WritePage(uint16 PageNum,uint8 *ptr)
* 入口参数: PgaeNum ---- 页地址
* *ptr ---- 存储的数据指针
* 出口参数:
* 附加信息: AT45DB041页写(256Byte)采用主内存页编程方式,利用0x82缓存1(0x85缓存2)进行操作。
****************************************************************************************************
*/
void AT45DB161D_WritePage(uint16 PageNum,uint8 *ptr)
{
uint16 i;
PageNum = (PageNum&0x07ff) << 1;
while(!(AT45DB161D_ReadRegister()&0x80)); //器件忙等待
AT45DB161D_Enable(); // 片选
//WaitTimer(0);
S0SPDR = 0x82;
while (0 == (S0SPSR&0x80)); // 等待SPIF置位,即等待数据发送完毕
S0SPDR = (uint8)(PageNum>>8);
while (0 == (S0SPSR&0x80));
S0SPDR = (uint8)PageNum;
while (0 == (S0SPSR&0x80));
S0SPDR = 0x00;
while (0 == (S0SPSR&0x80));
for (i=0;i<256;i++){ //数据传送
S0SPDR = *ptr++;
while (0 == (S0SPSR&0x80));
}
AT45DB161D_Disable();
}
/*
****************************************************************************************************
* 描述: AT45DB161D随机写
* 函数原型: void AT45DB161D_WriteRandom(uint16 PageNum,uint16 PageAdd,uint8 len,uint8 *ptr)
* 入口参数: PgaeNum ---- 页地址
* PageAdd ---- 页内地址
* len ---- 数据长度
* *ptr ---- 存储的数据指针
* 出口参数:
* 附加信息:
****************************************************************************************************
*/
void AT45DB161D_WriteRandom(uint16 PageNum,uint8 PageAdd,uint8 len,uint8 *ptr)
{
PageNum = (PageNum&0x07ff) << 1;
while(!(AT45DB161D_ReadRegister()&0x80)); //器件忙等待
/*主内存至缓存转存*/
AT45DB161D_MMPTB(PageNum);
/*主内存页编程*/
AT45DB161D_Enable(); // 片选
S0SPDR = 0x82;
while (0 == (S0SPSR&0x80)); // 等待SPIF置位,即等待数据发送完毕
S0SPDR = (uint8)(PageNum>>8);
while (0 == (S0SPSR&0x80));
S0SPDR = (uint8)PageNum;
while (0 == (S0SPSR&0x80));
S0SPDR = PageAdd;
while (0 == (S0SPSR&0x80));
while (len--){ //数据传送
S0SPDR = *ptr++;
while (0 == (S0SPSR&0x80));
}
AT45DB161D_Disable();
}
/*
****************************************************************************************************
* 描述: AT45DB161D读操作
* 函数原型: void AT45DB161D_ReadData(uint16 PageNum,uint8 PageAdd,uint16 len,uint8 *ptr)
* 入口参数: PgaeNum ---- 页地址
* PageAdd ---- 页内地址
* len ---- 数据长度
* *ptr ---- 存储的数据指针
* 出口参数:
* 附加信息: 采用主内存页读取
****************************************************************************************************
*/
void AT45DB161D_ReadData(uint16 PageNum,uint8 PageAdd,uint16 len,uint8 *ptr)
{
PageNum = (PageNum&0x07ff) << 1;
while(!(AT45DB161D_ReadRegister()&0x80)); //器件忙等待
AT45DB161D_Enable(); // 片选
S0SPDR = 0x52;
while (0 == (S0SPSR&0x80)); // 等待SPIF置位,即等待数据发送完毕
S0SPDR = (uint8)(PageNum>>8);
while (0 == (S0SPSR&0x80));
S0SPDR = (uint8)PageNum;
while (0 == (S0SPSR&0x80));
S0SPDR = PageAdd;
while (0 == (S0SPSR&0x80));
S0SPDR = 0x00;
while (0 == (S0SPSR&0x80));
S0SPDR = 0x00;
while (0 == (S0SPSR&0x80));
S0SPDR = 0x00;
while (0 == (S0SPSR&0x80));
S0SPDR = 0x00;
while (0 == (S0SPSR&0x80));
while (len--){
S0SPDR = 0xff;
while (0 == (S0SPSR&0x80)); //数据读取
*ptr++ = S0SPDR ;
}
AT45DB161D_Disable();
}
/*
****************************************************************************************************
* 描述:
* 函数原型:
* 入口参数:
* 出口参数:
* 附加信息:
****************************************************************************************************
*/
/*
****************************************************************************************************
* 描述:
* 函数原型:
* 入口参数:
* 出口参数:
* 附加信息:
****************************************************************************************************
*/
/*
****************************************************************************************************
* 描述: AT45DB161D随机写
* 函数原型: INT16U AT45DB161D_PageWrite(INT16U add, INT8U *ptr, INT16U len)
* 入口参数:
* 出口参数: 返回写出的数据长度
* 附加信息:
****************************************************************************************************
*/
uint16 AT45DB161D_PageWrite(uint32 add, uint8 *ptr, uint16 len)
{
INT16U PageNum,PageAdd,wdlen,i;
PageNum = ((add/AT45DB161DPageSize)&0x0fff) << 2;
PageAdd = add%AT45DB161DPageSize;
wdlen = AT45DB161DPageSize - PageAdd;
if (wdlen > len){
wdlen = len;
}
while(!(AT45DB161D_ReadRegister()&0x80)); //器件忙等待
/*主内存至缓存转存*/
if (PageAdd){
AT45DB161D_MMPTB(PageNum);
}
/*主内存页编程*/
AT45DB161D_Enable(); // 片选
S0SPDR = 0x82;
while ((S0SPSR&0x80) == 0); // 等待SPIF置位,即等待数据发送完毕
S0SPDR = (INT8U)(PageNum>>8);
while ((S0SPSR&0x80) == 0);
S0SPDR = ((INT8U)(PageNum)) +((uint8 )(PageAdd>>8));
while ((S0SPSR&0x80) == 0);
S0SPDR = (INT8U)PageAdd;
while ((S0SPSR&0x80) == 0);
for (i=0; i<wdlen; i++){ //数据传送
S0SPDR = *ptr++;
while ((S0SPSR&0x80) == 0);
}
AT45DB161D_Disable();
/*
DF_SELECT_1;
write_SPI(MM_PAGE_TO_B1_XFER);
write_SPI((unsigned char)(page >> 6));
write_SPI((unsigned char)(page << 2));
write_SPI(0x00);
DF_DESELECT_1;
DF_wait_busy();
DF_SELECT_1;
write_SPI(BUFFER_1_READ);
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
for (i=0;i<528;i++)
{
write_SPI(0xFF);
DF_buffer[i] = SPDR;
}
*/
return wdlen;
}
/*
****************************************************************************************************
* 描述: AT45DB161D读操作
* 函数原型: INT16U AT45DB161D_PageRead(INT16U add, INT8U *ptr, INT16U len)
* 入口参数:
* 出口参数: 返回读出的数据长度
* 附加信息: 采用主内存页读取
****************************************************************************************************
*/
uint16 AT45DB161D_PageRead(uint32 add, uint8 *ptr, uint16 len)
{
INT16U PageNum,PageAdd,wdlen,i;
PageNum = ((add/AT45DB161DPageSize)&0x0fff) << 2;
PageAdd = add%AT45DB161DPageSize;
wdlen = AT45DB161DPageSize - PageAdd;
if (wdlen > len){
wdlen = len;
}
while(!(AT45DB161D_ReadRegister()&0x80)); //器件忙等待
AT45DB161D_Enable(); // 片选
S0SPDR = 0x52;
while ((S0SPSR&0x80) == 0); // 等待SPIF置位,即等待数据发送完毕
S0SPDR = (INT8U)(PageNum>>8);
while ((S0SPSR&0x80) == 0);
S0SPDR = ((INT8U)(PageNum)) +((uint8 )(PageAdd>>8));
while ((S0SPSR&0x80) == 0);
S0SPDR = PageAdd;
while ((S0SPSR&0x80) == 0);
S0SPDR = 0x00;
while ((S0SPSR&0x80) == 0);
S0SPDR = 0x00;
while ((S0SPSR&0x80) == 0);
S0SPDR = 0x00;
while ((S0SPSR&0x80) == 0);
S0SPDR = 0x00;
while ((S0SPSR&0x80) == 0);
for (i=0;i<wdlen;i++){
S0SPDR = 0xff;
while ((S0SPSR&0x80) == 0); //数据读取
*ptr++ = S0SPDR ;
}
AT45DB161D_Disable();
return wdlen;
}
/*
****************************************************************************************************
* 描述: AT45DB161D写
* 函数原型: void AT45DB161D_Write(INT32U add, INT8U *ptr, INT16U len)
* 入口参数:
* 出口参数:
* 附加信息:
****************************************************************************************************
*/
void AT45DB161D_Write(uint32 add, uint8 *ptr, uint16 len)
{
INT16U wdlen;
while (len){
wdlen = AT45DB161D_PageWrite(add,ptr,len);
add += wdlen;
ptr += wdlen;
len -= wdlen;
}
}
/*
****************************************************************************************************
* 描述:
* 函数原型: void AT45DB161D_Read(INT32U add, INT8U *ptr, INT16U len)
* 入口参数:
* 出口参数:
* 附加信息:
****************************************************************************************************
*/
void AT45DB161D_Read(uint32 add, uint8 *ptr, uint16 len)
{
INT16U wdlen;
while (len){
wdlen = AT45DB161D_PageRead(add,ptr,len);
add += wdlen;
ptr += wdlen;
len -= wdlen;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -