陳玉
摘 要:TDC-GP22芯片是一款皮秒級高精度時間數(shù)字轉(zhuǎn)換芯片,由于TDC-GP22內(nèi)部寄存器種類繁多,所以芯片編程操作相對較復(fù)雜。為此根據(jù)TDC-GP22的SPI接口特點,并結(jié)合AVR單片機主機優(yōu)勢,用高級語言編制符合SPI接口協(xié)議程序,實現(xiàn)對TDC-GP22的兩種主要操作,一種是按照SPI協(xié)議對芯片的寄存器進(jìn)行讀取數(shù)據(jù)操作,另一種是根據(jù)SPI協(xié)議數(shù)據(jù)循環(huán)特點對芯片寄存器進(jìn)行寫入數(shù)據(jù)操作。TDC-GP22實驗測試結(jié)果表明所編制程序運行完全穩(wěn)定可行。
關(guān)鍵詞:芯片;高級語言;單片機;接口
中圖分類號:TP31 文獻(xiàn)標(biāo)識碼:A
1 引言(Introduction)
TDC-GP22芯片是德國ACAM公司推出的一款高分辨率時間數(shù)字轉(zhuǎn)換芯片,高分辨率時間差計算使得TDC-GP22可以用于對時間精度要求嚴(yán)格的場合,如激光測距、電纜長度測量及超聲波流量計等領(lǐng)域。此芯片可以通過單片機讀寫其內(nèi)部寄存器來完成時間數(shù)字轉(zhuǎn)換,由于該芯片官方文檔資料比較零散,在芯片的開發(fā)和使用上帶來很多障礙,軟件程序難以調(diào)試,和單片機難以建立通信。同時TDC-GP22芯片是通過SPI(Serial Peripheral Interface)協(xié)議接口和主機建立通信,所以芯片編程上的主機程序需要嚴(yán)格遵循SPI接口協(xié)議來對TDC-GP22內(nèi)部寄存器進(jìn)行正確讀寫,從而完成TDC-GP22的時間數(shù)字轉(zhuǎn)換過程。
2 TDC-GP22的SPI接口協(xié)議(SPI interface protocol
of TDC-GP22 )
2.1 SPI通信協(xié)議接口簡介
SPI的中文名為串行外圍接口,該協(xié)議接口是由摩托羅拉公司提出的通信接口技術(shù);SPI是一種高速、全雙工、同步串行總線,SPI接口只占用可編程芯片的四個腳位,這四個腳位分別為主機輸入從機輸出(MISO)、主機輸出從機輸入(MOSI)、從機選擇線(SSN)及串行時鐘(SCK)。SPI協(xié)議接口的優(yōu)點主要表現(xiàn)為信號連接線少、全雙工通信、協(xié)議相對簡單及數(shù)據(jù)傳輸速率較高。SPI協(xié)議接口主要應(yīng)用在一些FLASH型可編程芯片,如模數(shù)轉(zhuǎn)換器、信號處理芯片和各類單片機等。
2.2 SPI通信協(xié)議接口工作原理
SPI通信雙方為主從方式,既SPI通信雙方一方為主設(shè)備另一方為從設(shè)備,SPI通信網(wǎng)絡(luò)中可以有多個從機,但是主機只能為一個,主機通過控制從機的SSN片選端來和相應(yīng)的從機建立數(shù)據(jù)通信;SPI通信雙方中的主機和從機的物理連接只要相應(yīng)功能引腳對應(yīng)連接即可,既主機MISO連接從機MISO,其他三類引腳也以此互相連接。SPI中的主從機的雙方移位寄存器連接成一個環(huán)形結(jié)構(gòu),主從機的數(shù)據(jù)通信通過在主機時鐘的控制下進(jìn)行每次兩個8bit數(shù)據(jù)的移出和移入,數(shù)據(jù)傳輸時高位在前低位在后。
2.3 TDC-GP22的SPI
TDC-GP22采用4線制SPI接口,SSN需要強制置高電平,在每次讀寫序列之間SSN保持高電平至少要50ns;TDC-GP22只支持如下SPI模式,時鐘極性位(Clock Polarity Bit)為0和時鐘相位(Clock Phase Bit)為1。
3 TDC-GP22的SPI主機選擇(SPI host selection of
TDC-GP22)
SPI主機的選擇最好選擇引腳功能具有SPI功能的各類單片機,當(dāng)然對于沒有SPI引腳功能的單片機也可以使用,只不過這類單片機需要在軟件程序中進(jìn)行額外的SPI功能模擬,相對給開發(fā)和使用上帶來一些難度。為了簡化單片機軟件程序和SPI通信中主從機的硬件電路,此處選擇ATMEL公司的ATmega128a低功耗單片機[1];ATmega128a單片機自帶SPI接口,該單片機為高性能低功耗8位單片機,工作于16MHz時性能高達(dá)16MIPS,ATmega128a自帶128K可編程Flash存儲,這樣方便使用C語言進(jìn)行大容量單片機編程。ATmega128a可在3.3V電壓下穩(wěn)定工作,TDC-GP22正常工作電壓也為3.3V[2],這樣兩者SPI引腳就可以直接進(jìn)行連接。
4 TDC-GP22和AVR單片機的SPI通信算法(SPI
communication algorithm between TDC-GP22
and AVR)
AVR單片機和TDC-GP22時間數(shù)字芯片之間以SPI方式通信,其中AVR單片機為主機,TDC-GP22為從機。
4.1 TDC-GP22算法前導(dǎo)
TDC-GP22有七個32位的配置寄存器,每個寄存器的高24位是用作配置,是只可以寫入的,這七個寄存器用于配置TDC-GP22的相應(yīng)操作。同時TDC-GP22還有相應(yīng)可讀狀態(tài)的結(jié)果寄存器和狀態(tài)寄存器[3,4],TDC-GP22的測量結(jié)果和測量狀態(tài)都可以通過發(fā)送操作碼0xBX從可讀寄存器中讀取。
4.2 TDC-GP22算法詳解
TDC-GP22在正常運行前,必須先對其七個配置寄存器進(jìn)行相應(yīng)的模式配置,七個配置寄存器的配置是相互聯(lián)系制約的,在寄存器參數(shù)的配置上不能有任何沖突,否則TDC-GP22會出現(xiàn)運行異常的狀況。下面代碼主要是七個配置寄存器的配置示例。
gp22_wr_config_reg(0x80,0x00242000); //最大測量時間2xTref=2μs
gp22_wr_config_reg(0x81,0x19490000); //在測量模式1下Stop CH2–Stop CH1
gp22_wr_config_reg(0x82,0xE0000000); //通過Timeout給出中斷
gp22_wr_config_reg(0x83,0x00000000);
gp22_wr_config_reg(0x84,0x20000000);
gp22_wr_config_reg(0x85,0x10000000); //EN_STARTNOISE=1,switch on
gp22_wr_config_reg(0x86,0x00000000);
gp22_send_1byte(0x70); //初始化
PORTF|=(1<<2); PORTF&=~(1<<2);
//給start引腳一個虛擬開始信號
上述代碼中為了測試stop2-stop1引腳時間差,所以先給start引腳一個虛擬開始信號,然后TDC-GP22的stop2和stop1引腳才開始工作。
下面示例函數(shù)gp22_send_1byte(unsigned char gp22_opcode_byte)可以按照SPI協(xié)議向TDC-GP22寄存器寫入相應(yīng)數(shù)據(jù)。
void gp22_send_1byte(unsigned char gp22_opcode_byte)
{
PORTB&=~(1<<0); //TDC-GP22的SS位置低
SPDR=gp22_opcode_byte;
while(?。⊿PSR&(1< delay_us(8); PORTB|=(1<<0); //將SS位置高 } 上述函數(shù)中主機往SPDR寫入數(shù)據(jù)以移位到從機中去,串行發(fā)送結(jié)束后,SPIF置位,若此時寄存器SPCR的SPIE和全局中斷使能位置位,SPI中斷即產(chǎn)生。 下面示例函數(shù)gp22_read_1_bytes(unsigned char read_opcode,unsigned char read_addr)為讀取TDC-gp22寄存器中八位數(shù)據(jù)算法;函數(shù)中SPDR=0xFF是每次虛寫一次寄存器,只有虛寫一次才能保證單片機和TDC-gp22二者的寄存器數(shù)據(jù)循環(huán)移位[5]。 unsigned char gp22_read_1_bytes(unsigned char read_opcode,unsigned char read_addr) { unsigned char read_opcode_addr=read_opcode|read_addr; PORTB&=~(1<<0); //ss置低 SPDR=read_opcode_addr; while(!(SPSR&(1< delay_us(8); SPDR=0xFF; //虛寫一次,推出數(shù)據(jù) while(!(SPSR&(1< delay_us(8); return SPDR; //主機讀取數(shù)據(jù) PORTB|=(1<<0); //將ss位置高 } 如下函數(shù)gp22_read_status_bytes()為讀取TDC-GP22中狀態(tài)寄存器算法,算法中用到了循環(huán)結(jié)構(gòu),這樣可以保證讀取TDC-GP22狀態(tài)寄存器的多個字節(jié)數(shù)據(jù)[6]。 unsigned int gp22_read_status_bytes() { int n; unsigned int Result_read=0; unsigned char n_bytes=2; unsigned char read_opcode_addr=0xB0|0x04; PORTB&=~(1<<0); //ss位置低 SPDR=read_opcode_addr; while(!(SPSR&(1< delay_us(8); SPDR=0xFF; //虛寫一次,推出數(shù)據(jù) while(?。⊿PSR&(1< delay_us(8); Result_read=SPDR; //主機讀取數(shù)據(jù) for(n=1;n SPDR=0xFF; //虛寫一次,推出數(shù)據(jù) while(?。⊿PSR&(1< delay_us(8); Result_read=Result_read<<8; Result_read |=SPDR; } PORTB|=(1<<0); //將ss位置高 return Result_read; } 以下函數(shù)gp22_wr_config_reg(unsigned char opcode_address,unsigned long config_reg_data)為寫狀態(tài)寄存器的示例算法,該算法中按照SPI協(xié)議規(guī)范,先寫高位字節(jié),然后再寫低位字節(jié)。 void gp22_wr_config_reg(unsigned char opcode_address, unsigned long config_reg_data) { unsigned char Data_Byte_Lo=config_reg_data; //自動截取低8位進(jìn)行賦值
unsigned char Data_Byte_Mid1=config_reg_data>>8;
unsigned char Data_Byte_Mid2=config_reg_data>>16;
unsigned char Data_Byte_Hi=config_reg_data>>24;
PORTB&=~(1<<0); //ss位置低
SPDR=opcode_address;
while(!(SPSR&(1< delay_us(8); SPDR=Data_Byte_Hi; while(?。⊿PSR&(1< delay_us(8); SPDR=Data_Byte_Mid2; while(!(SPSR&(1< delay_us(8); SPDR=Data_Byte_Mid1; while(?。⊿PSR&(1< delay_us(8); SPDR=Data_Byte_Lo; while(?。⊿PSR&(1< delay_us(8); PORTB|=(1<<0); //將ss位置高 } 5 實驗測試過程(Experimental testing process) 為了驗證上述算法的準(zhǔn)確性,專門用TDC-GP22進(jìn)行了雙絞線長度測試實驗;由于雙絞線可看作傳輸線,所以測量時向被測雙絞線注入一定寬度的入射矩形脈沖[7],如果被測雙絞線終端開路就會產(chǎn)生矩形脈沖的正反射,同時將入射矩形脈沖和反射脈沖分別送入TDC-GP22的stop1、stop2引腳,通過計算stop2-stop1的時間差并按如下公式即可計算出開路雙絞線的長度。 其中,L為被測電纜長度,V為脈沖信號在電纜中的傳播速度,一般V為0.66—0.85倍光速[8],約為200m/μs,?t為入射脈沖與反射脈沖的時間差,具體測試數(shù)據(jù)見表1。 表1 測試結(jié)果 Tab.1 Test results 實長 時間差 測試長度 測試狀態(tài) 5m 0.048μs 4.8m 開路 10m 0.1μs 10m 開路 20m 0.195μs 19.5m 開路 35m 0.346μs 34.6m 開路 100m 0.97μs 97m 開路 表1測試結(jié)果顯示雙絞線測試長度的誤差在10%以內(nèi),該誤差范圍符合實際工程需求,測試結(jié)果也驗證了TDC-GP22算法準(zhǔn)確穩(wěn)定。 6 結(jié)論(Conclusion) TDC-GP22的SPI協(xié)議接口編程必須嚴(yán)格按照SPI接口數(shù)據(jù)環(huán)狀傳輸?shù)奶攸c進(jìn)行編程控制,否則主機和從機難以建立有效的通信。TDC-GP22主機的選擇有多種方案,這里選用了AVR系列單片機,并用C語言做了編程示范,當(dāng)然也可以選用其他廠家其他型號的單片機作為控制主機,并結(jié)合相應(yīng)的程序語言進(jìn)行SPI接口編程。同時用測量雙絞線長度的實驗進(jìn)一步驗證了算法的準(zhǔn)確性。 參考文獻(xiàn)(References) [1] Microchip Technology.ATmega128A datasheet complete[EB/OL].https://www.microchip.com/wwwproducts/en/ATmega128A,2016-12-10. [2] Acam-messelectronic gmbh.TDC-GP22 ultrasonic flow converter datasheet[EB/OL].https://ams.com/tdc-gp22,2014-03-13. [3] 莫朗,朱建良,薄煜明.基于TDC-GP22的室內(nèi)定位系統(tǒng)的設(shè)計及實現(xiàn)[J].電子設(shè)計工程,2017,25(18):168-177. [4] 劉宇杰,李斌,劉振凱,等.基于TDC-GP22的超聲波流量計設(shè)計[J].工業(yè)控制計算機,2015,28(3):166-170. [5] 崔永俊,劉陽,楊兵.基于銣原子鐘和雙TDC-GP2的高精度時間基準(zhǔn)測量系統(tǒng)的設(shè)計[J].電子器件,2017,40(5):1072-1077. [6] 韋乃棋,陳自力,朱安石,等.基于TDC的無人機數(shù)據(jù)鏈抗干擾技術(shù)研究[J].測控技術(shù),2013,32(3):124-134. [7] 王紅亮,楊曉.AVR單片機與串行A/D的SPI接口設(shè)計[J].電測與儀表,2008,45(9):46-48. [8] 尹文芹,施韶華,劉音華.基于FPGA實現(xiàn)TDC的布局布線優(yōu)化方法研究[J].時間頻率學(xué)報,2018,41(1):27-36. 作者簡介: 陳 玉(1975-),男,碩士,實驗師.研究領(lǐng)域:計算機應(yīng)用技術(shù),嵌入式開發(fā).