【雕爺學編程】Arduino動手做(50)---W25Q64存儲模塊


37款傳感器與模塊的提法,在網絡上廣泛流傳,其實Arduino能夠兼容的傳感器模塊肯定是不止37種的。鑒於本人手頭積累了一些傳感器和模塊,依照實踐(動手試試)出真知的理念,以學習和交流為目的,這里准備逐一做做實驗,不管能否成功,都會記錄下來---小小的進步或是搞不掂的問題,希望能夠拋磚引玉。 

【Arduino】168種傳感器模塊系列實驗(資料+代碼+圖形+仿真)

實驗五十:W25Q64 64Mbit FLASH外擴存儲模塊 (DataFlash SPI接口 )

 

W25X64 
該系列是華邦公司推出的大容量SPI  FLASH 產品,W25X64 的容量為 64Mbit(8M),該系列還有 W25Q80/16/32 等W25X16、W25X32、W25X64分別有8192、16384、32768個可編程頁,每頁256字節,用扇區擦除指令每次可以擦除16頁,用塊擦除指令每次可以擦除256頁,用整片擦除指令既可以擦除整個芯片,W25X16、W25X32、W25X64分別有512、1024、2048個可擦除扇區,或者32、64、128個可擦除的塊。W25Q64 的擦寫周期多達 10W 次,具有 20 年的數據保存期限,支持電壓為 2.7~3.6V,W25Q64 支持標准的 SPI,還支持雙輸出/四輸出的 SPI,最大 SPI 時鍾可以到 80Mhz(雙輸出時相當於 160Mhz,四輸出時相當於 320M)。

SPI總線
SPI,是英語Serial Peripheral Interface的縮寫,顧名思義就是串行外圍設備接口。SPI,是一種高速的,全雙工,同步的通信總線,並且在芯片的管腳上只占用四根線,節約了芯片的管腳,同時為PCB的布局上節省空間,提供方便,正是出於這種簡單易用的特性,現在越來越多的芯片集成了這種通信協議。SPI是一個環形總線結構,由ss(cs)、sck、sdi、sdo構成,其時序其實很簡單,主要是在sck的控制下,兩個雙向移位寄存器進行數據交換。上升沿發送、下降沿接收、高位先發送。上升沿到來的時候,sdo上的電平將被發送到從設備的寄存器中。下降沿到來的時候,sdi上的電平將被接收到主設備的寄存器中。

SPI總線是Motorola公司推出的三線同步接口,同步串行3線方式進行通信:一條時鍾線SCK,一條數據輸入線MOSI,一條數據輸出線MISO;用於 CPU與各種外圍器件進行全雙工、同步串行通訊。SPI主要特點有:可以同時發出和接收串行數據;可以當作主機或從機工作;提供頻率可編程時鍾;發送結束中斷標志;寫沖突保護;總線競爭保護等。

SPI 數據速率一般在1到70MHz的范圍內,字長為從8位及12位到這兩個值的倍數。數據傳輸一般由數據交換構成。在主控制器向從設備發送數據時,從設備也向主控制器發送數據。因此主控制器的內部移位寄存器和從設備都采用環形設置。在數據交換之前,主控制器和從設備會將存儲器數據加載至它們的內部移位寄存器。收到時鍾信號后,主控制器先通過MOSI線路時鍾輸出其移位寄存器的MSB。同時從設備會讀取位於SIMO的主控器第一位元,將其存儲在存儲器中,然后通過SOMI時鍾輸出其MSB。主控制器可讀取位於MISO的從設備第一位元,並將其存儲在存儲器中,以便后續處理。整個過程將一直持續到所有位元完成交換,而主控器則可讓時鍾空閑並通過/SS 禁用從設備。

在 SPI 中,主控制器可與單個或多個從設備通信。如果是一個單從設備,從設備選擇信號可連接至從設備的本地接地電位,實現永久接入。對使用多個從設備的應用,可使用兩種配置:獨立從設備與菊花鏈從設備。要與從設備單獨通信,主控制器必須提供多重從設備選擇信號。該配置通常用於必須單獨訪問多個模數轉換器 (ADC) 及數模轉換器 (DAC) 的數據采集系統中。菊花鏈從設備只需要主控制器提供一個從設備選擇信號,因為這種配置要求所有從設備同時啟用,以確保數據不間斷地流經該鏈路中的所有移位寄存器。典型應用是工業 I/O 模塊中的級聯多通道輸入串行器與輸出驅動器。注意,菊花鏈連接不一定適用於所有的SPI設備,特別是要求多字節傳輸的(比如存儲器芯片)設備。另外,要對外設芯片的數據表進行仔細分析,確定能對它做什么而不能做什么。如果芯片的數據表中沒有明確提到菊花鏈連接,那么該芯片不支持這種連接的幾率為50%。

W25Q64FWSSIG參數
功能數量        1 端子數量        8 
最大工作溫度        85 Cel 
最小工作溫度        -40 Cel
最大供電/工作電壓        1.95 V 
最小供電/工作電壓        1.65 V 
額定供電電壓        1.8 V
最大時鍾頻率        104 MHz 
加工封裝描述        0.208 INCH, GREEN, SOIC-8 狀態        ACTIVE 工藝        CMOS 
包裝形狀 SQUARE
包裝尺寸        SMALL OUTLINE 
表面貼裝        Yes 
端子形式        GULL WING 
端子間距        1.27 mm 
端子位置        DUAL 
包裝材料 PLASTIC/EPOXY 
溫度等級        INDUSTRIAL 
內存寬度        1 組織        64M X 1 
存儲密度        6.41E7 deg 
操作模式        SYNCHRONOUS 
位數 6.41E7 words 
位數        64M 
內存IC類型        FLASH 1.8V PROM 
串行並行        SERIAL

W25Q64引腳

CS:CS為片選管腳,低電平有效。上電之后,在執行一條新的指令之前,必須讓/CS管腳先有一個下降沿。 

DO(MISO):DO為串行數據輸出引腳,在CLK(串行時鍾)管腳的下降沿輸出數據。

WP:WP為寫保護管腳,有效電平為低電平。高電平可讀可寫,低電平僅僅可讀。

DI(MOSI):DI為串行數據輸入引腳,數據、地址和命令從DI引腳輸入到芯片內部,在CLK(串行時鍾)管腳的上升沿捕獲捕獲數據。

CLK(SLCK):CLK為串行時鍾引腳。SPI時鍾引腳,為輸入輸出提供時鍾脈沖。

HOLD:HOLD為保持管腳,低電平有效。當CS為低電平,並且把HOLD拉低時,數據輸出管腳將保持高阻態,並且會忽略數據輸入管腳和時鍾管腳上的信號。把HOLD管腳拉高,器件恢復正常工作。

VCC:電源2.7V~3.6V。

GND:地。

 

W25Q64內部框架圖

W25Q64操作原理

通過SPI接口,用標准的SPI協議發送相應指令給flash,然后flash根據命令進行各種相關操作。

 

W25Q64常用操作命令

模塊電原理圖

模塊接口定義
CS:為片選信號腳---D10
DI(MOSI):為串行數據輸入引腳----D11
DO(MISO):為串行數據輸出引腳---D12
CLK(SLCK):SPI總線---D13
VCC:  電源3.3V
GND:接地

/*

【Arduino】168種傳感器模塊系列實驗(50)

實驗五十:W25Q64 64Mbit FLASH外擴存儲模塊 (SPI接口 )

Arduino 的 uno 引腳

CS----------10

MOSI(DI)---11

MISO(DO)---12

CLK---------13

VCC 3.3V

*/



#include <SerialFlash.h>

#include <SPI.h>

// 文件大小

#define FSIZE 256

// 文件名

const char *filename = "Eagler8.txt";

// 文件內容

const char *contents = "The groundbreaking Intel Curie module expands the possibilities of what tech can do.";

// 片選引腳

const int FlashChipSelect = 10;

void setup() {

  Serial.begin(9600);

  while (!Serial) ;

  delay(500);

  // 初始化SPI Flash芯片

  SerialFlash.begin(FlashChipSelect);

  // 如果文件已存在,則輸出提示

  // 如果文件不存在,則創建文件並寫入

  if(SerialFlash.exists(filename)) {

    Serial.println("File " + String(filename) + " already exists");

  }

  else {

    Serial.println("Creating file " + String(filename));

    SerialFlash.create(filename, FSIZE);

    // 新建SerialFlashFile對象用於文件操作

    SerialFlashFile file;

    file = SerialFlash.open(filename);

    file.write(contents, strlen(contents) + 1);

    Serial.println("String \"" + String(contents) + "\" written to file " + String(filename));

  }

}

void loop() {

}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM