學(xué)過SPI總線后,不難發(fā)現(xiàn)SPI總線通信時(shí)序與DS1302通信時(shí)序有相似之處。
然而DS1302模塊卻僅有三根線,事實(shí)上,DS1302的通信是SPI的變異種類,它采用了SPI的通信時(shí)序,但是通信的時(shí)候沒有完全按照SPI的規(guī)則來,下面我們將逐步分析DS1302的變異SPI通信方式
首先來看DS1302單字節(jié)寫入操作(圖一):
然后我們?cè)賹?duì)比一下CPOL=0并且CPHA=0的情況下的SPI的操作時(shí)序(圖二):
在兩者的通信時(shí)序中,使能信號(hào)是相反的。對(duì)于通信寫數(shù)據(jù),都是在SCK的上升沿,從機(jī)進(jìn)行采樣,下降沿的時(shí)候,主機(jī)發(fā)送數(shù)據(jù)(為什么從機(jī)是在上升沿采樣,請(qǐng)看下文注釋1)。DS1302的時(shí)序里,單片機(jī)要預(yù)先寫一個(gè)字節(jié)指令,指明要寫入的寄存器的地址以及后續(xù)的操作是寫操作,然后再寫入一個(gè)字節(jié)的數(shù)據(jù)。
注釋1:DS1302時(shí)序圖時(shí)鐘信號(hào)上的箭頭是針對(duì)DS1302而言的,即:時(shí)鐘模塊在箭頭進(jìn)行數(shù)據(jù)采樣或數(shù)據(jù)輸出。同樣,在非箭頭處,主機(jī)(單片機(jī))進(jìn)行數(shù)據(jù)采樣或數(shù)據(jù)輸出。而上圖時(shí)序圖為寫數(shù)據(jù),即時(shí)鐘模塊接收數(shù)據(jù),因此時(shí)鐘模塊在箭頭處進(jìn)行的是數(shù)據(jù)采樣工作(接收單片機(jī)輸出的數(shù)據(jù))。單片機(jī)向外發(fā)送數(shù)據(jù),因此主機(jī)在下降沿進(jìn)行的是數(shù)據(jù)輸出工作。
對(duì)于DS1302的單字節(jié)讀操作,時(shí)序圖如下:
需要注意的是:
一、DS1302的單字節(jié)讀操作分為兩步,第一步主機(jī)向從機(jī)寫入地址(與上文中單字節(jié)寫操作的時(shí)序圖相同),第二步DS1302才開始向主機(jī)發(fā)送數(shù)據(jù)。觀察第二步時(shí)序圖中時(shí)鐘信號(hào)上面的箭頭可以發(fā)現(xiàn),DS1302在下降沿向外傳輸數(shù)據(jù)(根據(jù)上文中對(duì)于箭頭的解釋,此時(shí)正在進(jìn)行讀操作,即DS1302向單片機(jī)發(fā)送數(shù)據(jù),所以時(shí)鐘模塊此時(shí)進(jìn)行的是數(shù)據(jù)傳輸工作)。那么在沒有箭頭的上升沿,單片機(jī)進(jìn)行的則是數(shù)據(jù)采樣工作。
二、我們的單片機(jī)沒有標(biāo)準(zhǔn)的SPI接口,和I2C一樣需要用IO口來模擬通信過程。在讀DS1302的時(shí)候,理論上SPI是上升沿讀取,但是我們的程序是用IO口模擬的,所以數(shù)據(jù)的讀取和時(shí)鐘沿的變化不可能同時(shí)了,必然就有一個(gè)先后順序。通過實(shí)驗(yàn)發(fā)現(xiàn),如果先讀取IO線上的數(shù)據(jù),再拉高SCLK產(chǎn)生上升沿,那么讀到的數(shù)據(jù)一定是正確的,而顛倒順序后數(shù)據(jù)就有可能出錯(cuò)。這個(gè)問題產(chǎn)生的原因還是在于DS1302的通信協(xié)議與標(biāo)準(zhǔn)SPI協(xié)議存在的差異造成的,如果是標(biāo)準(zhǔn)SPI的數(shù)據(jù)線,數(shù)據(jù)會(huì)一直保持到下一個(gè)周期的下降沿才會(huì)變化,所以讀取數(shù)據(jù)和上升沿的先后順序就無所謂了;但DS1302的IO線會(huì)在時(shí)鐘上升沿后被DS1302釋放,也就是撤銷強(qiáng)推挽輸出變?yōu)槿跸吕瓲顟B(tài),而此時(shí)在51單片機(jī)引腳內(nèi)部上拉的作用下,IO線上的實(shí)際電平會(huì)慢慢上升,從而導(dǎo)致在上升沿產(chǎn)生后再讀取IO數(shù)據(jù)的話就可能出錯(cuò)。因此這里的程序我們按照先讀取IO數(shù)據(jù),再拉高SCLK產(chǎn)生上升沿的順序。
最后需要注意的是:只有在SCLK為低電平時(shí),才能將CE置為高電平。因?yàn)镾CLK連接的是單片機(jī)IO口,默認(rèn)情況下為高電平。若CE置為高電平(置為高電平后DS1302開始工作)后將SCLK拉低,這相當(dāng)于在時(shí)鐘模塊開始工作后,SCLK來了一個(gè)下降沿,這與時(shí)序圖是不符合的。