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