1 引言
串行外圍設備接口SPI(serial peripheral interface)總線(xiàn)技術(shù)是Motorola公司推出的一種通用串行接口。它是一種三線(xiàn)同步總線(xiàn),硬件功能很強。但是在數字溫度傳感器TC77與三星S
2 數字溫度傳感器TC77
TC77是Microchip公司生產(chǎn)的串聯(lián)可訪(fǎng)問(wèn)數字溫度傳感器,特別適合于廉價(jià)、小尺寸應用中。溫度數據從內部溫度敏感元件轉換而來(lái),隨時(shí)都可以轉化成13位有效數字。TC77在+

圖1 TC77引腳
表1 TC77引腳功能
| 引腳 | 引腳功能 |
| SI/O | 串行數據輸入/輸出 |
| SCK | 串行時(shí)鐘信號 |
| Vss | 地 |
| /CS | 片選(低電平有效) |
| VDD | 電源輸入(2.7V至5.5V有效) |
由于采用虛擬SPI時(shí)序進(jìn)行通信,在實(shí)現通信過(guò)程中,必須了解TC77傳感器數據輸入輸出的時(shí)序參數,否則無(wú)法實(shí)現正常通信,也就不能實(shí)現TC77與S
圖2 TC77數據輸出時(shí)序
表2 TC77數據輸出時(shí)序參數
| 參數 | 最小值 | 最大值 | 單位 |
| fclk(時(shí)鐘頻率) | — | 7.0 | MHz |
| tcs-sck(片選信號下跳沿到第一個(gè)SCK上升沿) | 100 | — | ns |
| tcs-SI/O(片選信號低到數據輸出延遲) | — | 70 | ns |
| tDO(SCK下跳沿到數據輸出的延遲) | — | 100 | ns |
| tDIS(片選信號高電平到數據輸出三態(tài)) | — | 200 | ns |
3 基于S
S
4虛擬SPI時(shí)序在通信接口中的設計與實(shí)現
雖然S

圖3 采用SPI虛擬時(shí)序法、TC77與S
根據TC77數據輸出時(shí)序及相關(guān)參數,一次數據輸出的虛擬SPI時(shí)序步驟如下:
1.將SC和/CS置高,初始化通信,將/CS置低,延遲,進(jìn)入開(kāi)始接受數據狀態(tài)。
2.將SC置低,延遲,將SC置高。
3.采樣SI/O信號線(xiàn)上的數據,延遲。
4.轉入步驟2,循環(huán)直至收到16位數據。
5.通過(guò)將/CS置高結束通信,進(jìn)入停止狀態(tài)。
虛擬SPI時(shí)序在通信接口中的實(shí)現如下:
(1) 設備的初始化及卸載
當設備驅動(dòng)程序通過(guò)insmod程序插入到核心時(shí),內核調用模塊的init函數,該函數名通過(guò)一個(gè)名為module-init的宏定義聲明,比如:module-init(init-temperature),
Static int_ _init inti-temperature(void)
{…
temperature-file=create-proc-entry(“tem”,044,NULL);//建立/proc/tem文件
temperature-fileàdata=NULL;//無(wú)需參數
temperature-file àread-proc=&proc_read;//指向回調函數指針,該函數會(huì )在文件讀操作時(shí)執行
temperature-file àwrite-proc=NULL;//無(wú)需寫(xiě)文件
temperature-file àowner=THIS_MODULE;//該文件為本模塊使用
gpbase=ioremap_nicache(0x56000000,0x80);//映射E端口虛地址
spi_con=readl(gpbase+0x40) ;//取出E端口控制字寄存器值
spi_dat=readl(gpbase+0x44);// 取出E端口數據寄存器值
writel(spi_con&0xf03fffff|0x05000000,gpbase+0x40) ;//E端口中E12、E13管腳設為輸出
//模式,E11設定為輸入模式
…
}
模塊卸載時(shí)通過(guò)用module_exit(cleanup-temperature)宏定義聲明卸載函數。、
Static void_ _ exitcleanup-temperature(void)
{ …
writel(gpbase+0x40,spi_con);//恢復E端口控制字
writel(gpbase+0x44,spi_dat);//恢復E端口控制字寄存器值
iounmap(gpbase);//取消虛地址映射
}
(2) 溫度采集函數
Static int proc_read (char *page, char**start,off_t off, int count, int *eof, void *data)
{
int len,temperature,i;
Writel(spi_dat&0xdfff,gpbase+0x44);//E13管腳設為低電平,發(fā)出選通信號
udelay(100);
Temperature=0;
For(i=0;i<16;i++){
writel(spi_dat&0xefff,gpbase+0x44)//E12引腳設為低,即時(shí)鐘線(xiàn)變?yōu)榈?/span>
Udelay(100);
writel(spi_dat|0x1000,gpbase+0x44);// E12引腳設為高,即時(shí)鐘線(xiàn)變?yōu)楦?/span>
Udelay(100);
temperature=((temperature<<1|(readl(gpbase+0x44)&(0x0800==0x0800))//讀取E11引腳狀態(tài)
}
writel(spi_dat|0x02000,gpbase+0x44);// E13管腳設為高電平,取消選通狀態(tài)
temperature/=128;
len=sprintf(page,”%+d”,temperature);
Return len;
}
(3)溫度數據的讀取
在用戶(hù)程序中,對設備文件/proc/temp讀取采集到的溫度值。
main()
{
…
Int fd=open(“/proc/temperature”,O_RDONLY );
read(fd,buffer,buffer_length);
close(fd);
…
}
5 結論
SPI總線(xiàn)現已廣泛應用于各種數字電路中,能夠與各種微處理器相連。尤其是在沒(méi)有設置SPI專(zhuān)用接口的場(chǎng)合,采用虛擬SPI的方法是一種簡(jiǎn)便易行的解決方案。實(shí)踐證明,虛擬SPI時(shí)序技術(shù)實(shí)現的通信具有穩定、正確、健壯、易用的特點(diǎn),其系統功能實(shí)現的可靠性以及成本、功耗等方面也都能滿(mǎn)足相關(guān)的需求。由于Linux操作系統源碼開(kāi)放、成熟、性能穩定,越來(lái)越多的開(kāi)發(fā)人員將其作為首要的開(kāi)發(fā)平臺,本系統中數字溫度傳感器TC77與S
參考文獻:
[1]Samsung Electronics Limited. User’s Manual of S
[2]Microchip Technology Inc. User’s Manual of TC77.
[3]Karim Yaghmour. Building Embedded LinuxSystems [M]. Publisher: O’Relly&Associates, 2003
[4]Craig Hollabaugh Embedded LinuxHardware, Software, and Interfacing [M]. Publisher: Addison-Wesley, 2002
聯(lián)系客服