linux下的I2C溫度傳感器應用

需求:
  讀嵌入式溫度傳感器的值。

已知條件:
*溫度傳感器已經在主板上焊好了。
*溫度傳感器型號爲lm75
*linux自帶驅動,在linux-2.6.20.21/drivers/hwmon/lm75.c
*溫度傳感器的電路
temperature sensor

 

問題與解答:
*linux自帶的驅動怎麼用的?

看lm75.c的代碼,發現此溫度傳感器用的是I2C的總線。
代碼中看到i2c驅動的接口定義如下,和以前做過的字符型驅動的接口不一樣。

在linux Device Driver這本書中搜,在此書中無介紹。

 

www.linuxjournal.com/article/7136www.linuxjournal.com/article/7252講得還不錯。尤其是後者對路。I2C在讀主板上的傳感器的應用上應用比較多,但它是在比較新的版本的LINUX內核版本中才加進來的,難怪LDD這本書中沒有講了。

再看上面數據結構中的回調函數,具體幹什麼就比較清楚了。根據函數內容得知,驅動在加載的時候會自動檢測I2C總線上的設備,因此會自動發現溫度傳感器。lm75_update_device()是對溫度傳感器進行輪詢讀數時用的函數。

根據文章指引,看設備的/sys/bus/i2c/。下面已經有了lm75傳感器的數據,直接讀是有數據的,而且數據會變化,如下:


root:~# cat /sys/bus/i2c/devices/0-0048/temp1_input
-31500


*讀數爲負。什麼樣的讀數纔是正常的?
在驅動代碼裏增加了調試信息,打印出傳感器上讀的寄存器的值,和文件系統上讀出的不一樣。
看 linux-2.6.20.21/Documentation/hwmon/lm75,瞭解到lm75是一個工業標準。所以linux裏的lm75驅動是支持多種溫度傳感器的。

看了一下板子上的芯片,是lm75A.在網上下載了一個datasheet,上面顯示一共9-bit來控制讀數。頭位爲正負,後面8-bit爲值。
在驅動代碼裏添加調試信息,只打印寄存器值的後8-bit,放到溫度實驗箱裏測試的結果看起來滿合理的。

 

  

 

 


  

 
  

然後把內核的lm75.h的代碼修正(只讀後面8個比特並根據大小判斷正負),測試通過。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章