<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > STM32 SPI接口的簡單實現(xiàn)

          STM32 SPI接口的簡單實現(xiàn)

          作者: 時間:2016-11-19 來源:網(wǎng)絡(luò) 收藏
          通常SPI通過4個引腳與外部器件相連:

          ● MISO:主設(shè)備輸入/從設(shè)備輸出引腳。該引腳在從模式下發(fā)送數(shù)據(jù),在主模式下接收數(shù)據(jù)。

          本文引用地址:http://www.ex-cimer.com/article/201611/318268.htm

          ● MOSI:主設(shè)備輸出/從設(shè)備輸入引腳。該引腳在主模式下發(fā)送數(shù)據(jù),在從模式下接收數(shù)據(jù)。

          ● SCK:串口時鐘,作為主設(shè)備的輸出,從設(shè)備的輸入

          ●NSS:從設(shè)備選擇。這是一個可選的引腳,用來選擇主/從設(shè)備。它的功能是用來作為“片選引腳”,讓主設(shè)備可以單獨(dú)地與特定從設(shè)備通訊,避免數(shù)據(jù)線上的沖突。從設(shè)備的NSS引腳可以由主設(shè)備的一個標(biāo)準(zhǔn)I/O引腳來驅(qū)動。一旦被使能(SSOE位),NSS引腳也可以作為輸出引腳,并在SPI處于主模式時拉低;此時,所有的SPI設(shè)備,如果它們的NSS引腳連接到主設(shè)備的NSS引腳,則會檢測到低電平,如果它們被設(shè)置為NSS硬件模式,就會自動進(jìn)入從設(shè)備狀態(tài)。當(dāng)配置為主設(shè)備、NSS配置為輸入引腳(MSTR=1,SSOE=0)時,如果NSS被拉低,則這個SPI設(shè)備進(jìn)入主模式失敗狀態(tài):即MSTR位被自動清除,此設(shè)備進(jìn)入從模式。

          時鐘信號的相位和極性

          SPI_CR寄存器的CPOL和CPHA位,能夠組合成四種可能的時序關(guān)系。CPOL(時鐘極性)位控制在沒有數(shù)據(jù)傳輸時時鐘的空閑狀態(tài)電平,此位對主模式和從模式下的設(shè)備都有效。如果CPOL被清’0’,SCK引腳在空閑狀態(tài)保持低電平;如果CPOL被置’1’,SCK引腳在空閑狀態(tài)保持高電平。

          如果CPHA(時鐘相位)位被置’1’,SCK時鐘的第二個邊沿(CPOL位為0時就是下降沿,CPOL位為’1’時就是上升沿)進(jìn)行數(shù)據(jù)位的采樣,數(shù)據(jù)在第二個時鐘邊沿被鎖存。如果CPHA位被清’0’,SCK時鐘的第一邊沿(CPOL位為’0’時就是下降沿,CPOL位為’1’時就是上升沿)進(jìn)行數(shù)據(jù)位采樣,數(shù)據(jù)在第一個時鐘邊沿被鎖存。

          CPOL時鐘極性和CPHA時鐘相位的組合選擇數(shù)據(jù)捕捉的時鐘邊沿。
          圖212顯示了SPI傳輸?shù)?種CPHA和CPOL位組合。此圖可以解釋為主設(shè)備和從設(shè)備的SCK腳、MISO腳、MOSI腳直接連接的主或從時序圖。

          CPOL時鐘極性和CPHA時鐘相位的組合選擇數(shù)據(jù)捕捉的時鐘邊沿。
          上圖顯示了SPI傳輸?shù)?種CPHA和CPOL位組合。此圖可以解釋為主設(shè)備和從設(shè)備的SCK腳、MISO腳、MOSI腳直接連接的主或從時序圖。
          注意:

          1. 在改變CPOL/CPHA位之前,必須清除SPE位將SPI禁止。
          2. 主和從必須配置成相同的時序模式。
          3.SCK的空閑狀態(tài)必須和SPI_CR1寄存器指定的極性一致(CPOL為’1’時,空閑時應(yīng)上拉SCK為高電平;CPOL為’0’時,空閑時應(yīng)下拉SCK為低電平)。
          4. 數(shù)據(jù)幀格式(8位或16位)由SPI_CR1寄存器的DFF位選擇,并且決定發(fā)送/接收的數(shù)據(jù)長度。

          我只要知道主機(jī)和從機(jī)的CPOL和CPHA位要一致就夠了。

          有2種NSS模式:
          ●軟件NSS模式:可以通過設(shè)置SPI_CR1寄存器的SSM位來使能這種模式。在這種模式下NSS引腳可以用作它用,而內(nèi)部NSS信號電平可以通過寫SPI_CR1的SSI位來驅(qū)動
          ● 硬件NSS模式,分兩種情況:
          ─NSS輸出被使能:當(dāng)STM32F10xxx工作為主SPI,并且NSS輸出已經(jīng)通過SPI_CR2寄存器的SSOE位使能,這時NSS引腳被拉低,所有NSS引腳與這個主SPI的NSS引腳相連并配置為硬件NSS的SPI設(shè)備,將自動變成從SPI設(shè)備。當(dāng)一個SPI設(shè)備需要發(fā)送廣播數(shù)據(jù),它必須拉低NSS信號,以通知所有其它的設(shè)備它是主設(shè)備;如果它不能拉低NSS,這意味著總線上有另外一個主設(shè)備在通信,這時將產(chǎn)生一個硬件失敗錯誤(HardFault)。
          ─ NSS輸出被關(guān)閉:允許操作于多主環(huán)境。
          //我們用軟件NSS主從的轉(zhuǎn)換都可借助庫來實現(xiàn)

          數(shù)據(jù)幀格式
          根據(jù)SPI_CR1寄存器中的LSBFIRST位,輸出數(shù)據(jù)位時可以MSB在先也可以LSB在先。
          根據(jù)SPI_CR1寄存器的DFF位,每個數(shù)據(jù)幀可以是8位或是16位。所選擇的數(shù)據(jù)幀格式對發(fā)送和/或接收都有效。


          配置一個SPI 這里選SPI2

          如下:

          SPI_InitTypeDef SPI_InitStructure;

          RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);


          SPI_Cmd(SPI2, DISABLE);//必須先禁能,才能改變MODE
          SPI_InitStructure.SPI_Direction =SPI_Direction_2Lines_FullDuplex;//兩線全雙工
          SPI_InitStructure.SPI_Mode =SPI_Mode_Master;//主
          SPI_InitStructure.SPI_DataSize =SPI_DataSize_8b;//8位
          SPI_InitStructure.SPI_CPOL =SPI_CPOL_High;//CPOL=1時鐘懸空高
          SPI_InitStructure.SPI_CPHA =SPI_CPHA_1Edge;//CPHA=1 數(shù)據(jù)捕獲第2個
          SPI_InitStructure.SPI_NSS =SPI_NSS_Soft;//軟件NSS
          SPI_InitStructure.SPI_BaudRatePrescaler =SPI_BaudRatePrescaler_2;//2分頻
          SPI_InitStructure.SPI_FirstBit =SPI_FirstBit_MSB;//高位在前
          SPI_InitStructure.SPI_CRCPolynomial =7;//CRC7

          SPI_Init(SPI2,&SPI_InitStructure);
          SPI_Cmd(SPI2, ENABLE);

          //spi的配置結(jié)束了可以使用了。

          也可用 函數(shù)SPI_StructInit 把SPI_InitStruct中的每一個參數(shù)按缺省值填入

          _____________________________________________________________________________________

          發(fā)送緩沖器空閑標(biāo)志(TXE)
          此標(biāo)志為’1’時表明發(fā)送緩沖器為空,可以寫下一個待發(fā)送的數(shù)據(jù)進(jìn)入緩沖器中。當(dāng)寫入SPI_DR時,TXE標(biāo)志被清除。
          接收緩沖器非空(RXNE)
          此標(biāo)志為’1’時表明在接收緩沖器中包含有效的接收數(shù)據(jù)。讀SPI數(shù)據(jù)寄存器可以清除此標(biāo)志。

          注意在2.0的庫中函數(shù) SPI_SendData SPI_ReceiveDataSPI_GetFlagStatus 等在3.0的庫中 變?yōu)?/p>

          SPI_I2S_SendDataSPI_I2S_ReceiveData SPI_I2S_GetFlagStatus

          寫一個發(fā)送/接受函數(shù)

          static u8 SPIByte(u8 byte)

          {

          while((SPI2->SR &SPI_I2S_FLAG_TXE)==RESET);
          //while((SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE))==RESET);

          SPI2->DR = byte;
          //SPI_I2S_SendData(SPI2,byte);

          while((SPI2->SR &SPI_I2S_FLAG_RXNE)==RESET);

          //while((SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE))==RESET);
          return(SPI2->DR);

          //returnSPI_I2S_ReceiveData(SPI2);讀寄存器用硬件清除標(biāo)志位。
          //SPI_I2S_ClearFlag(SPI2,SPI_I2S_FLAG_RXNE) ;直接軟件清除標(biāo)志位。
          }

          這里有兩種寫法直接操作寄存器與用庫函數(shù),相對來說直接操作寄存器應(yīng)該更直觀一些



          關(guān)鍵詞: STM32SPI接

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();