Arduino SPI + SPI Flash芯片W25Q80BV
W25Q80BV是臺(tái)灣華邦電子(Winbond)生產(chǎn)的8M-bit串行flash芯片。主要特性有:
- 工作電壓:2.5 ~ 3.6 V
- 功耗:讀寫(active)時(shí)4mA,低功耗(power-down)時(shí)<1μA
- 容量:8M-bit/1M-byte,包含4096個(gè)頁(yè)(每頁(yè)大小256字節(jié))
- 接口:Standard/Dual/Quad SPI,支持時(shí)鐘頻率最高104MHz
- 支持以4/32/64k-bytes為單位進(jìn)行Sector/Block擦除
- 一次寫入最多256字節(jié)
- 軟件/硬件寫保護(hù)功能
- 大于10萬(wàn)次擦除/編程壽命
- 大于20年的數(shù)據(jù)保存時(shí)間
- 封裝:SOIC/USON/WSON/PDIP
管腳定義
與Arduino的連接
采用工作于3.3V的Pro Mini版本進(jìn)行簡(jiǎn)單調(diào)試,接法如下。
其中HOLD腳須上拉接到3.3V,否則器件無(wú)法正常工作;WP腳可以浮空。
W25Q80BV Pro Mini (3.3V/8MHz)
VCC <------> 3.3V
GND <------> GND
/CS <------> SS (D10)
DI <------> MOSI (D11)
DO <------> MISO (D12)
CLK <------> SCK (D13)
功能調(diào)試
與I2C不同,利用SPI庫(kù)操作時(shí),讀和寫都用同一個(gè)函數(shù)SPI.transfer()實(shí)現(xiàn)。
讀取時(shí),可以任意地址、任意長(zhǎng)度進(jìn)行讀取。
與EEPROM不同,SPI Flash寫入前,需要對(duì)寫入的存儲(chǔ)空間進(jìn)行擦除(Erase)操作,否則寫入不成功。芯片支持Chip Erase(整片擦除)、Block Erase(32K bytes/64K bytes塊擦除)和Sector Erase(4K bytes扇區(qū)擦除)。
當(dāng)寫操作對(duì)應(yīng)的地址空間到達(dá)page的邊界,再繼續(xù)寫入時(shí)目的地址會(huì)自動(dòng)roll over到本頁(yè)的起始位置。
測(cè)試代碼
1 /*2 communication with W25Q80BV (1 MBYTE SPI FLASH) using Arduino Pro Mini 3.3V/8MHz3 Reference: http://www.instructables.com/id/How-to-Design-with-Discrete-SPI-Flash-Memory/?ALLSTEPS4 */5 6 // the SPI bus uses pins 10 (SS), 11 (MOSI), 12 (MISO), and 13 (SCK)7 8 #include <SPI.h>9 10 #define READ_JEDEC_ID 0x9F11 #define READ_STATUS_1 0x0512 #define READ_DATA 0x0313 #define WRITE_ENABLE 0x0614 #define PAGE_PROGRAM 0x0215 #define CHIP_ERASE 0xC716 17 byte pageBuffer[256];18 char str[] = "An apple a day keeps the doctor away."; //short than 25619 20 void setup()21 {22 SPI.begin();23 SPI.setDataMode(SPI_MODE0);24 SPI.setBitOrder(MSBFIRST);25 Serial.begin(9600);26 27 ReadID();28 EraseChip();29 WritePage(0x1234, str, sizeof(str));30 }31 32 void loop()33 {34 ReadPage(0x1234, pageBuffer, sizeof(str));35 36 for(int i = 0; i < sizeof(str); i++)37 {38 Serial.print(char(pageBuffer[i]));39 }40 Serial.println();41 42 delay(2000);43 }44 45 void CheckBusy()46 {47 digitalWrite(SS, HIGH);48 digitalWrite(SS, LOW);49 SPI.transfer(READ_STATUS_1);50 while(SPI.transfer(0) & 0x01); 51 digitalWrite(SS, HIGH);52 }53 54 void ReadID()55 {56 digitalWrite(SS, HIGH);57 digitalWrite(SS, LOW);58 SPI.transfer(READ_JEDEC_ID);59 byte manuID = SPI.transfer(0);60 byte memoType = SPI.transfer(0);61 byte capa = SPI.transfer(0);62 digitalWrite(SS, HIGH);63 64 Serial.print("Manufacturer ID: "); Serial.println(manuID, HEX);65 Serial.print("Memory Type: "); Serial.println(memoType, HEX);66 Serial.print("Capacity : "); Serial.println(capa, HEX);67 68 CheckBusy();69 }70 71 void ReadPage(word pageNumber, byte pageBuffer[], int length) 72 {73 // pageNumber: 16-bit data74 digitalWrite(SS, HIGH);75 digitalWrite(SS, LOW);76 SPI.transfer(READ_DATA);77 SPI.transfer((pageNumber >> 8) & 0xFF);78 SPI.transfer(pageNumber & 0xFF);79 SPI.transfer(0);80 for(int i = 0; i < length; i++)81 {82 pageBuffer[i] = SPI.transfer(0);83 }84 digitalWrite(SS, HIGH);85 CheckBusy();86 }87 88 void WritePage(word pageNumber, char pageBuffer[], int length) 89 {90 digitalWrite(SS, HIGH);91 digitalWrite(SS, LOW); 92 SPI.transfer(WRITE_ENABLE);93 digitalWrite(SS, HIGH);94 digitalWrite(SS, LOW); 95 SPI.transfer(PAGE_PROGRAM);96 SPI.transfer((pageNumber >> 8) & 0xFF);97 SPI.transfer(pageNumber & 0xFF);98 SPI.transfer(0);99 for(int i = 0; i < length; i++) 100 { 101 SPI.transfer(byte(pageBuffer[i])); 102 } 103 digitalWrite(SS, HIGH); 104 CheckBusy(); 105 } 106 107 void EraseChip() 108 { 109 digitalWrite(SS, HIGH); 110 digitalWrite(SS, LOW); 111 SPI.transfer(WRITE_ENABLE); 112 digitalWrite(SS, HIGH); 113 digitalWrite(SS, LOW); 114 SPI.transfer(CHIP_ERASE); 115 digitalWrite(SS, HIGH); 116 CheckBusy(); 117 }View Code
讀取芯片的ID信息,向W25Q80BV寫入一段字符串,再將寫入的信息反復(fù)讀出:
參考資料
W25Q80BV datasheet - Winbond
Arduino - SPI
Designing with Discrete SPI Flash Memory - Instructables
Flash芯片硬件特性
轉(zhuǎn)載于:https://www.cnblogs.com/zlbg/p/4246721.html
總結(jié)
以上是生活随笔為你收集整理的Arduino SPI + SPI Flash芯片W25Q80BV的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: GPU performance tunn
- 下一篇: Android设备获取扫码枪扫描内容