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