同步串行口SPI的基本原理
DS1302的接口時(shí)序圖
DS1302的使用
M16的SPI的使用
SPI基本原理
spi
它是一種最常用的同步串行接口:同步的意思就是利用時(shí)鐘線對(duì)串行數(shù)據(jù)進(jìn)行同步在時(shí)鐘的上升沿或下降沿極性鎖存數(shù)據(jù).所以它的線至少有時(shí)鐘線和數(shù)據(jù)線.
一、同步串行口
利用時(shí)鐘線對(duì)串行數(shù)據(jù)進(jìn)行同步
上升沿或者下降沿鎖存數(shù)據(jù)
二、4線SPI:全雙工 (它的兩根數(shù)據(jù)線一個(gè)是收一個(gè)是發(fā)收發(fā)是可以同時(shí)進(jìn)行的,還有2根 SS
SCLK SS是用來(lái)幀同步的控制線,時(shí)鐘是SCLK 上升合下降 )
SS 、SCLK、MOSI、MISO
三、3線SPI:半雙工(半雙工,收和發(fā) 用同一根 DIO )
SS、SCLK、DIO
四、SPI時(shí)序圖
五、按照時(shí)序圖編寫(xiě)IO程序
一、上升沿:
PORTB &= ~(1<<5);
asm("NOP");
PORTB |= (1<<5);
二、下降沿:
PORTB |=(1<<5);
asm("NOP");
PORTB &= ~(1<<5);
下圖是DS1302的時(shí)序圖

從上圖可以看到它是屬于3線的SPI接口
讀操作:
單字節(jié)讀的時(shí)序
在CE它是一個(gè)幀同步在空閑的時(shí)候它是拉低的,它把CE拉高標(biāo)示這一幀就要開(kāi)始,然后在每一個(gè)SCLK的上升沿(S估計(jì)就是串行的意思CLK時(shí)鐘)我們看到每個(gè)上升沿上標(biāo)了一個(gè)小箭頭然后在每個(gè)I/O
數(shù)據(jù)線上,記住前8位叫做輸入地址的這樣的數(shù)據(jù),可以看到在每個(gè)時(shí)鐘的上升沿講每個(gè)數(shù)據(jù)寫(xiě)入這個(gè)DS1302,在這個(gè)后8位這個(gè)DS1302的I/O口就要有輸入狀態(tài)轉(zhuǎn)變?yōu)檩敵隹梢钥吹阶兂上陆笛厣狭,所以在讀數(shù)據(jù)的時(shí)候是在SCLK的下降沿上進(jìn)行輸出的。
然后單片機(jī)就可以用I/O將這8位數(shù)據(jù)一位一位的讀回來(lái),一幀2個(gè)字節(jié)16位結(jié)束之后呢?CE這根線就要拉低,表示這一幀結(jié)束了
寫(xiě)操作:
這是一個(gè)單字節(jié)寫(xiě)的時(shí)序
它與單字節(jié)讀非常類(lèi)似的也是CE
這根線的拉高與拉低表示這一幀數(shù)據(jù)的開(kāi)始和結(jié)束所不同的是這16位數(shù)據(jù)都是要輸入到DS1302里面去的也就是DS1302這個(gè)I/O一直是處于輸入狀態(tài)這個(gè)數(shù)據(jù)呢每個(gè)數(shù)據(jù)都是在每個(gè)數(shù)據(jù)的上升沿之中鎖入到DS1302之中、
這個(gè)是DS1302的時(shí)序圖,下面看看ATmega16的SPI接口的時(shí)序圖



可以看出他有4種模式 上升 下降 有兩種 共4種
等后面操作詳細(xì)講說(shuō)時(shí)序。
解釋?zhuān)合鄬?duì)于串行數(shù)據(jù),SCK的相位合極性有4種組合。CPHA和CPOL控制組合的方式。SPI數(shù)據(jù)傳輸格式見(jiàn)Figture
67與Figure 68,每一位數(shù)據(jù)的移出和移入發(fā)生于SCK不同的信號(hào)跳變沿,以保證有足夠的時(shí)間使數(shù)據(jù)穩(wěn)定。這個(gè)過(guò)程在Table 56
和Table 57 有清楚的說(shuō)明:sample(采樣)rising(上升) setup(設(shè)置)falling(下降)
呵呵英語(yǔ)不好。
Figure 67 是CPHA =0 時(shí)候的傳輸格式
Figure 68 是CPHA =1 時(shí)候的傳輸格式
ATmega 16 支持以上四種全部的模式 有的是上升沿鎖存有的是下降沿鎖存這四種模式,這四種模式我們一會(huì)在說(shuō)到ATmega
16 的SPI接口的時(shí)候會(huì)詳細(xì)給你們菜鳥(niǎo)說(shuō):
好了再看了SPI的時(shí)序圖之后要怎樣按照時(shí)序?qū)λ幊棠兀?/p>
在基本的邏輯里面同步都是靠時(shí)鐘的上升沿來(lái)進(jìn)行同步,也就是說(shuō)我們需要掌握這個(gè)I/O口讓他產(chǎn)生一個(gè)時(shí)鐘,它上升沿或者下降沿的方法,上升沿就是低跳變到高,我們以PORTB
它的第五位作為輸出口為例來(lái)進(jìn)行講解,產(chǎn)生上升沿首先它原先必須要是低輸出一個(gè)低電平0 PORTB
=~(1<<5) 拉低
然后一個(gè)延遲延遲也可以去掉要看接受方的SPI接受速度是怎么樣的了,不過(guò)一般的器件它的SPI速率都是非常高的,我們沒(méi)有必要考慮單片機(jī)是否過(guò)快對(duì)它有所影響因此這個(gè)asm("NOP");這條語(yǔ)句可以去掉不過(guò)這個(gè)是什么意思呢?asm
在C語(yǔ)言中插入一條匯編指令,NOP呢?NOP是匯編語(yǔ)言中的一條空指令表示的是CPU在接下來(lái)的一個(gè)CPU時(shí)鐘里面它是什么都不干,干等著這么一個(gè)CPU時(shí)鐘周期,所以就實(shí)現(xiàn)一個(gè)非常小的延時(shí)。然后呢再將PORTB
|=(1<<5)
它的第五位拉高,這樣就產(chǎn)生一個(gè)上升沿,同理下下降沿也是一樣的。接下來(lái)咱么講一下DS1302的時(shí)序圖吧。
DS1302的接口時(shí)序圖與AVR的接線圖
見(jiàn)DS1302的官方技術(shù)文檔
3線SPI與4線SPI的互聯(lián)

這個(gè)時(shí)序圖上面已經(jīng)說(shuō)過(guò)了,那么這個(gè)DS1302屬于3線的SPI 而ATmega 16
是4線的SPI接口那么3線合4線之間怎樣進(jìn)行互聯(lián)呢?我們看以采用下面的這種方法。

來(lái)看下電路圖

上圖的PB5 PB6
PB7 是單片機(jī)的三個(gè)I/O口。 可以看他它的第二功能是SPI功能
PB5可以看到MOSI
M是主 S 是從 意思就是主機(jī)輸出 從機(jī)輸入
同理PB6 MISO 是主機(jī)輸入
從機(jī)輸出 也就是AVR的SPI正常工作的時(shí)候PB6這個(gè)引腳它應(yīng)該是處于一個(gè)輸入的狀態(tài)PB5應(yīng)該是一個(gè)輸出的狀態(tài)。我們就將PB5
與PB6之間串上一個(gè)10K的電阻然后再將PB6直接接到I/O上,下面我們可以簡(jiǎn)單的分析一下原理圖是怎樣正常工作的,首先這個(gè)DS1302對(duì)它處于寫(xiě)的狀態(tài)的時(shí)候呢,DS1302的I/O口是處于輸入的,而PB6呢也是一個(gè)輸入口始終是一個(gè)輸入口。
