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