一、SH32F9001 SPI簡介
SPI(Serial peripheral interface)即串行外圍設(shè)備接口,是由Motorola首先在其MC68HCxx系列單片機(jī)上定義的,基于高速全雙工總線的通訊協(xié)議。被廣泛應(yīng)用于LCD、閃存芯片等設(shè)備與MCU之間通訊。SH32F9001包含2個獨(dú)立的串行外設(shè)接口SPI0/1,主從機(jī)可選,10個可編程主時鐘頻率,極性相位可編程,數(shù)字位寬8/16位可選,支持DMA通信,帶MCU中斷的主模式故障出錯標(biāo)志,寫入沖突標(biāo)志保護(hù),可選擇LSB或MSB傳輸。
二、 SPI的物理層與協(xié)議層簡介
1、SPI物理層
SPI通訊需要使用4條線:3條總線(SCK、MOSI、MISO)和1條片選(nSS)。
Master與Slave連接示意圖(只需要連接4條線)
SCK(Serial Clock):時鐘信號線,通訊數(shù)據(jù)同步用,由主機(jī)產(chǎn)生,決定了SPI的通訊速率。
MOSI(Master Output Slave Input):主機(jī)輸出數(shù)據(jù)/從設(shè)備輸入數(shù)據(jù)線,即這條數(shù)據(jù)線上傳輸主機(jī)發(fā)給從機(jī)的數(shù)據(jù)。
MISO(Master Input Slave Output):主機(jī)輸入數(shù)據(jù)/從設(shè)備輸出數(shù)據(jù)線,即這條數(shù)據(jù)線上傳輸從機(jī)發(fā)給主機(jī)的數(shù)據(jù)。
nSS(Slave Select):片選信號線,主要用于選中對應(yīng)的SPI從設(shè)備,低電平有效。每個從設(shè)備獨(dú)立擁有一條nSS信號線,占據(jù)主機(jī)的一個引腳。設(shè)備的其它三根總線是并聯(lián)到SPI主機(jī)的,即無論多少個從設(shè)備,都共同使用這3條線。當(dāng)從設(shè)備上的nSS引腳被拉低時說明該從設(shè)備被主機(jī)選中,可以與主機(jī)進(jìn)行通訊。
一個Master與多個Slave連接示意圖
(2)SPI 協(xié)議層
如上圖為SH32F9001芯片SPI的一種通訊模式(CPOL=1,CPHA=0)時序圖,nSS、SCK、MOSI信號均由Master產(chǎn)生,MISO信號由從機(jī)產(chǎn)生。在nSS為低電平的前提下,MOSI和MISO信號才有效,在每個時鐘周期MOSI和MISO傳輸一位數(shù)據(jù)。
SPI通訊也需要通訊的起始/結(jié)束信號,有效數(shù)據(jù)和同步時鐘。途中nSS信號由高電平變?yōu)榈碗娖郊礊镾PI的起始信號,nSS信號由低電平變?yōu)楦唠娖郊礊镾PI通訊的結(jié)束信號。當(dāng)從機(jī)檢測到nSS引腳被拉低時就知道自己被主機(jī)選中,準(zhǔn)備和主機(jī)進(jìn)行通訊。
SPI通訊的數(shù)據(jù)采集是個相對復(fù)雜的環(huán)節(jié)且有多種模式,現(xiàn)在只以上圖(CPOL=1,CPHA=0)情形為例進(jìn)行簡單講解。途中Capture Point行箭頭指示的地方即為有效數(shù)據(jù)被采集的時間點(diǎn)。SCK、MOSI、MISO線上的數(shù)據(jù)在每個SCK時鐘周期傳輸一位數(shù)據(jù),數(shù)據(jù)的輸入/輸出是可以同時進(jìn)行的。由上圖可知,在SCK為奇數(shù)邊沿,即SCK下降沿時,數(shù)據(jù)得到有效采樣,也就是說,在這個時刻,MISO和MOSI的數(shù)據(jù)有效,高電平表示1,低電平表示數(shù)據(jù)0,在其它時刻數(shù)據(jù)并無效,可以理解為為下一次MISO和MOSI的數(shù)據(jù)傳輸做準(zhǔn)備,在非采樣時刻MOSI和MISO上的信號才能切換。
數(shù)據(jù)傳輸中,先傳送高位還是低位,SPI并無明確規(guī)定,但是數(shù)據(jù)要在主從機(jī)中正確傳輸,首先要約定好先傳高還是低,一般是高位在先的方式傳輸。
三、 SPI的時鐘極性(CPOL)和時鐘相位(CPHA)
時鐘極性(CPOL)指通訊設(shè)備處于空閑狀態(tài)時,SCK的狀態(tài),即空閑時SCK是高電平還是低電平。時鐘相位(CPHA)指數(shù)據(jù)采樣時刻位于SCK的偶數(shù)邊沿采樣還是奇數(shù)邊沿采樣。
CPOL=0時SCK在空閑時為低電平;CPOL=1時SCK在空閑時為高電平;CPHA=0時,在SCK的計數(shù)邊沿采樣;CPHA=1時,在SCK的偶數(shù)邊沿采樣。所以SPI的采樣時刻并非由上升沿/下降沿決定的,而是由CPOL與CPHA所組合的工作模式?jīng)Q定。所以SPI有4種工作模式。
工作模式 | CPOL | CPHA | 空閑時SCK時鐘 | 采樣時鐘邊沿 |
1 | 0 | 0 | 低 | 奇數(shù)邊沿 |
2 | 0 | 1 | 低 | 偶數(shù)邊沿 |
3 | 1 | 0 | 高 | 奇數(shù)邊沿 |
4 | 1 | 1 | 高 | 偶數(shù)邊沿 |
注意:在配置主機(jī)和從機(jī)的工作模式時,需要配置為相同的工作模式,只有模式相同才能進(jìn)行正確通訊。
四、 SH32F9001與閃存W25Q128通訊示例
1、W25Q128簡介
W25Q128芯片是串行閃存,可以通過四線SPI控制,管腳如下圖所示。使用SPI控制時,DO管腳為MISO,DI管腳為MOSI,/CS為片選NSS,CLK為時鐘信號線。
W25Q128通過命令操作,這里簡單介紹幾條接下來示例中與32F9001通訊的指令,其它指令詳情可以參考其數(shù)據(jù)手冊。
(1)讀制造商/設(shè)備ID指令:0x90
該指令通常在調(diào)試程序時候用到,判斷SPI通信是否正常。SH32F9001做主機(jī)拉低/CS片選使能器件開始傳輸,首先通過DI腳即MOSI線傳送”90H”指令,接著傳輸“000000H”的24位地址,之后W25Q128會通過DO腳即MISO腳傳送制造商ID(EFH)和設(shè)備ID(17H)。
(2)寫使能指令:0x06
SH32F9001向FLASH發(fā)送0x06寫使能指令即可開啟寫使能,該指令先拉低/CS引腳電平,接著傳輸“06H”指令。
(3)讀數(shù)據(jù)指令:0x03
讀數(shù)據(jù)指令可以從存儲器依次一個或多個讀取數(shù)據(jù)字節(jié),該指令通過主器件拉低/CS電平能設(shè)備開始傳輸,然后傳輸“03H”指令,接著通過DI管腳傳輸24位地址,W25Q128器件得到地址后,尋址存儲器中的數(shù)據(jù)通過DO引腳即MISO傳輸給SH32F9001。
(4)頁編程指令:0x02
頁編程指令可以在擦除的存儲單元中寫入256個字節(jié)。該指令先拉低/CS引腳,接著傳輸“02H”指令和24位地址。后面接著傳輸至少一個字節(jié)數(shù)據(jù),最多256字節(jié)。
2、SH32F9001與W25Q128硬件連接示意圖:
SH32F9001與W25Q128進(jìn)行SPI通信只需要對應(yīng)連接4條線就可以,將SH32F9001的PC6配置為nSS腳,PC7配置為MISO,PC8配置為MOSI,PC9配置為SCK。
3、SH32F9001與W25Q128通訊程序。
void SPI_GPIO_Config(void)//GPIO初始化
{
RCC->RCCLOCK= 0x33CC; //打開時鐘配置鎖定寄存器
RCC->AHBENR.BIT.IOCLKEN= 1; //使能IO時鐘
RCC->RCCLOCK= 0; //關(guān)閉時鐘配置鎖定寄存器
GPIOC_CFG->LCKR.BIT.LOCK=0X5AA5; //解鎖GPIOA配置鎖
GPIOC_CFG->LCKR.BIT.LCK=0;
GPIOC->MODER =0X0340; //設(shè)置PC6/C8/C9口為輸出模式PC7輸入模式
GPIOC_CFG->OTYPER=0X0; //設(shè)置PC6/C8/C9口輸出方式為推挽輸出
GPIOC_CFG->PUPDR.BIT.PHDR9=1; //PC9開上拉
GPIOC_CFG->AFRL.BIT.AFR6=0X03;//設(shè)置PC6口為SPI0-SCK腳模式
GPIOC_CFG->AFRL.BIT.AFR7=0X03;//設(shè)置PC7口為SPI0-MISO腳模式
GPIOC_CFG->AFRH.BIT.AFR8=0X03;//設(shè)置PC8口為SPI0-MOSI腳模式
GPIOC_CFG->AFRH.BIT.AFR9=0X01;//PC9口為nSS腳
GPIOC_CFG->LCKR.BIT.LOCK=0; //關(guān)閉GPIOC配置鎖
GPIOC_CFG->LCKR.BIT.LCK=0XFFFF;
}
voidSPI0Init(void) //SPI0初始化
{
GPIOC->BSRR.V32=0x0200;// SPI0 flash不選中
RCC->RCCLOCK = 0x33CC; //打開時鐘配置鎖定寄存器
RCC->APB1ENR.BIT.SPI0EN =1; //使能SPI0時鐘
RCC->RCCLOCK = 0; //關(guān)閉時鐘配置鎖定寄存器
SPI0->CR.BIT.SPR=0X04; //SPI0時鐘為PCLK1/32分頻
SPI0->CR.BIT.SSDIS=0; //打開NSS引腳
SPI0->CR.BIT.CPOL=1; //在空閑模式SCK處于高電平
SPI0->CR.BIT.CPHA=1; //SCK周期的第二沿采集數(shù)據(jù)
SPI0->CR.BIT.MSTR=1; //配置SPI0為主機(jī)模式
SPI0->CR.BIT.DIR =0;//MSB優(yōu)先發(fā)送
SPI0->CR.BIT.SPDATL =0; //SPI0每次發(fā)送8Bit數(shù)據(jù)
SPI0->CR.BIT.SPIEN=1; //使能SPI
}
-
單片機(jī)
+關(guān)注
關(guān)注
6037文章
44563瀏覽量
635838 -
接口
+關(guān)注
關(guān)注
33文章
8612瀏覽量
151287 -
SPI
+關(guān)注
關(guān)注
17文章
1707瀏覽量
91664 -
物理層
+關(guān)注
關(guān)注
1文章
151瀏覽量
34393 -
通訊協(xié)議
+關(guān)注
關(guān)注
10文章
275瀏覽量
20361
原文標(biāo)題:SH32F9001的SPI介紹與應(yīng)用
文章出處:【微信號:SINO_25181447,微信公眾號:中穎電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論