📄 flash.c
字号:
//********************************************************************
//
// flash.c
// 本文件包含所有对Flash AT45DB081 芯片操作的函数
//
//********************************************************************
//包含头文件
#include "Main.h"
#include "Struct.h"
#include "Hardware.h"
#include "Flash.h"
#include "String.h"
#include "Communication.h"
#include "ISR.h"
#include "DIM.h"
//////////////////////////////////////////////////////////////////////////
// Extern variables definitions here
extern uchar g_ucUpdateReplyMessageCommand;
extern uchar g_ucUpdateReplyMessageIndex;
extern uchar g_ucUpdateStationCommand;
extern STATION_INDEX g_ucUpdateStationIndex;
//////////////////////////////////////////////////////////////////////////
// default string defintions here
code char m_strReplyMessage[MAX_REPLY_MESSAGE_NUM][MAX_MESSAGE_LEN] =
{
"车辆抛锚,请求帮助。",
"前方堵车!",
"发生交通事故!",
"车辆严重超载!",
"车辆遇劫,请求支援。",
"设备故障,请求检修。"
"车上发生案情,请通知110。",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
""
};
// Local variables definitions
static ulong xdata m_pReadPtr;
static ulong xdata m_pFirstReadPtr;
static ulong xdata m_pWritePtr;
FLASH_RECORD xdata g_FlashReadRecord;
FLASH_RECORD xdata g_FlashWriteRecord;
// Code +PageID+pageAddr+NC Buffer, local file use only
static BYTE xdata m_ucFlashBuf[10];
/************************************************************************** */
/* 函 数 名:FLASH_RdDatFromSpi */
/* 功能描述: 从闪存读一组数据到单片机存储器 */
/* 函数说明: 最底层的函数 ,进入该函数,SPIF清零,等出去的时候SPIF=1
/* 调用函数: 无 */
/* 全局变量: 无 */
/* 输 入: * P:数据存放单片机内部首地址 */
/* count: 读取的个数 */
/* 返 回: 无 */
/******************************************************************** */
void FLASH_RdDatFromSpi(BYTE xdata *p, UINT count)
{
ulong ulTime;
while(count)
{
// 写一个空字节(为读取从器件送出SCK信号)
SPIF = 0; // clear 0
SPI0DAT = 0x00; // sending and receiving
ulTime = g_ulSecondCount;
while(SPIF == 0)
{
// waiting 1 second most
if( g_ulSecondCount - ulTime > 1 )
{
return;
}
}; // wait for send and receive ok
// 读数据
*p = SPI0DAT;
p++;
count--;
}
}
/***************************************************************************/
/* 函 数 名: FLASH_WrDatToSpi */
/* 功能描述: 从单片机内存写一组数据到闪存 */
/* 函数说明: 最底层的函数 ******进入该函数,SPIF清零,等出去的时候SPIF=1
/* 调用函数: 没有 */
/* 全局变量: 没有 */
/* 输 入: * P: 数据存放 单片机内部首地址 */
/* count: 个数 */
/* 返 回: 无
/*********************************************************************/
void FLASH_WrDatToSpi(BYTE xdata *p, UINT count)
{
ulong ulTime;
BYTE temp;
while(count)
{
SPIF = 0; //clear to 0 and send data
temp=*p;
SPI0DAT = *p;
ulTime = g_ulSecondCount;
while(SPIF == 0)
{
// waiting 1 second most
if( g_ulSecondCount - ulTime > 1 )
{
return;
}
}; // wait for send and receive ok
//SPIF has change to high=========Send OK
p++;
count=count-1;
}
}
/***************************************************************************/
/* 函 数 名: FLASH_LoadOpCode
/* 功能描述: 写操作码
/* 函数说明: 最低成函数
/* 调用函数: FLASH_WrDatToSpi
/* 全局变量: m_ucFlashBuf:用来存放操作码+地址
/* 输 入: opcode:操作码 pageID 页地址
pageAddr 页内 地址 DontCare 填充的字节数
/******************************************************************** */
void FLASH_LoadOpCode(BYTE opcode, UINT pageID, UINT pageAddr, BYTE DontCare)
{
BYTE temp;
m_ucFlashBuf[0] = opcode; //Command ID
temp = (BYTE)(pageID >> 7); // high 5 bits
m_ucFlashBuf[1] = temp & 0x1f;
temp = (BYTE)pageID; // low 7 bits
temp <<= 1;
temp &= 0xfe;
m_ucFlashBuf[2] = temp;
temp = (BYTE)(pageAddr >> 8); // high 1 bit
temp &= 0x01;
m_ucFlashBuf[2] |= temp;
m_ucFlashBuf[3] = (BYTE)pageAddr; // low 8 bits
for(temp=0; temp<DontCare; temp++)
{
m_ucFlashBuf[4+temp] = 0x00;
}
FLASH_WrDatToSpi(m_ucFlashBuf, 4+DontCare);
}
/***************************************************************************/
/* 函 数 名: FLASH_PageRead
/* 功能描述: 连续在业内循环读取数据到单片机内部存储器中
/* 函数说明:
/* 调用函数: FLASH_LoadOpCode FLASH_RdDatFromSpi
/* 全局变量:
/* 输 入:
/* 返 回: 无
/*********************************************************************/
BOOL FLASH_PageRead(UINT pageID, UINT pageAddr, BYTE xdata *dataAddr, UINT size)
{
FLASH_SELECT = 0;
Delay_us(1);
FLASH_LoadOpCode(0xd2, pageID, pageAddr, 4); // CMD+ADDR
FLASH_RdDatFromSpi(dataAddr, size); // Read
Delay_us(1);
FLASH_SELECT = 1;
Delay_us(1);
return TRUE;
}
/***************************************************************************/
/* 函 数 名: FLASH_WriteBuf1
/* 功能描述: 单片机内存中的数据写到BUFF1中
/* 函数说明:
/* 调用函数: FLASH_LoadOpCode FLASH_WrDatToSpi
/* 全局变量:
/* 输 入:
/* 返 回: 无
/*********************************************************************/
void FLASH_WriteBuf1(UINT bufAddr, BYTE xdata *dataAddr, UINT size)
{
FLASH_SELECT = 0;
Delay_us(1);
FLASH_LoadOpCode(0x84, 0x00, bufAddr, 0);
FLASH_WrDatToSpi(dataAddr, size);
Delay_us(1);
FLASH_SELECT = 1;
Delay_us(1);
}
/***************************************************************************/
/* 函 数 名: FLASH_WrBuf1ToPage
/* 功能描述: BUFF1---------->Page without buildin erase
/* 函数说明:
/* 调用函数: 特别说明:把整个BUFF1写进Page的时候没有擦除操作
/* 全局变量: FLASH_LoadOpCode
/* 输 入: pageID:页地址
/* 返 回: 无
/*********************************************************************/
void FLASH_WrBuf1ToPage(UINT pageID)
{
ulong ulStartTime;
FLASH_SELECT = 0;
Delay_us(1);
FLASH_LoadOpCode(0x88, pageID, 0x00, 0); // change from 0x83 to 0x88
Delay_us(1);
// when cs change to high,MCU begin write data from BUFF to Main Page
FLASH_SELECT = 1;
// Switch the Task, Typical Page Program time is 14ms
ulStartTime = g_ulSecondCount;
while(FLASH_READY == 0)
{
os_switch_task();
// Waiting at least 1 second
if( g_ulSecondCount - ulStartTime > 2 )
{
return;
}
}
}
/***************************************************************************/
/* 函 数 名: FLASH_RdPageToBuf1
/* 功能描述: Page---------->Buff1
/* 函数说明:
/* 调用函数:
/* 全局变量:
/* 输 入:
/* 返 回: 无
/*********************************************************************/
BOOL FLASH_RdPageToBuf1(UINT pageID)
{
ulong ulStartTime;
FLASH_SELECT = 0;
Delay_us(1);
FLASH_LoadOpCode(0x53, pageID, 0x00, 0);
Delay_us(1);
FLASH_SELECT = 1;
// 300us Page Read typical time
ulStartTime = g_ulSecondCount;
while(FLASH_READY == 0)
{
os_switch_task();
// Waiting at least 1 second
if( g_ulSecondCount - ulStartTime > 2 )
{
return FALSE;
}
}
return TRUE;
}
/***************************************************************************/
/* 函 数 名: FLASH_PageWrite
/* 功能描述: 往某一页某一个字节开始写一组数据
/* 函数说明: 高层写函数
/* 调用函数:
/* 全局变量:
/* 输 入:
/* 返 回: 无
/*********************************************************************/
BOOL FLASH_PageWrite(UINT pageID, UINT pageAddr, BYTE xdata *dataAddr, UINT size)
{
// 将page内容读到buffer(1) ->保存整页内容,防止未动内容被擦除
if( FLASH_RdPageToBuf1(pageID) == FALSE )
{
return FALSE;
}
// 将数据写到buffer(1)
// 特别说明:把整个BUFF1写进Page的时候没有擦除操作
FLASH_WriteBuf1(pageAddr, dataAddr, size);
// 将buffer(1)内容写到page
FLASH_WrBuf1ToPage(pageID);
return TRUE;
}
/****************************************************************************/
// 函 数 名: FLASH_MainMemoryPageWrite
// 功能描述: Reserved unchanged, write to buff2, Erase, then program
// 函数说明:
// 调用函数: FLASH_RdPageToBuf1 FLASH_LoadOpCode FLASH_WrDatToSpi
// 全局变量:
// 输 入:
// 返 回: 无
/***************************************************************************/
/*
BOOL FLASH_MainMemoryPageWrite(UINT pageID, UINT pageAddr,
BYTE xdata *dataAddr, UINT size)
{
if( FLASH_PAGE_SIZE - pageAddr < size )
{
return FALSE;
}
// 将page内容读到buffer(1) ->保存整页内容,防止未动内容被擦除
if( FLASH_RdPageToBuf1(pageID) == FALSE )
{
return FALSE;
}
// Select the flash
FLASH_SELECT = 0;
Delay_us(1);
// Load data to buffer2
FLASH_LoadOpCode(0x85, pageID, pageAddr, 0);
FLASH_WrDatToSpi(dataAddr, size);
Delay_us(1);
// Begin Erase and program
FLASH_SELECT = 1;
// Switch the Task, Typical Page Program time is 20ms
while(FLASH_READY == 0)
{
os_wait(K_TMO, 1, 0);
}
return TRUE;
}
*/
/***************************************************************************/
/* 函 数 名: FLASH_ReadData
/* 功能描述: 整个Flash连续读
/* 函数说明:
/* 调用函数:
/* 全局变量:
/* 输 入:
/* 返 回: 无
/*********************************************************************/
void FLASH_ReadData(ulong flAddr, BYTE xdata *dataAddr, UINT size)
{
UINT pageID;
UINT pageAddr;
UINT temp;
pageID = flAddr / FLASH_PAGE_SIZE;
pageAddr = flAddr % FLASH_PAGE_SIZE;
while(size > 0)
{
temp = FLASH_PAGE_SIZE - pageAddr; // the data number from point to page end
if(temp >= size) // can be finish reading in one page
{
temp = size;
size = 0;
}
else
{
size -= temp;
}
// temp is data number will be read this time
FLASH_PageRead(pageID, pageAddr, dataAddr, temp);
dataAddr += temp;
pageID++;
pageAddr = 0;
}
}
/***************************************************************************/
/* 函 数 名: FLASH_WriteData
/* 功能描述: 整个Flash连续写
/* 函数说明:
/* 调用函数:
/* 全局变量:
/* 输 入:
/* 返 回: 无
/*********************************************************************/
BYTE FLASH_WriteData(ulong flAddr, BYTE xdata *dataAddr, UINT size)
{
UINT pageID;
UINT pageAddr;
UINT temp;
BYTE xdata temp_flag=0;
BYTE xdata *p;
p=&temp_flag;
pageID = flAddr / FLASH_PAGE_SIZE;
pageAddr = flAddr % FLASH_PAGE_SIZE;
while(size > 0)
{
temp = FLASH_PAGE_SIZE - pageAddr;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -