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

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

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

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

jf_78858299 ? 來(lái)源:金沙灘工作室 ? 作者:宋雪松 ? 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è)備是工作在主機(jī)模式還是從機(jī)模式,設(shè)置參數(shù)如表6-4所示。

圖片

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

圖片

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

圖片

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

圖片

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

圖片

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

圖片

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

圖片

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

SPI配置流程:

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

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

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

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

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

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

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

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

圖片

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

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

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

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

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

圖片

同時(shí)庫(kù)函數(shù)中也有對(duì)應(yīng)的SPI數(shù)據(jù)發(fā)送和接收函數(shù),分別為:(固件庫(kù)手冊(cè)中所示的發(fā)送和接收函數(shù)有誤,實(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ù)時(shí),在發(fā)送和接收數(shù)據(jù)之前需要檢測(cè)相應(yīng)標(biāo)志位,然后再調(diào)用庫(kù)函數(shù)發(fā)送或者接收數(shù)據(jù),這樣操作雖然方便,但是由于函數(shù)相互調(diào)用會(huì)占用時(shí)間,當(dāng)傳輸數(shù)據(jù)量較大時(shí)會(huì)降低SPI整體傳輸效率。為了提高SPI的整體傳輸效率,本文采用寄存器方式操作。另外SPI在接收從機(jī)數(shù)據(jù)時(shí),由于從機(jī)自身不產(chǎn)生時(shí)鐘信號(hào)(SCK),通信時(shí)需要主機(jī)提供SCK以啟動(dòng)數(shù)據(jù)傳輸,因此主機(jī)需要通過(guò)發(fā)送的數(shù)據(jù)來(lái)提供SCK并接收從機(jī)的數(shù)據(jù),發(fā)送的數(shù)據(jù)并不生效。

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

圖片

圖片

96.9 SPI讀寫(xiě)W25Q128

6.9.1 W25Q128****簡(jiǎn)介

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

往Flash寫(xiě)入數(shù)據(jù)時(shí),需要注意以下兩個(gè)重要問(wèn)題:

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

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

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

圖片

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

6.9.2 W25Q128****讀寫(xiě)操作

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

圖片

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

    關(guān)注

    6023

    文章

    44376

    瀏覽量

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

    關(guān)注

    17

    文章

    1666

    瀏覽量

    90715
  • EEPROM
    +關(guān)注

    關(guān)注

    9

    文章

    1002

    瀏覽量

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

    關(guān)注

    11

    文章

    292

    瀏覽量

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

    關(guān)注

    0

    文章

    19

    瀏覽量

    6988
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    詳解IIC總線

    IIC(Inter-Integrated Circuit)集成電路總線,它是種兩線式串行通信總線,又叫I2C,使用多主從架構(gòu),由飛利浦公司
    發(fā)表于 06-07 15:38 ?8811次閱讀
    <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)是個(gè)多主從的串行總線,又叫I2C,是由飛利浦公司發(fā)明的通訊總線,屬于半雙工同步傳輸類(lèi)型
    發(fā)表于 09-12 11:15 ?1738次閱讀
    <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)用廣泛,但沒(méi)有個(gè)統(tǒng)
    發(fā)表于 09-20 15:17 ?865次閱讀
    <b class='flag-5'>SPI</b><b class='flag-5'>總線</b>學(xué)習(xí)筆記

    IIC總線SPI總線的比較

    現(xiàn)今,在低端數(shù)字通信應(yīng)用領(lǐng)域,我們隨處可見(jiàn)IIC (Inter-Integrated Circuit) 和 SPI (Serial Peripheral Interface)的身影。原因是這兩種
    發(fā)表于 09-26 09:30 ?1808次閱讀
    <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 總線模式下,多個(gè)S3C2440A 微處理器可以從從屬設(shè)備接收或發(fā)送串行數(shù)據(jù)。主設(shè)備S3C2440A 可以初始化和終止個(gè)基
    發(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)用場(chǎng)景

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

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

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

    IIC通信總線尋址

    IIC的使用IIC總線簡(jiǎn)介IIC通信時(shí)序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)用上來(lái)講,UART通信多用于板間通信,比如單片機(jī)和計(jì)算機(jī),這個(gè)設(shè)備和另外個(gè)設(shè)備之間的通信。而IIC
    的頭像 發(fā)表于 02-13 10:39 ?2398次閱讀
    <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)用上來(lái)講,UART通信多用于板間通信,比如單片機(jī)和計(jì)算機(jī),這個(gè)設(shè)備和另外個(gè)設(shè)備之間的通信。而IIC
    的頭像 發(fā)表于 02-13 10:40 ?1606次閱讀
    <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)用上來(lái)講,UART通信多用于板間通信,比如單片機(jī)和計(jì)算機(jī),這個(gè)設(shè)備和另外個(gè)設(shè)備之間的通信。而IIC
    的頭像 發(fā)表于 02-13 10:41 ?1594次閱讀
    <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é)議,這篇文章我們介紹另種項(xiàng)目開(kāi)發(fā)中非常常見(jiàn)的通信
    的頭像 發(fā)表于 03-22 16:11 ?1583次閱讀
    淺談<b class='flag-5'>SPI</b><b class='flag-5'>總線</b><b class='flag-5'>通信</b>接口及其協(xié)議