www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]首先介紹下TI的M25P16,它是16Mbit(2Mbyte)的FLASH存儲(chǔ)器,與常用的華邦公司的W25X16,ATMEL公司的AT51DB161比較接近。最高支持50M的SPI時(shí)鐘,存儲(chǔ)器可以以1到256字節(jié)byte,使用頁編程操作將2M的容量分為32個(gè)塊(Blo

首先介紹下TI的M25P16,它是16Mbit(2Mbyte)的FLASH存儲(chǔ)器,與常用的華邦公司的W25X16,ATMEL公司的AT51DB161比較接近。最高支持50M的SPI時(shí)鐘,存儲(chǔ)器可以以1到256字節(jié)byte,使用頁編程操作將2M的容量分為32個(gè)塊(Block),每個(gè)塊含有256頁,每頁里有256字節(jié)寬帶,因此整個(gè)存儲(chǔ)器包含8192頁或者2,097,152字節(jié)。操作命令為:

我們根據(jù)這些命令,做好下面封裝函數(shù):

//需要外接函數(shù)

extern unsigned char SPI_FLASH_SendByte(unsigned char ch);

extern unsigned char SPI_FLASH_ReadByte(unsigned char ch);

//高級(jí)函數(shù)

u32 SPI_FLASH_ReadID(void);//讀取芯片ID正確發(fā)回0X202015

u8 SPI_FLASH_ByteRead(u32 ReadAddr);//讀一個(gè)數(shù)據(jù)

void SPI_FLASH_BufferRead(u8* pBuffer, u32 ReadAddr, u16 NumByteToRead);

void SPI_FLASH_PageWrite(u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite);//頁寫

void SPI_FLASH_BufferWrite(u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite);

void SPI_FLASH_SectorErase(u32 SectorAddr);//扇區(qū)擦除

void SPI_FLASH_BulkErase(void);//全部擦除

void SPI_Flash_PowerDown(void); //進(jìn)入掉電模式

void SPI_Flash_WAKEUP(void);//喚醒

//底層函數(shù)

void SPI_FLASH_WriteEnable(void);

void SPI_FLASH_WriteDisable(void);

void SPI_FLASH_WaitForWriteEnd(void);

我們申請到的FLASH模塊與SPI2連接,如圖所示:


主函數(shù)里面實(shí)現(xiàn)這樣的測試功能:首先測試芯片的型號(hào),看是不是TI M25P16芯片,然后擦除扇區(qū),再寫入要測試的數(shù)據(jù),最后讀回來看是不是這些內(nèi)容。


主函數(shù)代碼:

#include "usart2.h"

#include "spi2.h"

#include "m25p16.h"

#include "led.h"

/* Private typedef -----------------------------------------------------------*/

typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;

/* Private define ------------------------------------------------------------*/

#defineFLASH_WriteAddress0x00100

#defineFLASH_ReadAddressFLASH_WriteAddress

#defineFLASH_SectorToEraseFLASH_WriteAddress

#definesFLASH_ID0x202015

#defineBufferSize (countof(Tx_Buffer)-1)

/* Private macro -------------------------------------------------------------*/

#define countof(a) (sizeof(a) / sizeof(*(a)))

/* Private variables ---------------------------------------------------------*/

uint8_t Tx_Buffer[] = "nr歡迎訪問EEFOUCS MIPS社區(qū)http://mips.eefocus.com/bbs/index_list.htmlrn SPI Flash Test Example: communication with an TI M25P16 SPI FLASHrn";

uint8_t Index, Rx_Buffer[BufferSize];

volatile TestStatus TransferStatus1 = FAILED, TransferStatus2 = PASSED;

uint32_t FlashID = 0;

/* Private function prototypes -----------------------------------------------*/

TestStatus Buffercmp(uint8_t *pBuffer1, uint8_t *pBuffer2, uint16_t BufferLength);

int main(void)

{

usart2_init(9600);

init_spi2();

LED_INIT();

/* Get SPI Flash Device ID */

FlashID = SPI_FLASH_ReadID();

printf("rn Device ID is 0x%X rn", FlashID);

if (FlashID == sFLASH_ID)

{

/* Turn on LED1 */

LED1_ON();//表明檢測到FLASH芯片

printf("rn ST M25P16 Identitied!rn");

/* Perform a write in the Flash followed by a read of the written data */

/* Erase SPI FLASH Sector to write on */

SPI_FLASH_SectorErase(FLASH_SectorToErase);

printf("Tx_Buffer:%s", Tx_Buffer);

/* Write Tx_Buffer data to SPI FLASH memory */

SPI_FLASH_BufferWrite(Tx_Buffer, FLASH_WriteAddress, BufferSize);

/* Read data from SPI FLASH memory */

SPI_FLASH_BufferRead(Rx_Buffer, FLASH_ReadAddress, BufferSize);

printf("Rx_Buffer:%s", Rx_Buffer);

/* Check the corectness of written dada */

TransferStatus1 = Buffercmp(Tx_Buffer, Rx_Buffer, BufferSize);

/* Perform an erase in the Flash followed by a read of the written data */

/* Erase SPI FLASH Sector to write on */

SPI_FLASH_SectorErase(FLASH_SectorToErase);

/* Read data from SPI FLASH memory */

SPI_FLASH_BufferRead(Rx_Buffer, FLASH_ReadAddress, BufferSize);

/* Check the corectness of erasing operation dada */

for (Index = 0; Index < BufferSize; Index++)

{

if (Rx_Buffer[Index] != 0xFF)//因?yàn)椴脸蠖紴?XFF

{

TransferStatus2 = FAILED;

break;

}

}

/* TransferStatus2 = PASSED, if the specified sector part is erased */

/* TransferStatus2 = FAILED, if the specified sector part is not well erased */

if((PASSED == TransferStatus1) && (PASSED == TransferStatus2))

{

/* OK: Turn on LED2 */

LED2_ON();

printf("rn M25P16 Test Suceed!nr");

}

else

{

LED4_ON();

printf("rn -->Failed: M25P16 Test Failed!nr");

}

}

else

{

/* Error: Turn on LED3 */

LED3_ON();

printf("rn M25P16 not detected!nr");

}

while(1);

}

TestStatus Buffercmp(uint8_t *pBuffer1, uint8_t *pBuffer2, uint16_t BufferLength)

{

while(BufferLength--)

{

if(*pBuffer1 != *pBuffer2)

{

return FAILED;

}

pBuffer1++;

pBuffer2++;

}

return PASSED;

}


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

中國北京(2025年9月10日)—— 業(yè)界領(lǐng)先的半導(dǎo)體器件供應(yīng)商兆易創(chuàng)新GigaDevice(股票代碼 603986)亮相于深圳國際會(huì)展中心舉辦的第26屆中國國際光電博覽會(huì)(展位號(hào):12C12),全面展示GD25 SPI...

關(guān)鍵字: 光通信 MCU Flash

在嵌入式系統(tǒng)中,F(xiàn)lash存儲(chǔ)器因其非易失性、高密度和低成本特性,成為代碼存儲(chǔ)和關(guān)鍵數(shù)據(jù)保存的核心組件。然而,MCU驅(qū)動(dòng)Flash讀寫時(shí),開發(fā)者常因?qū)τ布匦岳斫獠蛔慊虿僮髁鞒淌韬觯萑胄阅芟陆?、?shù)據(jù)損壞甚至硬件損壞的陷...

關(guān)鍵字: MCU驅(qū)動(dòng) Flash

June 24, 2025 ---- 近期市場對于NVIDIA RTX PRO 6000系列產(chǎn)品的討論聲量高,預(yù)期在需求支撐下,整體出貨將有不俗表現(xiàn)。然而,TrendForce集邦咨詢資深研究副總吳雅婷認(rèn)為,該系列產(chǎn)品受...

關(guān)鍵字: 存儲(chǔ)器 供應(yīng)鏈 邊緣AI

在人工智能訓(xùn)練、實(shí)時(shí)圖形渲染與科學(xué)計(jì)算領(lǐng)域,存儲(chǔ)器帶寬已成為制約系統(tǒng)性能的核心瓶頸。HBM3與GDDR7作為當(dāng)前顯存技術(shù)的兩大巔峰之作,分別通過三維堆疊與信號(hào)調(diào)制技術(shù)的突破,為不同應(yīng)用場景提供了差異化解決方案。本文從架構(gòu)...

關(guān)鍵字: 存儲(chǔ)器 HBM3

傳統(tǒng)存儲(chǔ)器技術(shù)逼近物理極限,鐵電場效應(yīng)晶體管(FeFET)憑借其獨(dú)特的極化翻轉(zhuǎn)機(jī)制與非易失性邏輯特性,成為突破馮·諾依曼架構(gòu)瓶頸的關(guān)鍵技術(shù)。FeFET通過將鐵電材料集成至晶體管柵極,實(shí)現(xiàn)了存儲(chǔ)與邏輯功能的深度融合,其物理...

關(guān)鍵字: FeFET 存儲(chǔ)器

數(shù)字化轉(zhuǎn)型與人工智能技術(shù)驅(qū)動(dòng),數(shù)據(jù)中心存儲(chǔ)架構(gòu)正經(jīng)歷從傳統(tǒng)磁盤陣列向全閃存與新型內(nèi)存技術(shù)的深度變革。全閃存陣列(AFA)憑借亞毫秒級(jí)延遲與高IOPS性能重塑存儲(chǔ)性能基準(zhǔn),而持久化內(nèi)存(PMEM)則通過填補(bǔ)DRAM與SSD...

關(guān)鍵字: 數(shù)據(jù)中心 存儲(chǔ)器

AI算力與數(shù)據(jù)中心規(guī)模持續(xù)擴(kuò)張,存儲(chǔ)器糾錯(cuò)碼(ECC)技術(shù)已成為保障數(shù)據(jù)完整性的核心防線。從硬件加速架構(gòu)到算法優(yōu)化,ECC技術(shù)正通過多維度創(chuàng)新,將內(nèi)存錯(cuò)誤率降低至每萬億小時(shí)1次以下,為關(guān)鍵任務(wù)系統(tǒng)提供接近零故障的可靠性保...

關(guān)鍵字: 存儲(chǔ)器 ECC
關(guān)閉