Xilinx-Spartan6-学习笔记(24):通过SPI总线读写FLASH
Xilinx-Spartan6-學習筆記(24):通過SPI總線讀寫FLASH
利用SPI總線實現對FLASH進行讀寫,寫入255個數據再讀出255個數據。(這里為了模擬SDO信號,隨機生成了0~1信號方便觀察)
一、SPI總線時序介紹
1、什么是SCPI總線
SPI是串行外設接口(Serial Peripheral Interface)的縮寫,是一種同步串行接口技術,是一種高速的、全雙工、同步的通信總線。
SPI的通信模式通常有一個主設備和一個或多個從設備,需要4根線,也可以是3根線(單向傳輸時)。
SCLK:時鐘信號,由主設備產生。
CS:從設備使能信號,由主設備控制。
SDI/MOSI:主設備數據輸出,從設備數據輸入。
SDO/MISO:主設備數據輸入,從設備數據輸出。
2、SPI通信模式分析
共有四種模式:
Mode0:CPOL=0,CPHA=0
Mode1:CPOL=0,CPHA=1
Mode2:CPOL=1,CPHA=0
Mode3:CPOL=1,CPHA=1
- CPOL=0,CPHA=0:此時空閑態時,SCLK處于低電平,數據采樣是在第1個邊沿,也就是 SCLK由低電平到高電平的跳變,所以數據采樣是在上升沿,數據發送是在下降沿。
- CPOL=0,CPHA=1:此時空閑態時,SCLK處于低電平,數據發送是在第1個邊沿,也就是 SCLK由低電平到高電平的跳變,所以數據采樣是在下降沿,數據發送是在上升沿。
- CPOL=1,CPHA=0:此時空閑態時,SCLK處于高電平,數據采集是在第1個邊沿,也就是 SCLK由高電平到低電平的跳變,所以數據采集是在下降沿,數據發送是在上升沿。
- CPOL=1,CPHA=1:此時空閑態時,SCLK處于高電平,數據發送是在第1個邊沿,也就是 SCLK由高電平到低電平的跳變,所以數據采集是在上升沿,數據發送是在下降沿。
當在模式0的時序下時,為:
二、利用SPI總線讀寫FLASH
1、FLASH操作狀態機
(1)對FLASH的讀寫操作主要包括以下15個階段,通過執行完一個階段跳轉到下一個階段即可實現對FLASH的讀寫。
S0: flash_cmd=90,cmd_type=1000 (讀DEVICE ID)
S1: flash_cmd=06,cmd_type=1001 (寫使能instruction)
S2: flash_cmd=20,cmd_type=1010 (塊擦除)
S3: flash_cmd=00,cmd_type=0000 (延時100時鐘周期)
S4: flash_cmd=05,cmd_type=1011 (讀狀態寄存器)
S5: flash_cmd=04,cmd_type=1100 (寫不使能instruction)
S6: flash_cmd=05,cmd_type=1011 (讀狀態寄存器)
S7: flash_cmd=06,cmd_type=1001 (寫使能instruction)
S8: flash_cmd=00,cmd_type=0000 (延時100時鐘周期)
S9: flash_cmd=02,cmd_type=1101 (寫255個數據到flash)
S10: flash_cmd=00,cmd_type=0000 (延時100時鐘周期)
S11: flash_cmd=05,cmd_type=1011 (讀狀態寄存器)
S12: flash_cmd=04,cmd_type=1100 (寫不使能instruction)
S13: flash_cmd=05,cmd_type=1011 (讀狀態寄存器)
S14:flash_cmd=03,cmd_type=1110 (讀flash中的256個數據)
其中:flash_cmd為操作FLASH的命令,cmd_type為對SPI總線狀態機的控制方式。
(2)SPI總線讀寫的狀態遷移圖如下:
2、讀寫操作仿真解析
(1)讀DEVICE ID:
這一步驟開始時,flash_cmd=90,cmd_type=1000。首先通過SDI/D線發送flash命令(以時鐘上升沿采樣),然后發送flash地址,然后讀取數據,仍然按照上升沿采樣(其實就是時鐘后沿輸出)。
在編寫代碼的時候,通過cnta來進行計數,記8個數,將cmd_reg中的數一位一位發送到總線上,然后以時鐘的下降沿將數據寫入,這樣上升沿采樣的時候正好采到數據的中心位置。
(2)寫使能instruction
這一步驟開始時,flash_cmd=06,cmd_type=1001。首先通過SDI/D線發送flash命令(以時鐘上升沿采樣),如下圖時序所示。
在寫使能狀態下,SPI總線狀態機變化為IDLE到CMD_SEND到FINISH_DONE,最終回到IDLE狀態,從圖中spi_reg即可看出。
(3)數據讀
發送指令flash_cmd=03, cmd_type=1001。首先通過SDI/D線發送flash命令(以時鐘上升沿采樣),然后發送24位地址,最后接收數據,接收數據在時鐘的上升沿進行采樣。
仍然采用在時鐘下降沿時將數據寫入到datain總線上,然后這樣能實現在時鐘上升沿時采樣,下圖為將flash命令03寫入,告訴flash要開始讀數據了。
緊接著將24位的地址0x000001寫入到數據線上,仍然在時鐘上升沿寫入。
按照時鐘上升沿,讀取dataout上的數據,并將數據一位一位地移入mydata寄存器中,讀取完8位數據后,將最終結果鎖存到my_data_o中。
總結
以上是生活随笔為你收集整理的Xilinx-Spartan6-学习笔记(24):通过SPI总线读写FLASH的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Borland下一代C++ Win32
- 下一篇: [转] 《全唐诗》《全宋词》