久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2177|回復(fù): 0
收起左側(cè)

stm32 SPI接口實(shí)現(xiàn)

[復(fù)制鏈接]
ID:154904 發(fā)表于 2016-12-15 09:40 | 顯示全部樓層 |閱讀模式

通常SPI通過(guò)4個(gè)引腳與外部器件相連:

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

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

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

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


時(shí)鐘信號(hào)的相位和極性

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

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

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


1398086209323335046.jpeg

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

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

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


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


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


配置一個(gè)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時(shí)鐘懸空高
   SPI_InitStructure.SPI_CPHA =SPI_CPHA_1Edge;       //CPHA=1 數(shù)據(jù)捕獲第2個(gè)
   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中的每一個(gè)參數(shù)按缺省值填入


_____________________________________________________________________________________


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


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

SPI_I2S_SendData  SPI_I2S_ReceiveData  SPI_I2S_GetFlagStatus


寫(xiě)一個(gè)發(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)志位。
}


回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 午夜影院黄 | 国产毛片一级 | 国产精品国产精品国产专区不片 | 日韩久久久 | 亚洲伊人色 | 精品在线免费视频 | 超碰在线99 | av中文网 | 成年女人毛片 | 亚洲免费视频一区 | 日韩av网站在线观看 | 欧美激情视频一区二区 | 97国产在线 | 欧美激情xxxx| 国产成人97精品免费看片 | 亚洲精品网站在线观看 | 69堂视频| av毛片网站| 中文字幕综合网 | 久久久久久亚洲 | 国产免费一区二区三区 | 久久99深爱久久99精品 | 日韩超碰 | 日韩欧美黄色片 | 久久福利网 | 九九九久久久 | 成人黄色在线 | 九九视频在线观看 | 高清视频一区二区 | 免费在线观看黄色片 | 成人国产精品免费观看 | 日本男人天堂 | 久久精品国产精品 | 黄色片在线免费观看 | av手机天堂网 | 日韩一区二区三免费高清在线观看 | 蜜臀久久99精品久久久久久宅男 | 日韩不卡av| 国产一区二区在线观看视频 | 97国产视频 | 日韩欧美在线一区 |