📄 dataflash.c
字号:
spiBuffer[0] = DF_OP_B2R;
}
else if (bufferSEL == DF_OP_B2W)
{
spiBuffer[0] = DF_OP_B1R;
}
spiBuffer[1] = 0;
spiBuffer[2] = 0; //addr MSB=0x00 -Max
spiBuffer[3] = 0; //addr LSB=0x00
spiBuffer[4] = 0; //Additional dummy
spiBuffer[5] = 0; //need this dummy?-datasheet not illuminate -Max
IO0CLR |= 0x00000001 << DF_FLASH_CS;
for (i = 0; i < 5; i++)
{
S0PDR = spiBuffer[i];
while (!(S0PSR & 0x80));
}
for (i = 0; i < DF_PAGE_SIZE; i++)
{
S0PDR = spiBuffer[5];
while (!(S0PSR & 0x80));
*returnData++ = S0PDR;
}
IO0SET |= 0x00000001 << DF_FLASH_CS;
}
/*
*******************************************************************************
* 函数功能: EEDATA单字节编程
* 说 明:
* 1. 采用main memory page to buffer x transfer命令实现FLASH回读.
* 2. 采用main memory page program through buffer x命令实现编程.
* 3. 注意判断bufferSEL,防止与FPGA下载冲突.
*******************************************************************************
*/
void df_writeDF_EEData (INT16U page_addr, INT16U byte_addr, INT8U data)
{
INT8U spiBuffer[10], i;
union {
INT8U byte[2];
INT16U word;
} temp[2];
// 等待DataFlash有效
while (!(IO0PIN & (0x00000001 << 24)));
// main memory page to buffer x transfer命令
df_mmpToBuffer (page_addr);
// 等待DataFlash有效
while (!(IO0PIN & (0x00000001 << 24)));
// main memory page program through buffer x命令
if (bufferSEL == DF_OP_B1W) //FPGA下载准备使用buffer1,则操作EEDATA使用buffer2
{
spiBuffer[0] = DF_OP_MMPB2;
}
else if (bufferSEL == DF_OP_B2W)
{
spiBuffer[0] = DF_OP_MMPB1;
}
#ifdef _AT45DB081B //Max 20060425
temp[0].word = page_addr << 1;
#endif
#ifdef _AT45DB321D
temp[0].word = page_addr << 2;
#endif
temp[1].word = byte_addr;
spiBuffer[1] = temp[0].byte[HIGH_ORDER];
spiBuffer[2] = temp[0].byte[LOW_ORDER] | temp[1].byte[HIGH_ORDER];
spiBuffer[3] = temp[1].byte[LOW_ORDER];
spiBuffer[4] = data;
IO0CLR |= 0x00000001 << DF_FLASH_CS;
for (i = 0; i < 5; i++)
{
S0PDR = spiBuffer[i];
while (!(S0PSR & 0x80));
}
IO0SET |= 0x00000001 << DF_FLASH_CS;
}
/*
*******************************************************************************
* 函数功能: EEPROM数据单字节读取
* 说 明:
* 1. 输入:
page_addr--EEPROM数据字节绝对页地址.
byte_addr--EEPROM数据字节绝对字节地址.
输出:
EEPROM数据字节.
* 2. 基本方法:
a)等待FLASH有效,发送"main memory page to buffer x transfer"命令把相
应页的内容拷贝到BUFFER中;
b)等待FLASH有效,发送"buffer x read"命令读取BUFFER中的相应字节.
* 3. 注意:
*******************************************************************************
*/
INT8U df_readDF_EEData (INT16U page_addr, INT16U byte_addr)
{
INT8U spiBuffer[10], i;
union {
INT8U byte[2];
INT16U word;
} temp;
// 等待DataFlash有效
while (!(IO0PIN & (0x00000001 << 24)));
// a)
df_mmpToBuffer (page_addr);
// 等待DataFlash有效
while (!(IO0PIN & (0x00000001 << 24)));
// b)
if (bufferSEL == DF_OP_B1W) //FPGA下载准备使用buffer1,则使用buffer2
{
spiBuffer[0] = DF_OP_B2R;
}
else if (bufferSEL == DF_OP_B2W)
{
spiBuffer[0] = DF_OP_B1R;
}
spiBuffer[1] = 0;
temp.word = byte_addr;
spiBuffer[2] = temp.byte[HIGH_ORDER]; //for AT45DB081/AT45DB161B is all ok -Max
spiBuffer[3] = temp.byte[LOW_ORDER];
spiBuffer[4] = 0; //Additional dummy
spiBuffer[5] = 0; //need this dummy?-datasheet not illuminate -Max
IO0CLR |= 0x00000001 << DF_FLASH_CS;
for (i = 0; i < 6; i++)
{
S0PDR = spiBuffer[i];
while (!(S0PSR & 0x80));
}
i = S0PDR;
IO0SET |= 0x00000001 << DF_FLASH_CS;
return (i);
}
/*
*******************************************************************************
* 函数功能: 读取FLASH PAGE到BUFFER
* 说 明:
* 1. 采用main memory page to buffer x transfer命令实现FLASH回读.
* 2. 注意判断bufferSEL,防止与FPGA下载冲突.
*******************************************************************************
*/
void df_mmpToBuffer (INT16U page_addr)
{
INT8U spiBuffer[10], i;
union {
INT8U byte[2];
INT16U word;
} temp;
// main memory page to buffer x transfer命令
if (bufferSEL == DF_OP_B1W) //FPGA下载准备使用buffer1,则操作EEDATA使用buffer2
{
spiBuffer[0] = DF_OP_MMPB2_T;
}
else if (bufferSEL == DF_OP_B2W)
{
spiBuffer[0] = DF_OP_MMPB1_T;
}
#ifdef _AT45DB081B //Max 20060425
temp.word = page_addr << 1;
#endif
#ifdef _AT45DB321D
temp.word = page_addr << 2;
#endif
// temp.word = page_addr << 1;
spiBuffer[1] = temp.byte[HIGH_ORDER];
spiBuffer[2] = temp.byte[LOW_ORDER];
spiBuffer[3] = 0;
IO0CLR |= 0x00000001 << DF_FLASH_CS;
for (i = 0; i < 4; i++)
{
S0PDR = spiBuffer[i];
while (!(S0PSR & 0x80));
}
IO0SET |= 0x00000001 << DF_FLASH_CS;
}
/*******************************************************
//函数功能:实现从flashdata里读出相应页的数据。
*通过 main memery page read 命今。
*输入:存储数据的地址指针,所要读的页码page_addr
*输出: 无
*******************************************************
*/
INT8U df_page_read( INT8U *returnData,INT16U page_addr)
{
INT8U spiBuffer[10];
INT16U i;
INT8U *p ;
union {
INT8U byte[2];
INT16U word;
} temp;
temp.word=page_addr<<2;
p = returnData ;
while (!(IO0PIN & (0x00000001 << DF_FLASH_RD))); // 等待DataFlash有效
/* //读取dataflash的状态寄存器,并判断是否为闲。
do
{
spiBuffer[0] = DF_OP_SRR;
IO0CLR |= 0x00000001 << DF_FLASH_CS;
S0PDR = spiBuffer[0];
while (!(S0PSR & 0x80)); //等待传输完成
status=S0PDR;
IO0SET |= 0x00000001 << DF_FLASH_CS;
status>>=7;
}
while(status==0);
*/
// 传送读整页命令
spiBuffer[0] = DF_OP_MMPR;
spiBuffer[1] = temp.byte[HIGH_ORDER];
spiBuffer[2] = temp.byte[LOW_ORDER];
spiBuffer[3] = 0; //addr MSB=0x00
spiBuffer[4] = 0; //Additional dummy
spiBuffer[5] = 0; //need this dummy?-datasheet not illuminate -Max
spiBuffer[6] = 0;
spiBuffer[7] = 0;
IO0CLR |= 0x00000001 << DF_FLASH_CS;
for ( i=0;i<8;i++)
{
S0PDR = spiBuffer[i];
while (!(S0PSR & 0x80));
}
// *p++ = S0PDR; //传到所指定的存储单元
for (i = 0; i < DF_PAGE_SIZE; i++)
{
S0PDR = spiBuffer[5];
while (!(S0PSR & 0x80));
spiBuffer[4] = S0PDR ;
*p++ = S0PDR;
}
IO0SET |= 0x00000001 << DF_FLASH_CS;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -