0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一文講透SPI總線和IIC總線通信3

jf_78858299 ? 來源:金沙灘工作室 ? 作者:宋雪松 ? 2023-02-13 10:41 ? 次閱讀

6.8.2 SPI****初始化配置

首先看一下SPI外設(shè)的初始化結(jié)構(gòu)體成員及其描述。

圖片

1、SPI_Dirention 設(shè)置了SPI是單向通信還是雙向的通信數(shù)據(jù)模式,設(shè)置參數(shù)如表6-3所示。

圖片

2、SPI_Mode設(shè)置了SPI 設(shè)備是工作在主機模式還是從機模式,設(shè)置參數(shù)如表6-4所示。

圖片

3、SPI_DataSize設(shè)置了SPI通信時數(shù)據(jù)幀是8位還是16位,沒有特殊要求,通常配置為8位模式,設(shè)置參數(shù)如表6-5所示。

圖片

4、SPI_CPOL設(shè)置了SPI串行時鐘SCK的時鐘極性,選擇該參數(shù)時需要確保SPI通信雙方保持一致,一般根據(jù)SPI從設(shè)備支持的模式設(shè)定,設(shè)置參數(shù)如表6-6所示

圖片

5、SPI_CPHA設(shè)置了SPI采樣時發(fā)生在SCK的哪個邊沿,該參數(shù)同樣需要確保通信雙方保持一致,一般也是根據(jù)從設(shè)備支持的模式設(shè)定,設(shè)置參數(shù)如表6-7所示

圖片

6、SPI_NSS設(shè)置了NSS片選引腳是由選擇硬件模式,還是由軟件模式。采用硬件管理時,片選信號由SPI硬件自動產(chǎn)生,不需要手動設(shè)置,而軟件模式需要手動設(shè)置片選引腳電平。實際開發(fā)中通常設(shè)置為軟件模式,即使用普通IO口作為片選引腳。設(shè)置參數(shù)如表6-8所示

圖片

7、SPI_BaudRatePrescaler設(shè)置了SPI波特率預(yù)分頻系數(shù),分頻后的時鐘就是SCK信號線的時鐘頻率。注意SPI正在通信時不能更改波特率預(yù)分頻系數(shù),具體設(shè)置參數(shù)如表6-9所示

圖片

8、SPI_FirstBit設(shè)置了數(shù)據(jù)傳輸是高位在前(MSB先行)還是低位在前(LSB先行),沒有特殊要求一般設(shè)置為高位在前(MSB先行)設(shè)置參數(shù)如表6-10所示。

圖片

9、SPI_CRCPolynomial設(shè)置是否使用CRC校驗。使用時根據(jù)需求設(shè)置CRC多項式,不使用時設(shè)置其值為7(復(fù)位值為0x0007,默認(rèn)不使用)。無特殊要求通常不設(shè)置CRC校驗。

SPI配置流程:

1、使能SPI外設(shè)時鐘及SPI接口引腳時鐘

2、初始化SPI引腳——初始化NSS、SCK、MISO、MOSI引腳。

3、初始化SPI外設(shè)——根據(jù)需求設(shè)置SPI初始化結(jié)構(gòu)體成員參數(shù)

4、使能SPI外設(shè)——SPI使能庫函數(shù)為:SPI_Cmd(SPIx, ENABLE);其中SPIx,x為1、

2、3,用來選擇SPI外設(shè)。

5、編寫SPI數(shù)據(jù)發(fā)送和接收函數(shù)

6.8.3 SPI數(shù)據(jù)發(fā)送和接收

SPI數(shù)據(jù)發(fā)送和接收過程與USART類似,由數(shù)據(jù)緩沖區(qū)和一個8位的雙向移位寄存器構(gòu)成。SPI的數(shù)據(jù)緩沖區(qū)叫做數(shù)據(jù)寄存器(SPI_DR),雖然是一個寄存器,但是實質(zhì)上包含兩個緩沖區(qū):發(fā)送緩沖和接收緩沖,分別用于進(jìn)行寫操作和讀操作。與USART兩個單獨的移位寄存器不同,SPI只有一個移位寄存器且是雙向的,同一時刻既向MOSI上移出要發(fā)送的數(shù)據(jù),又將MISO上的數(shù)據(jù)向內(nèi)移入,這個過程是同步的,SPI傳輸結(jié)構(gòu)如圖6-11所示。

圖片

圖6-11 SPI數(shù)據(jù)傳輸結(jié)構(gòu)圖

SPI發(fā)送數(shù)據(jù)時只需要將數(shù)據(jù)寫入到SPI_DR,SPI會自動將其分配到發(fā)送緩沖區(qū),然后再將數(shù)據(jù)從發(fā)送緩沖區(qū)并行傳送到移位寄存器中,同時設(shè)置一個發(fā)送緩沖區(qū)為空(TXE)的標(biāo)志位,最后數(shù)據(jù)按照設(shè)定的數(shù)據(jù)格式(MSB或LSB)被串行的從MOSI引腳移出。與此同時MISO引腳也會接收到數(shù)據(jù),接收到的數(shù)據(jù)同樣按照相應(yīng)的格式被串行的移入到移位寄存器,當(dāng)接收完一幀數(shù)據(jù)后,移位寄存器將接收到的數(shù)據(jù)傳送到接收緩沖區(qū)中,同時會設(shè)置一個接收緩沖區(qū)非空(RXNE)的標(biāo)志位。使用SPI發(fā)送和接收數(shù)據(jù)時并不需要關(guān)心數(shù)據(jù)是怎么發(fā)送或者接收到的,只需要檢測相應(yīng)標(biāo)志位后向數(shù)據(jù)寄存器(SPI_DR)寫入要發(fā)送的數(shù)據(jù)或者讀出接收到的數(shù)據(jù)即可。

TXE標(biāo)志位被置位僅表示發(fā)送緩沖區(qū)為空,可以繼續(xù)向SPI_DR寫入數(shù)據(jù),但并不代表數(shù)據(jù)發(fā)送完成,這一點一定要搞清楚。向發(fā)送緩沖區(qū)寫入數(shù)據(jù)會清除TXE標(biāo)志位,如果TXE=0即發(fā)生緩沖區(qū)非空時,向SPI_DR中寫入數(shù)據(jù)會覆蓋發(fā)送緩沖區(qū)中的數(shù)據(jù),但不會影響移位寄存器中的數(shù)據(jù)。RXNE=1表示接收緩沖區(qū)非空,即已經(jīng)接收到一幀數(shù)據(jù)。讀SPI_DR寄存器硬件會自動清除RXNE標(biāo)志位,并返回接收到的數(shù)據(jù)。當(dāng)SPI接收到一幀數(shù)據(jù)時,意味著SPI肯定已經(jīng)發(fā)送完一幀數(shù)據(jù),因此判斷一幀數(shù)據(jù)是否發(fā)送完成,可以通過檢測RXNE標(biāo)志位。如果設(shè)置了SPI_CR1寄存器中的TXEIE位或者SPI_CR2寄存器中的RXNEIE位,將產(chǎn)生對應(yīng)的中斷。本文主要是以查詢方式介紹SPI如何收發(fā)數(shù)據(jù)。

使用查詢方式檢測TXE和RXNE標(biāo)志位時需要用到SPI標(biāo)志位檢測函數(shù),如下所示:

SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG);其中SPIx中x為1、2、3,用來選擇SPI外設(shè);SPI_I2S_FLAG為被檢測的標(biāo)志位,如表6-11所示。

圖片

同時庫函數(shù)中也有對應(yīng)的SPI數(shù)據(jù)發(fā)送和接收函數(shù),分別為:(固件庫手冊中所示的發(fā)送和接收函數(shù)有誤,實際以本文為準(zhǔn))

SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data);//SPI發(fā)送函數(shù)

SPI_I2S_ReceiveData(SPI_TypeDef* SPIx);//SPI接收函數(shù)

SPI使用查詢方式發(fā)送和接收數(shù)據(jù)時,在發(fā)送和接收數(shù)據(jù)之前需要檢測相應(yīng)標(biāo)志位,然后再調(diào)用庫函數(shù)發(fā)送或者接收數(shù)據(jù),這樣操作雖然方便,但是由于函數(shù)相互調(diào)用會占用時間,當(dāng)傳輸數(shù)據(jù)量較大時會降低SPI整體傳輸效率。為了提高SPI的整體傳輸效率,本文采用寄存器方式操作。另外SPI在接收從機數(shù)據(jù)時,由于從機自身不產(chǎn)生時鐘信號(SCK),通信時需要主機提供SCK以啟動數(shù)據(jù)傳輸,因此主機需要通過發(fā)送的數(shù)據(jù)來提供SCK并接收從機的數(shù)據(jù),發(fā)送的數(shù)據(jù)并不生效。

以下是配置SPI2為主模式,8位數(shù)據(jù)格式,CPOL=1,CPHA=1,波特率2分頻,MSB先行,不使用CRC校驗,使用時可根據(jù)具體要求進(jìn)行修改。由于SPI外設(shè)掛載了多個從機設(shè)備,為了方便移植,初始化SPI時并未設(shè)置片選引腳,而是選擇將片選引腳與SPI從設(shè)備放在一起配置,具體代碼如下:

圖片

圖片

96.9 SPI讀寫W25Q128

6.9.1 W25Q128****簡介

Flash是一種掉電不丟數(shù)據(jù)的非易失存儲設(shè)備,生活中常見的閃存存儲設(shè)備包塊固態(tài)硬盤、U盤、SD卡以及單片機內(nèi)部的存儲設(shè)備等。Flash具有存儲空間更大,讀取速率快、可靠性高等特點。本節(jié)所要介紹的W25Q128就是Flash的一種,只不過它是以芯片的形式存在。 W25Q128是華邦公司推出的一款SPI接口的NOR Flash芯片,其存儲空間為128Mbit,相當(dāng)于16M字節(jié)。W25Q128可以支持SPI的模式0和模式3,也就是CPOL=0/CPHA=0和CPOL=1/CPHA=1這兩種模式。

往Flash寫入數(shù)據(jù)時,需要注意以下兩個重要問題:

1、Flash寫入數(shù)據(jù)時和EEPROM類似,不能跨頁寫入,一次最多寫入一頁,W25Q128的一頁是256字節(jié)。寫入數(shù)據(jù)一旦跨頁,必須在寫滿上一頁的時候,等待Flash將數(shù)據(jù)從緩存搬移到非易失區(qū),重新再次往里寫。

2、Flash有一個特點,就是可以將1寫成0,但是不能將0寫成1,要想將0寫成1,必須進(jìn)行擦除操作。因此通常要改寫某部分空間的數(shù)據(jù),必須首先進(jìn)行一定物理存儲空間擦除,最小的擦除空間,通常稱之為扇區(qū),扇區(qū)擦除就是將這整個扇區(qū)每個字節(jié)全部變成0xFF。每款Flash的扇區(qū)大小不一定相同,W25Q128的一個扇區(qū)是4096字節(jié)。為了提高擦除效率,使用不同的擦除指令還可以一次性進(jìn)行32K(8個扇區(qū))、64K(16個扇區(qū))以及整片擦除。

Kingst-32F1開發(fā)板中W25Q128對應(yīng)的管腳連接關(guān)系如圖6-10所示。

圖片

圖6-12 W25Q128電路原理圖及其引腳

6.9.2 W25Q128****讀寫操作

W25Q128內(nèi)部有一個“SPI Command & Control Logic”,可以通過SPI接口向其發(fā)送指令,從而執(zhí)行相應(yīng)操作。指令的長度是不定的,有單字節(jié)的,也有多字節(jié)的,W25Qxx一共具有34個操作指令,在此只列舉常用的12個,具體如表6-13所示。

圖片

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 單片機
    +關(guān)注

    關(guān)注

    6026

    文章

    44455

    瀏覽量

    630908
  • SPI
    SPI
    +關(guān)注

    關(guān)注

    17

    文章

    1681

    瀏覽量

    91057
  • EEPROM
    +關(guān)注

    關(guān)注

    9

    文章

    1007

    瀏覽量

    81225
  • IIC
    IIC
    +關(guān)注

    關(guān)注

    11

    文章

    293

    瀏覽量

    38206
  • uart通信
    +關(guān)注

    關(guān)注

    0

    文章

    19

    瀏覽量

    6993
收藏 人收藏

    評論

    相關(guān)推薦

    詳解IIC總線

    IIC(Inter-Integrated Circuit)集成電路總線,它是種兩線式串行通信總線,又叫I2C,使用多主從架構(gòu),由飛利浦公司
    發(fā)表于 06-07 15:38 ?9241次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b>詳解<b class='flag-5'>IIC</b><b class='flag-5'>總線</b>

    詳解IIC總線

    IIC(Inter-Integrated Circuit)是個多主從的串行總線,又叫I2C,是由飛利浦公司發(fā)明的通訊總線,屬于半雙工同步傳輸類型
    發(fā)表于 09-12 11:15 ?1892次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b>詳解<b class='flag-5'>IIC</b><b class='flag-5'>總線</b>

    SPI總線學(xué)習(xí)筆記

    SPI種全雙工的串行通信總線,最早由Motorola提出,雖然應(yīng)用廣泛,但沒有個統(tǒng)
    發(fā)表于 09-20 15:17 ?909次閱讀
    <b class='flag-5'>SPI</b><b class='flag-5'>總線</b>學(xué)習(xí)筆記

    IIC總線SPI總線的比較

    現(xiàn)今,在低端數(shù)字通信應(yīng)用領(lǐng)域,我們隨處可見IIC (Inter-Integrated Circuit) 和 SPI (Serial Peripheral Interface)的身影。原因是這兩種
    發(fā)表于 09-26 09:30 ?2088次閱讀
    <b class='flag-5'>IIC</b><b class='flag-5'>總線</b>和<b class='flag-5'>SPI</b><b class='flag-5'>總線</b>的比較

    IIC總線SPI總線通信詳解

    IIC總線SPI總線通信介紹
    發(fā)表于 12-23 07:02

    串行通信中的IIC總線工作原理是什么

    串行通信中的IIC總線工作原理51本身不帶IIC總線 ,使用程序模擬IIC
    發(fā)表于 12-08 07:52

    IIC總線接口學(xué)習(xí)

    在多主設(shè)備IIC 總線模式下,多個S3C2440A 微處理器可以從從屬設(shè)備接收或發(fā)送串行數(shù)據(jù)。主設(shè)備S3C2440A 可以初始化和終止個基
    發(fā)表于 04-27 15:31 ?61次下載
    <b class='flag-5'>IIC</b><b class='flag-5'>總線</b>接口學(xué)習(xí)

    iic總線通信程序

    iic總線通信,要的人速度下載看看哦。
    發(fā)表于 03-21 13:50 ?30次下載

    深度解析IICSPI總線協(xié)議的區(qū)別與應(yīng)用場景

    IIC vs SPI: 哪位是贏家?我們來對比IICSPI些關(guān)鍵點: 第
    的頭像 發(fā)表于 12-22 16:48 ?1.9w次閱讀
    深度解析<b class='flag-5'>IIC</b>和<b class='flag-5'>SPI</b><b class='flag-5'>總線</b>協(xié)議的區(qū)別與應(yīng)用場景

    解讀IIC總線的FPGA實現(xiàn)原理及過程

    本文首先介紹了IIC總線概念和IIC總線硬件結(jié)構(gòu),其次介紹了IIC總線典型應(yīng)用,最后詳細(xì)介紹了
    發(fā)表于 05-31 10:56 ?6637次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b>解讀<b class='flag-5'>IIC</b><b class='flag-5'>總線</b>的FPGA實現(xiàn)原理及過程

    IIC通信總線尋址

    IIC的使用IIC總線簡介IIC通信時序IIC總線
    發(fā)表于 12-04 16:06 ?14次下載
    <b class='flag-5'>IIC</b><b class='flag-5'>通信</b><b class='flag-5'>總線</b>尋址

    SPI總線IIC總線通信1

    從應(yīng)用上來講,UART通信多用于板間通信,比如單片機和計算機,這個設(shè)備和另外個設(shè)備之間的通信。而IIC
    的頭像 發(fā)表于 02-13 10:39 ?2470次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>講</b><b class='flag-5'>透</b><b class='flag-5'>SPI</b><b class='flag-5'>總線</b>和<b class='flag-5'>IIC</b><b class='flag-5'>總線</b><b class='flag-5'>通信</b>1

    SPI總線IIC總線通信2

    從應(yīng)用上來講,UART通信多用于板間通信,比如單片機和計算機,這個設(shè)備和另外個設(shè)備之間的通信。而IIC
    的頭像 發(fā)表于 02-13 10:40 ?1740次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>講</b><b class='flag-5'>透</b><b class='flag-5'>SPI</b><b class='flag-5'>總線</b>和<b class='flag-5'>IIC</b><b class='flag-5'>總線</b><b class='flag-5'>通信</b>2

    SPI總線IIC總線通信4

    從應(yīng)用上來講,UART通信多用于板間通信,比如單片機和計算機,這個設(shè)備和另外個設(shè)備之間的通信。而IIC
    的頭像 發(fā)表于 02-13 10:41 ?1661次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>講</b><b class='flag-5'>透</b><b class='flag-5'>SPI</b><b class='flag-5'>總線</b>和<b class='flag-5'>IIC</b><b class='flag-5'>總線</b><b class='flag-5'>通信</b>4

    淺談SPI總線通信接口及其協(xié)議

    上篇內(nèi)容我們介紹了IIC總線通信接口及其協(xié)議,這篇文章我們介紹另種項目開發(fā)中非常常見的通信
    的頭像 發(fā)表于 03-22 16:11 ?1643次閱讀
    淺談<b class='flag-5'>SPI</b><b class='flag-5'>總線</b><b class='flag-5'>通信</b>接口及其協(xié)議