基于PIC16F73單片機(jī)和ADS8341的SPI通信軟硬件實現(xiàn)方法
PIC單片機(jī)為美國微芯公司(Ml-CROChip)公司生產(chǎn)研發(fā),品種極其豐富,各系列片內(nèi)功能資源各不相同,可以滿足用戶不同層次的開發(fā)要求。它采用哈佛總線結(jié)構(gòu)和精簡指令集(RISC)技術(shù),其尋址方式簡單、運行速度快、功耗低、驅(qū)動能力強(qiáng)等。在MICROCHIP公司PIC系列產(chǎn)品里,有低檔、中擋、高擋單片機(jī),且大部分都帶有USART、SPI、IIC等總線接口,有的甚至還帶有USB和CAN模塊。這些特點給開發(fā)者帶來了很大的方便。
1.ADS8341的特性 ADS8341是一種比較新的逐次逼近式的16位的A/D轉(zhuǎn)換器件,其需要2.7~5V單電壓供電,具有4通道單獨輸入或2通道差動輸入,可以通過一個8位的控制字來選擇其輸入通道,且轉(zhuǎn)換速率大于100kHz,精度比較高,具有86dB的信噪比,帶有串行外圍接口(SPI)。其這些特點給數(shù)據(jù)采集帶來了極大的方便。其控制字節(jié)如下表所示。
根據(jù)上表中的介紹,本文中設(shè)置ADS8341的控制命令字為94H,即S置1,控制信號開始,A2A1A0置001,選擇通道CHO,SGL/DIF置1,選擇單通道輸入,PDIPDO置00,選擇低功耗模式和工作方式為外部時鐘模式。
在本文中外部時鐘模式工作,即ND的移位時鐘由PIC16F73提供,外部時鐘控制A/D轉(zhuǎn)換過程和輸入時鐘。當(dāng)ADS8341接收完控制字節(jié)的最后一位緊接著的一個時鐘周期過后BUSY腳就會被ADS8341拉高,隨后轉(zhuǎn)換結(jié)果會建立并在后16個時鐘周期的下降沿出現(xiàn)在DOUT上,如下圖時序圖所示在外部時鐘模式下的忙狀態(tài)BUSY保持高電平直到MSB被建立,要消耗一個時鐘周期,16位的轉(zhuǎn)換數(shù)據(jù)完全輸出需要16個時鐘周期,這樣一次數(shù)據(jù)采樣最少需要25個時鐘周期。因為PIC16F73單片機(jī)連接都用8Bit傳送數(shù)據(jù),這意味著必須增加一個額外的傳送來捕獲LSB,這里采用了32個時鐘周期來處理這樣的要求,每次轉(zhuǎn)換用32個時鐘周期,前8個時鐘周期用于發(fā)送控制字,后24時鐘周期將采樣結(jié)果從ADS8341輸出。最后8個時鐘周期的第一個時鐘周期用來捕獲LSB位,剩下的最后7個時鐘周期空閑。
2.硬件方法實現(xiàn)SPI通信SPI是由美國摩托羅拉公司推出的一種同步串行傳輸規(guī)范,常作為單片機(jī)外設(shè)芯片串行擴(kuò)展接口。SPI有4條引腳:SS(從器件選擇線),SDO(串行數(shù)據(jù)輸出線),SDI(串行數(shù)據(jù)輸入線),SCK(同步串行時鐘線)。SPI可以用全雙工通信方式同時發(fā)送和接受8位數(shù)據(jù)。在發(fā)送數(shù)據(jù)時,只需將要發(fā)送的數(shù)據(jù)送入發(fā)送數(shù)據(jù)緩沖區(qū)SSPBUF中,系統(tǒng)硬件會自動將發(fā)送數(shù)據(jù)緩沖區(qū)里的數(shù)據(jù)裝載到移位寄存器SSPSR中,然后根據(jù)預(yù)先選中的時鐘節(jié)拍進(jìn)行移位將數(shù)據(jù)串行發(fā)送,主機(jī)在發(fā)送8個Bit的數(shù)據(jù)的同時也接收了8個Bit的數(shù)據(jù)。
如上圖所示,為硬件實現(xiàn)SPI通信時的PIC16F73與ADS8341的連接電路圖,當(dāng)在啟動ADS8341進(jìn)行數(shù)據(jù)采集時首先按照要求將8個Bit的控制字串行發(fā)送給ADS8341,然后ADS8341開始按照控制字的要求工作,等控制字發(fā)送完畢后,向ADS8341發(fā)送3個8Bit無效數(shù)據(jù),以提供給ADS8341移位時鐘DCLK,當(dāng)這24個Bit的數(shù)據(jù)發(fā)送完畢時,也就接收到了所采集到的16Bit的數(shù)據(jù)。這樣一次數(shù)據(jù)采樣需要了32個時鐘周期。
PIC16f73控制ADS8341工作的子程序如下:
3.軟件方法實現(xiàn)SPI通信
如上圖所示,在此方法中使用RBO模擬SPI方式下的移位時鐘DCLK,RB1模擬專用輸入引腳SDI,RB2模擬專用輸出引腳DOUT。RB3用以判斷一個字節(jié)的數(shù)據(jù)是否轉(zhuǎn)換完成。模擬DCLK時鐘時,高電平和低電平的輸出時間必須大于或等于Tch和Tcl.的最小值,根據(jù)ADS8341的數(shù)據(jù)采集時序圖1可以對單片機(jī)寫控制程序。
空閑時讓RBO口置低電平以使DCLK停留在低電平上。當(dāng)要發(fā)送控制字時,首先判斷其第一位是1還是0,若是0則先把RB2口置低,然后RBO口置3個指令周期時間(3T>Tch=Tcl.)的高電平后再置3個指令周期時間低電平,就將一位O送出。若是1,則將RB2口置高,然后RBO口置3個指令周期時間(3T>Tch=Tcl.)的高電平后再置3個指令周期時間低電平,就將一位1送出。同理,連續(xù)將控制字的8個Bit發(fā)送完畢。當(dāng)控制字發(fā)送完畢后,用RBO模擬16個移位時鐘周期,最后用RBO模擬空走8個移位時鐘周期以從ADS8341中輸出LSB位,這樣一次數(shù)據(jù)采樣需要了32個時鐘周期。PIC16F73在每個移位時鐘DCLK的下降沿時讀出PORTB的Bitl位,然后送給狀態(tài)寄存器STATUS的狀態(tài)標(biāo)志位C,再使用循環(huán)左移指令RLF將狀態(tài)標(biāo)志位C里的數(shù)值移進(jìn)RESUALTG和RESUALTL寄存器里,
PIC16f73控制ADS8341工作的子程序如下: