學(xué)過SPI總線后,不難發(fā)現(xiàn)SPI總線通信時序與DS1302通信時序有相似之處。
然而DS1302模塊卻僅有三根線,事實上,DS1302的通信是SPI的變異種類,它采用了SPI的通信時序,但是通信的時候沒有完全按照SPI的規(guī)則來,下面我們將逐步分析DS1302的變異SPI通信方式
首先來看DS1302單字節(jié)寫入操作(圖一):

然后我們再對比一下CPOL=0并且CPHA=0的情況下的SPI的操作時序(圖二):

在兩者的通信時序中,使能信號是相反的。對于通信寫數(shù)據(jù),都是在SCK的上升沿,從機進行采樣,下降沿的時候,主機發(fā)送數(shù)據(jù)(為什么從機是在上升沿采樣,請看下文注釋1)。DS1302的時序里,單片機要預(yù)先寫一個字節(jié)指令,指明要寫入的寄存器的地址以及后續(xù)的操作是寫操作,然后再寫入一個字節(jié)的數(shù)據(jù)。
注釋1:DS1302時序圖時鐘信號上的箭頭是針對DS1302而言的,即:時鐘模塊在箭頭進行數(shù)據(jù)采樣或數(shù)據(jù)輸出。同樣,在非箭頭處,主機(單片機)進行數(shù)據(jù)采樣或數(shù)據(jù)輸出。而上圖時序圖為寫數(shù)據(jù),即時鐘模塊接收數(shù)據(jù),因此時鐘模塊在箭頭處進行的是數(shù)據(jù)采樣工作(接收單片機輸出的數(shù)據(jù))。單片機向外發(fā)送數(shù)據(jù),因此主機在下降沿進行的是數(shù)據(jù)輸出工作。
對于DS1302的單字節(jié)讀操作,時序圖如下:

需要注意的是:
一、DS1302的單字節(jié)讀操作分為兩步,第一步主機向從機寫入地址(與上文中單字節(jié)寫操作的時序圖相同),第二步DS1302才開始向主機發(fā)送數(shù)據(jù)。觀察第二步時序圖中時鐘信號上面的箭頭可以發(fā)現(xiàn),DS1302在下降沿向外傳輸數(shù)據(jù)(根據(jù)上文中對于箭頭的解釋,此時正在進行讀操作,即DS1302向單片機發(fā)送數(shù)據(jù),所以時鐘模塊此時進行的是數(shù)據(jù)傳輸工作)。那么在沒有箭頭的上升沿,單片機進行的則是數(shù)據(jù)采樣工作。
二、我們的單片機沒有標(biāo)準(zhǔn)的SPI接口,和I2C一樣需要用IO口來模擬通信過程。在讀DS1302的時候,理論上SPI是上升沿讀取,但是我們的程序是用IO口模擬的,所以數(shù)據(jù)的讀取和時鐘沿的變化不可能同時了,必然就有一個先后順序。通過實驗發(fā)現(xiàn),如果先讀取IO線上的數(shù)據(jù),再拉高SCLK產(chǎn)生上升沿,那么讀到的數(shù)據(jù)一定是正確的,而顛倒順序后數(shù)據(jù)就有可能出錯。這個問題產(chǎn)生的原因還是在于DS1302的通信協(xié)議與標(biāo)準(zhǔn)SPI協(xié)議存在的差異造成的,如果是標(biāo)準(zhǔn)SPI的數(shù)據(jù)線,數(shù)據(jù)會一直保持到下一個周期的下降沿才會變化,所以讀取數(shù)據(jù)和上升沿的先后順序就無所謂了;但DS1302的IO線會在時鐘上升沿后被DS1302釋放,也就是撤銷強推挽輸出變?yōu)槿跸吕瓲顟B(tài),而此時在51單片機引腳內(nèi)部上拉的作用下,IO線上的實際電平會慢慢上升,從而導(dǎo)致在上升沿產(chǎn)生后再讀取IO數(shù)據(jù)的話就可能出錯。因此這里的程序我們按照先讀取IO數(shù)據(jù),再拉高SCLK產(chǎn)生上升沿的順序。
最后需要注意的是:只有在SCLK為低電平時,才能將CE置為高電平。因為SCLK連接的是單片機IO口,默認(rèn)情況下為高電平。若CE置為高電平(置為高電平后DS1302開始工作)后將SCLK拉低,這相當(dāng)于在時鐘模塊開始工作后,SCLK來了一個下降沿,這與時序圖是不符合的。