📄 flash.c
字号:
*出口:无
*功能:从Flash中读给定个数的数据入缓冲。
*/
void ShiftOutData(uint8 *Data, uint16 Len)
{
while(Len--)
{
*Data=SPI_SendData(*Data);
Data++;
}
}
/*
*函数性质:私有
*入口:无
*出口:整合后的地址值
*功能:整合页地址与页内偏移地址。
*/
uint32 CombPageAndOffect(uint16 PageAddr, uint16 OffectInPage)
{
uint32 i;
i = PageAddr;
i <<= 10; //页地址左移10位
i &= 0xfffffc00;
i |= OffectInPage; //整合偏移量
return i;
}
/*
*函数性质:私有
*入口:无
*出口:无
*功能:按SPI的时序启动SPI
*/
void StartSPI(void)
{
IO0SET = SCK0;
IO0CLR = SSEL0;
}
/*
*函数性质:私有
*入口:无
*无口:无
*功能:停止SPI操作。
*/
void StopSPI(void)
{
IO0SET = SSEL0;
IO0SET = SCK0;
}
/*
*函数性质:公共
*入口:Flash页地址PageAddr,Flash页内的偏移量OffectInPage, 储存读入的数据缓冲Data,需要读入的数据长度Len
*出口:无
*功能:从Flash阵列中连续读数据,并将读得的数据存入到Data中。
*/
void ContinueReadFlash(uint16 PageAddr, uint16 OffectInPage, uint8 *Data, uint16 Len)
{
uint32 i;
StartSPI();
i = CombPageAndOffect(PageAddr, OffectInPage);
SPI_SendData(CON_ARRAY_READ);
SPI_SendData((uint8)(i>>16));
SPI_SendData((uint8)(i>>8));
SPI_SendData((uint8)i);
ShiftInData(Data, 4); //移入4个不相关的字节
ShiftOutData(Data,Len); //读数据。
StopSPI(); //停止SPI操作。
}
/*
*函数性质:公共
*入口:Flash页地址PageAddr,Flash页内的偏移量OffectInPage, 储存读入的数据缓冲Data,需要读入的数据长度Len
*出口:无
*功能:从Flash阵列中以页方式读数据,并将读得的数据存入到Data中。当读到一个页的尾部时,
*下一次读出的数据为页的起始数据。
*/
void PageReadFlash(uint16 PageAddr, uint16 OffectInPage, uint8 *Data, uint16 Len)
{
uint32 i;
StartSPI();
i = CombPageAndOffect(PageAddr, OffectInPage);
SPI_SendData(MEM_PAGE_READ);
SPI_SendData((uint8)(i>>16));
SPI_SendData((uint8)(i>>8));
SPI_SendData((uint8)i);
ShiftInData(Data, 4); //移入4个不相关的字节
ShiftOutData(Data,Len); //读数据。
StopSPI(); //停止SPI操作。
}
/*
*函数性质:公共
*入口:Buffer号BufNum,Buffer内的偏移量OffectInPage, 储存读入的数据缓冲Data,需要读入的数据长度Len
*出口:无
*功能:从给定的Flash缓冲中读数据,读得的数据存放到Data中。当读到缓冲的尾部时,再次读出将会读到缓冲的头部。
*/
void ReadFlashBuff(uint8 BufNum, uint16 OffectInPage, uint8 *Data, uint16 Len)
{
StartSPI();
SPI_SendData(BufNum);
SPI_SendData(BufNum); //移入一个不相关字节
SPI_SendData((uint8)(OffectInPage>>8));
SPI_SendData((uint8)OffectInPage);
SPI_SendData((uint8)OffectInPage); //移入一个不相关字节
ShiftOutData(Data,Len); //读数据。
StopSPI(); //停止SPI操作。
}
/*
*函数性质:公共
*入口:无
*出口:状态寄存器的值
*功能:读Flash的状态寄存器值。
*/
uint8 ReadFlashStuReg(void)
{
uint8 i;
StartSPI();
SPI_SendData(STU_REG_READ);
ShiftOutData(&i,1); //读取状态寄存器的值。
StopSPI(); //停止SPI操作。
return i;
}
/*
*函数性质:公共
*入口:Buffer号ucBufNum,Buffer内的偏移量OffectInPage, 储存写入的数据缓冲Data,需要写入的数据长度Len
*出口:无
*功能:往给定的Flash缓冲写数据,待写入的数据存放在Data中,当写到缓冲的尾部时,再次写入将会写入到缓冲的头部。
*/
void WriteFlashBuff(uint8 BufNum, uint16 OffectInPage, uint8 *Data, uint16 Len)
{
StartSPI();
SPI_SendData(BufNum);
SPI_SendData(BufNum); //移入一个不相关字节
SPI_SendData((uint8)(OffectInPage>>8));
SPI_SendData((uint8)OffectInPage);
ShiftInData(Data,Len); //写数据。
StopSPI(); //停止SPI操作。
}
/*
*函数性质:公共
*入口:Buffer号BufNum,Flash的页地址FlashPageAddr
*出口:无
*功能:往给定编号的Buffer数据写入到给定的Flash页,并使用内置擦除器。
*/
void WriteBuffToFlash(uint8 BufNum, uint16 FlashPageAddr)
{
StartSPI();
SPI_SendData(BufNum);
SPI_SendData((uint8)(FlashPageAddr>>6));
SPI_SendData((uint8)(FlashPageAddr<<2));
SPI_SendData(BufNum); //写入一个不相关字节。
StopSPI();
}
/*
*函数性质:公共
*入口:Buffer号BufNum,Flash的页地址FlashPageAddr
*出口:无
*功能:往给定编号的Buffer数据写入到给定的Flash页,不使用内置擦除器。
*/
void WriteBuffToFlashWithNoErase(uint8 BufNum, uint16 FlashPageAddr)
{
StartSPI();
SPI_SendData(BufNum);
SPI_SendData((uint8)(FlashPageAddr>>6));
SPI_SendData((uint8)(FlashPageAddr<<2));
SPI_SendData(BufNum); //写入一个不相关字节。
StopSPI();
}
/*
*函数性质:公共
*入口:页地址FlashPageAddr
*出口:无
*功能:页擦除Flash
*/
void FlashPageErase(uint16 FlashPageAddr)
{
StartSPI();
SPI_SendData(PAGE_ERASE);
SPI_SendData((uint8)(FlashPageAddr>>6));
SPI_SendData((uint8)(FlashPageAddr<<2));
SPI_SendData(PAGE_ERASE); //写入一个不相关字节。
StopSPI();
}
/*
*函数性质:公共
*入口:Flash块地址FlashBlockAddr
*出口:无
*功能:块擦除Flash
*/
void FlashBlockErase(uint16 FlashBlockAddr)
{
StartSPI();
SPI_SendData(BLOCK_ERASE);
SPI_SendData((uint8)(FlashBlockAddr>>3));
SPI_SendData((uint8)(FlashBlockAddr<<5));
SPI_SendData(BLOCK_ERASE); //写入一个不相关字节。
StopSPI();
}
/*
*函数性质:公共
*入口:Buffer编号BufNum,Flash页地址PageAddr,Flash页内的偏移量OffectInPage,
* 待写入的数据缓冲Data,需要写入的数据长度Len
*出口:无
*功能:本函数整合写缓冲和缓冲数据写入存储器功能,先将数据写入到给定的缓冲中,写入缓冲的偏移量
*由uiOffectInPage确定。如果写入的数据超出缓冲的范围,则自动回绕到缓冲的头部。在写缓冲完成后,
*将芯片的片选置高,则开始缓冲的数据到存储器传送。在整个写入未完成时,状态寄存器中的忙信号有效。
*/
void WriteFlashWithBuff(uint8 BufNum, uint16 PageAddr, uint16 OffectInPage, uint8 *Data, uint16 Len)
{
uint32 i;
StartSPI();
i = CombPageAndOffect(PageAddr, OffectInPage);
SPI_SendData(BufNum);
SPI_SendData((uint8)(i>>16));
SPI_SendData((uint8)(i>>8));
SPI_SendData((uint8)i);
ShiftInData(Data, Len); //写入数据
StopSPI(); //停止SPI操作。
}
/*
*函数性质:公共
*入口:Buffer编号BufNum, Flash的页地址FlashPageAddr
*出口:无
*功能:从主存储器中给定页地址读数据到给定的缓冲
*/
void ReadFlashToBuff(uint8 BufNum, uint16 FlashPageAddr)
{
StartSPI();
SPI_SendData(BufNum);
SPI_SendData((uint8)(FlashPageAddr>>6));
SPI_SendData((uint8)(FlashPageAddr<<2));
SPI_SendData(BufNum); //写入一个不相关字节。
StopSPI();
}
/*
*函数性质:公共
*入口:Buffer编号BufNum, Flash的页地址FlashPageAddr
*出口:无
*功能:比较给定的缓冲与存储器中对应页的数据。如果相等,则状态寄存器中相应的位清零,否则置位,
*在比较过程中,忙标志有效。
*/
void CompFlashAndBuff(uint8 BufNum, uint16 FlashPageAddr)
{
StartSPI();
SPI_SendData(BufNum);
SPI_SendData((uint8)(FlashPageAddr>>6));
SPI_SendData((uint8)(FlashPageAddr<<2));
SPI_SendData(BufNum); //写入一个不相关字节。
StopSPI();
}
/*
*函数性质:公共
*入口:Buffer编号BufNum,Flash页地址PageAddr,Flash页内的偏移量OffectInPage,
* 待写入的数据缓冲Data,需要写入的数据长度Len
*出口:无
*功能:自动读出给定页地址的Flash数据到给定的Buffer中,并在修改完缓冲中的数据后,自动重写入到
*相应的存储器中。在写入过程中,状态寄存器中忙标志有效。
*/
void AutoReWriteFlash(uint8 BufNum, uint16 FlashPageAddr, uint16 OffectInPage, uint8 *Data, uint16 Len)
{
StartSPI();
SPI_SendData(BufNum);
SPI_SendData((uint8)(FlashPageAddr>>6));
SPI_SendData((uint8)(FlashPageAddr<<2));
SPI_SendData(BufNum); //写入一个不相关字节。
WriteFlashBuff(BufNum, OffectInPage, Data, Len);
StopSPI();
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -