日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Xilinx-Spartan6-学习笔记(24):通过SPI总线读写FLASH

發(fā)布時間:2024/3/26 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Xilinx-Spartan6-学习笔记(24):通过SPI总线读写FLASH 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。