spi的fifo如何配置
㈠ SPI控制液晶屏, FIFO 滿了如何控制
fifo滿了後面的數據肯定就會被拋棄,所以你要保證出FIFO的速度大於進FIFO的速度
㈡ 嵌入式物聯網之SPI介面原理與配置
本實驗採用W25Q64晶元
W25Q64是華邦公司推出的大容量SPI
FLASH產品,其容量為64Mb。該25Q系列的器件在靈活性和性能方面遠遠超過普通的串列快閃記憶體器件。W25Q64將8M位元組的容量分為128個塊,每個塊大小為64K位元組,每個塊又分為16個扇區,每個扇區4K個位元組。W25Q64的最小擦除單位為一個扇區,也就是每次必須擦除4K個位元組。所以,這需要給W25Q64開辟一個至少4K的緩存區,這樣必須要求晶元有4K以上的SRAM才能有很好的操作。
W25Q64的擦寫周期多達10W次,可將數據保存達20年之久,支持2.7~3.6V的電壓,支持標準的SPI,還支持雙輸出/四輸出的SPI,最大SPI時鍾可達80Mhz。
一。SPI介面原理
(一)概述
高速,全雙工,同步的通信匯流排。
全雙工:可以同時發送和接收,需要2條引腳
同步: 需要時鍾引腳
片選引腳:方便一個SPI介面上可以掛多個設備。
總共四根引腳。
(二)SPI內部結構簡明圖
MISO: 做主機的時候輸入,做從機的時候輸出
MOSI:做主機的時候輸出,做從機的時候輸入
主機和從機都有一個移位寄存器,在同一個時鍾的控制下主機的最高位移到從機的最高位,同時從機的最高位往前移一位,移到主機的最低位。在一個時鍾的控制下主機和從機進行了一個位的交換,那麼在8個時鍾的控制下就交換了8位,最後的結果就是兩個移位寄存器的數據完全交換。
在8個時鍾的控制下,主機和從機的兩個位元組進行了交換,也就是說主機給從機發送一個位元組8個位的同時,從機也給主機傳回來了8個位,也就是一個位元組。
(三)SPI介面框圖
上面左邊部分就是在時鍾控制下怎麼傳輸數據,右邊是控制單元,還包括左下的波特率發生器。
(四)SPI工作原理總結
(五)SPI的特徵
(六)從選擇(NSS)腳管理
兩個SPI通信首先有2個數據線,一個時鍾線,還有一個片選線,只有把片選拉低,SPI晶元才工作,片選引腳可以是SPI規定的片選引腳,還可以通過軟體的方式選擇任意一個IO口作為片選引腳,這樣做的好處是:比如一個SPI介面上掛多個設備,比如掛了4個設備,第二個用PA2,第三個用PA3,第四個用PA4作為片選,我們
跟第二個設備進行通信的時候,只需要把第二個片選選中,比如拉低,其他設備的片選都拉高,這樣就實現了一個SPI介面可以連接個SPI設備,戰艦開發板上就是通過這種方法來實現的。
(七)時鍾信號的相位和極性
時鍾信號的相位和極性是通過CR寄存器的 CPOL 和 CPHA兩個位確定的。
CPOL:時鍾極性,設置在沒有數據傳輸時時鍾的空閑狀態電平。CPOL置0,SCK引腳在空閑時為低電平,CPOL置1,SCK引腳在空閑時保持高電平。
CPHA:時鍾相位 設置時鍾信號在第幾個邊沿數據被採集
CPHA=1時:在時鍾信號的第二個邊沿
CPOL=1,CPHA=1,
CPOL=1表示時鍾信號在沒有數據傳輸時即空閑時的狀態為高電平。如果CPHA=1,那麼數據就在時鍾信號的第二個邊沿即上升沿的時候被採集。
CPOL= 0,CPHA=1, CPOL=0表示時鍾信號在沒有數據傳輸時即空閑時的狀態為低電平。
如果CPHA=1,那麼數據就在時鍾信號的第二個邊沿即下降沿的時候被採集。
CPHA=0時:在時鍾信號的第一個邊沿
CPOL=1,CPHA=0,
CPOL=1表示時鍾信號在沒有數據傳輸時即空閑時的狀態為高電平。如果CPHA=1,那麼數據就在時鍾信號的第一個邊沿即下降沿的時候被採集。
CPOL= 0,CPHA=0, CPOL=0表示時鍾信號在沒有數據傳輸時即空閑時的狀態為低電平。
如果CPHA=1,那麼數據就在時鍾信號的第一個邊沿即上升沿的時候被採集。
為什麼要配置這兩個參數?
因為SPI外設的從機的時鍾相位和極性都是有嚴格要求的。所以我們要根據選擇的外設的時鍾相位和極性來配置主機的相位和極性。必須要與從機匹配。
(八)數據幀的格式和狀態標志
數據幀格式:根據CR1寄存器的LSBFIRST位的設置,數據可以MSB在前也可以LSB在前。
根據CR1寄存器的DEF位,每個數據幀可以是8位或16位。
(九)SPI中斷
(十)SPI引腳配置 (3個SPI)
引腳的工作模式設置
引腳必須要按照這個表格配置。
二。SPI寄存器庫函數配置
(一)常用寄存器
(二)SPI相關庫函數
STM32的SPI介面可以配置為支持SPI協議或者支持I2S音頻協議。默認是SPI模式,可以通過軟體切換到I2S方式。
常用的函數:
1. void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef*
SPI_InitStruct);//SPI的初始化
2. void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState); //SPI使能
3. void SPI_I2S_ITConfig(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT,
FunctionalState NewState); //開啟中斷
4. void SPI_I2S_DMACmd(SPI_TypeDef* SPIx, uint16_t SPI_I2S_DMAReq,
FunctionalState NewState);//通 過DMA傳輸數據
5. void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data); //發送數據
6. uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx); //接收數據
7. void SPI_DataSizeConfig(SPI_TypeDef* SPIx, uint16_t SPI_DataSize);
//設置數據是8位還是16位
8. 其他幾個狀態函數
void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef*
SPI_InitStruct);//SPI的初始化
結構體成員變數比較多,這里我們挑取幾個重要的成員變數講解一下:
第一個參數 SPI_Direction 是用來設置 SPI 的通信方式,可以選擇為半雙工,全雙工,以及串列發和串列收方式,這里我們選擇全雙工模式
SPI_Direction_2Lines_FullDuplex。
第二個參數 SPI_Mode 用來設置 SPI 的主從模式,這里我們設置為主機模式 SPI_Mode_Master,當然有需要你也可以選擇為從機模式
SPI_Mode_Slave。
第三個參數 SPI_DataSiz 為 8 位還是 16 位幀格式選擇項,這里我們是 8 位傳輸,選擇SPI_DataSize_8b。
第四個參數 SPI_CPOL 用來設置時鍾極性,我們設置串列同步時鍾的空閑狀態為高電平所以我們選擇 SPI_CPOL_High。
第五個參數 SPI_CPHA
用來設置時鍾相位,也就是選擇在串列同步時鍾的第幾個跳變沿(上升或下降)數據被采樣,可以為第一個或者第二個條邊沿採集,這里我們選擇第二個跳變沿,所以選擇
SPI_CPHA_2Edge
第六個參數 SPI_NSS 設置 NSS 信號由硬體(NSS 管腳)還是軟體控制,這里我們通過軟體控
制 NSS 關鍵,而不是硬體自動控制,所以選擇 SPI_NSS_Soft。
第七個參數 SPI_BaudRatePrescaler 很關鍵,就是設置 SPI 波特率預分頻值也就是決定 SPI 的時
鍾的參數 , 從不分頻道 256 分頻 8 個可選值,初始化的時候我們選擇 256 分頻值
SPI_BaudRatePrescaler_256, 傳輸速度為 36M/256=140.625KHz。
第八個參數 SPI_FirstBit 設置數據傳輸順序是 MSB 位在前還是 LSB 位在前, ,這里我們選擇
SPI_FirstBit_MSB 高位在前。
第九個參數 SPI_CRCPolynomial 是用來設置 CRC 校驗多項式,提高通信可靠性,大於 1 即可。
設置好上面 9 個參數,我們就可以初始化 SPI 外設了。
初始化的範例格式為:
SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
//雙線雙向全雙工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主 SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; // SPI 發送接收 8 位幀結構
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;//串列同步時鍾的空閑狀態為高電平
371
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//第二個跳變沿數據被采樣
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS 信號由軟體控制
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //預分頻
256
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //數據傳輸從 MSB 位開始
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC 值計算的多項式
SPI_Init(SPI2, &SPI_InitStructure); //根據指定的參數初始化外設 SPIx 寄存器
(三)程序配置步驟
三。W25Qxx配置講解
(一)電路圖
片選用的PB12
W25Q64 是華邦公司推出的大容量SPI FLASH 產品,W25Q64 的容量為 64Mb,該系列還有 W25Q80/16/32
等。ALIENTEK 所選擇的 W25Q64 容量為 64Mb,也就是 8M 位元組。(1M=1024K)
W25Q64 將 8M 的容量分為 128 個塊(Block),每個塊大小為 64K 位元組,每個塊又分為 16個扇區(Sector),每個扇區 4K
個位元組。W25Q64 的最少擦除單位為一個扇區,也就是每次必須擦除 4K 個位元組。這樣我們需要給 W25Q64 開辟一個至少 4K 的緩存區,這樣對 SRAM
要求比較高,要求晶元必須有 4K 以上 SRAM 才能很好的操作。
W25Q64 的擦寫周期多達 10W 次,具有 20 年的數據保存期限,支持電壓為 2.7~3.6V,W25Q64 支持標準的
SPI,還支持雙輸出/四輸出的 SPI,最大 SPI 時鍾可以到 80Mhz(雙輸出時相當於 160Mhz,四輸出時相當於 320M),更多的 W25Q64
的介紹,請參考 W25Q64 的DATASHEET。
在往一個地址寫數據之前,要先把這個扇區的數據全部讀出來保存在緩存里,然後再把這個扇區擦除,然後在緩存中修改要寫的數據,然後再把整個緩存中的數據再重新寫入剛才擦除的扇區中。
便於學習和參考再給大家分享些spi 的資料
stm32之SPI通信
http://www.makeru.com.cn/live/3523_1795.html?s=45051
SPI通信協議驅動norFlash
http://www.makeru.com.cn/live/4034_2151.html?s=45051
㈢ SPI通信四大模式
SPI是由Motorola公司提出的一種同步串列外圍介面;它在速度要求不高,低功耗,需要保存少量參數的智能化感測系統中得到了廣泛應用;
SPI是一個全雙工的同步串列介面,在數據傳輸過程中,匯流排上只能是一個主機和一個從機進行通信;
通信四種模式:
1、MISO(Master In Slave Out)
主機輸入,從機輸出;
2、MOSI(Master Out Slave In)
主機輸出,從機輸入;
3、SCK(Serial Clock)
串列時鍾信號
4、SS(Slave Select)
從機選擇信號,低電平有效;(即作從機時,該位置低)
SPI匯流排可在軟體的控制下構成各種系統
SPI匯流排與多從機連接
SPI的基本結構相當於兩個8位移位寄存器的首尾相接,構成16位的環形移位寄存器,從而實現了主機與從機的數據交換;
SPI介面的基本結構圖
SPI主從模式
設置MSTR(主設備選擇)和SPE位(使能位)來選擇是否工作在主模式還是從模式;
stm32強大之處:因為從機NSS位必須接0,而主機NSS位接1;stm32可以有軟體來設置相應的主從位;
SPI下時鍾信號的相位和極性(設置由與之通信的具體晶元來設定)
SPI介面可由CPOL和CPHA設定4種不同傳輸格式的時序;
CPOL決定時鍾脈沖SCK的有效脈沖方式(正脈沖、負脈沖)。CPHA決定數據線MOSI什麼時候輸出數據或採集數據;
根據CPOL和CPHA的組合數目,一共四種設置情況;
數據圖分析:
數據幀的格式
根據SPI_CR1寄存器中的LSBFIRST位,輸出數據位時可以MSB(高位先傳)在先也可以是LSB(低位先傳),根據SPI_CR1寄存器的DFF位,每個數據幀可以是8位或者16位,所選擇的數據幀格式對發送/接收都有效;
SPI通信配置步驟:(在主模式下,串列時鍾在SCK腳產生)
1、通過SPI_CR1寄存器的BR[2:0]位定義串列時鍾波特率;
2、選擇CPOL和CPHA位,定義數據傳輸和串列時鍾間的相位關系;
3、設置DFF位來定義8/16位數據幀格式;
4、配置SPI_CR1寄存器的LSBFIRST位定義幀格式;
5、如果NSS引腳需要工作在輸入模式,硬體模式中在整個數據幀傳輸期間應把NSS腳連接到高電平;在軟體模式中,需要設置SPI_CR1寄存器的SSM和SSI位,如果NSS引腳工作在輸出模式,則只需設置SSOE位;
6、必須設置MSTR和SPE位(只當NSS被連到高電平,這些位才能保存置位)。
在這個配置中,MOSI腳是數據輸出,而MISO腳是數據輸入;
SPI通信過程:
stm32之SPI通信視頻資料
http://www.makeru.com.cn/live/3523_1795.html?s=156461
㈣ DSP2812雙DSP的SPIFIFO通信
你描述的太簡單了啊,比如信號線怎麼連接要寫寫啊,可能的原因也會有很多啊,比如片選信號啊,中斷程序啊