⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flash.c

📁 at45081 bsp 源码
💻 C
📖 第 1 页 / 共 4 页
字号:
//********************************************************************
//
//                       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 + -