0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(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è)備是工作在主機(jī)模式還是從機(jī)模式,設(shè)置參數(shù)如表6-4所示。

圖片

3、SPI_DataSize設(shè)置了SPI通信時(shí)數(shù)據(jù)幀是8位還是16位,沒有特殊要求,通常配置為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í),片選信號由SPI硬件自動(dòng)產(chǎn)生,不需要手動(dòng)設(shè)置,而軟件模式需要手動(dòng)設(shè)置片選引腳電平。實(shí)際開發(fā)中通常設(shè)置為軟件模式,即使用普通IO口作為片選引腳。設(shè)置參數(shù)如表6-8所示

圖片

7、SPI_BaudRatePrescaler設(shè)置了SPI波特率預(yù)分頻系數(shù),分頻后的時(shí)鐘就是SCK信號線的時(shí)鐘頻率。注意SPI正在通信時(shí)不能更改波特率預(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校驗(yàn)。使用時(shí)根據(jù)需求設(shè)置CRC多項(xiàng)式,不使用時(shí)設(shè)置其值為7(復(fù)位值為0x0007,默認(rèn)不使用)。無特殊要求通常不設(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使能庫函數(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ū)和一個(gè)8位的雙向移位寄存器構(gòu)成。SPI的數(shù)據(jù)緩沖區(qū)叫做數(shù)據(jù)寄存器(SPI_DR),雖然是一個(gè)寄存器,但是實(shí)質(zhì)上包含兩個(gè)緩沖區(qū):發(fā)送緩沖和接收緩沖,分別用于進(jìn)行寫操作和讀操作。與USART兩個(gè)單獨(dú)的移位寄存器不同,SPI只有一個(gè)移位寄存器且是雙向的,同一時(shí)刻既向MOSI上移出要發(fā)送的數(shù)據(jù),又將MISO上的數(shù)據(jù)向內(nèi)移入,這個(gè)過程是同步的,SPI傳輸結(jié)構(gòu)如圖6-11所示。

圖片

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

SPI發(fā)送數(shù)據(jù)時(shí)只需要將數(shù)據(jù)寫入到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ā)送或者接收到的,只需要檢測相應(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ā)送完成,這一點(diǎn)一定要搞清楚。向發(fā)送緩沖區(qū)寫入數(shù)據(jù)會(huì)清除TXE標(biāo)志位,如果TXE=0即發(fā)生緩沖區(qū)非空時(shí),向SPI_DR中寫入數(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ā)送完成,可以通過檢測RXNE標(biāo)志位。如果設(shè)置了SPI_CR1寄存器中的TXEIE位或者SPI_CR2寄存器中的RXNEIE位,將產(chǎn)生對應(yīng)的中斷。本文主要是以查詢方式介紹SPI如何收發(fā)數(shù)據(jù)。

使用查詢方式檢測TXE和RXNE標(biāo)志位時(shí)需要用到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í)庫函數(shù)中也有對應(yīng)的SPI數(shù)據(jù)發(fā)送和接收函數(shù),分別為:(固件庫手冊中所示的發(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ù)之前需要檢測相應(yīng)標(biāo)志位,然后再調(diào)用庫函數(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í)鐘信號(SCK),通信時(shí)需要主機(jī)提供SCK以啟動(dòng)數(shù)據(jù)傳輸,因此主機(jī)需要通過發(fā)送的數(shù)據(jù)來提供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讀寫W25Q128

6.9.1 W25Q128****簡介

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

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

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

2、Flash有一個(gè)特點(diǎn),就是可以將1寫成0,但是不能將0寫成1,要想將0寫成1,必須進(jìn)行擦除操作。因此通常要改寫某部分空間的數(shù)據(jù),必須首先進(jìn)行一定物理存儲(chǔ)空間擦除,最小的擦除空間,通常稱之為扇區(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開發(fā)板中W25Q128對應(yīng)的管腳連接關(guān)系如圖6-10所示。

圖片

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

6.9.2 W25Q128****讀寫操作

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

圖片

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

    關(guān)注

    6050

    文章

    44701

    瀏覽量

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

    關(guān)注

    17

    文章

    1731

    瀏覽量

    92898
  • EEPROM
    +關(guān)注

    關(guān)注

    9

    文章

    1048

    瀏覽量

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

    關(guān)注

    11

    文章

    304

    瀏覽量

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

    關(guān)注

    0

    文章

    19

    瀏覽量

    7038
收藏 人收藏

    評論

    相關(guān)推薦

    詳解IIC總線

    IIC(Inter-Integrated Circuit)集成電路總線,它是種兩線式串行通信總線,又叫I2C,使用多主從架構(gòu),由飛利浦公司
    發(fā)表于 06-07 15:38 ?1w次閱讀
    <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ā)明的通訊總線,屬于半雙工同步傳輸類型
    發(fā)表于 09-12 11:15 ?2508次閱讀
    <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)用廣泛,但沒有個(gè)統(tǒng)
    發(fā)表于 09-20 15:17 ?1250次閱讀
    <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 ?2898次閱讀
    <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)用場景

    IIC vs SPI: 哪位是贏家?我們來對比IICSPI些關(guān)鍵點(diǎ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實(shí)現(xiàn)原理及過程

    本文首先介紹了IIC總線概念和IIC總線硬件結(jié)構(gòu),其次介紹了IIC總線典型應(yīng)用,最后詳細(xì)介紹了
    發(fā)表于 05-31 10:56 ?6817次閱讀
    <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)原理及過程

    IIC通信總線尋址

    IIC的使用IIC總線簡介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)用上來講,UART通信多用于板間通信,比如單片機(jī)和計(jì)算機(jī),這個(gè)設(shè)備和另外個(gè)設(shè)備之間的通信。而IIC
    的頭像 發(fā)表于 02-13 10:39 ?2850次閱讀
    <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通信多用于板間通信,比如單片機(jī)和計(jì)算機(jī),這個(gè)設(shè)備和另外個(gè)設(shè)備之間的通信。而IIC
    的頭像 發(fā)表于 02-13 10:40 ?2219次閱讀
    <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通信多用于板間通信,比如單片機(jī)和計(jì)算機(jī),這個(gè)設(shè)備和另外個(gè)設(shè)備之間的通信。而IIC
    的頭像 發(fā)表于 02-13 10:41 ?1878次閱讀
    <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)目開發(fā)中非常常見的通信
    的頭像 發(fā)表于 03-22 16:11 ?1971次閱讀
    淺談<b class='flag-5'>SPI</b><b class='flag-5'>總線</b><b class='flag-5'>通信</b>接口及其協(xié)議