2012-10-29 74 views
-1

你可以看看這個網站:http://www.hitechnic.com/cgi-bin/commerce.cgi?preadd=action&key=NSK1042以更好地理解我在說什麼。例如,網站上寫着:傳感器的I2C地址爲0x10的和值表就有記載:從i2c地址訪問值

Address  Type   Contents 

00 – 07H  chars   Serial Version Number 

43H   byte   Sensor 1 DC Signal Strength 

我如何用C訪問這些值?謝謝。

+1

i2c是與外部硬件通信的協議。對於i2c,在C中沒有本地支持。您需要使用庫或自行打印。你是Google嗎?你在用什麼處理器?什麼是C編譯器?沒有這些細節,問題可能會被關閉。請不要引用人鏈接,更好地包含問題中的相關信息。這些人是志願幫助你的時間,讓他們的生活變得容易。 –

回答

3

這些寄存器可以被存儲器映射。有幾件事情你需要做的:

  • 任何指針映射設備的物理內存給你的程序地址空間
  • 宣佈這一地區爲揮發性

volatile關鍵字將停止編譯器從「優化」程序是不正確的。例如通過假設讀取到相同的內存位置將產生相同的結果,因爲程序沒有寫入它。

這個簡單的部分是聲明一個結構,使所有的偏移量與設備相同,並且每個部分都有合適的大小。

struct hitech { 
    char serial_version[8]; 
    char manufacturer[8]; 
    /* etc */ 
}; 

volatile struct hitech *my_device; 

第二部分工作了其中該設備被映射。如果插入到計算機中,您應該可以看到這一點。您可能需要執行以下操作之一:mmap設備的物理地址。或者只寫my_device = 0x < address>。或者兩者的結合。

從網站: 「的IRSeeker V2傳感器的I2C地址爲0x10的」

所以你想要寫0x10的上面my_device。

然後,您需要編譯正確的微控制器並將程序作爲固件正確加載。

你最好用他們的編程語言。

+0

dave:你怎麼知道這些可以在OPs機器上映射內存? –

+0

@Guy Sirton因爲它強烈建議網站。這可能是錯誤的。如果它被映射,那麼他應該能夠看到這一點。 – dave

0

假設他們沒有提供一個SDK讓你訪問這些值:

// I'm assuming these are read-only, hence the "const" 
const char *g_serialVersionNumber = (const char *)0x00; // be careful not to access more than 8 bytes 
const unsigned char *g_sensor1DCSignalStrength = (const unsigned char *)0x43; 

void main() 
{ 
    printf("Serial version number: %s\n", g_serialVersionNumber); 
    printf("Sensor 1 DC Signal Strength: %d\n", *g_sensor1DCSignalStrength); 
} 
+0

你爲什麼假設i2c地址是映射到進程地址空間的內存?這幾乎肯定是錯誤的。 –

+0

這肯定會出現分段錯誤。地址0x0是內核內存,你不能訪問它。 – dave

+0

鑑於我對設備不熟悉,如果他們沒有提供SDK,實際上沒有其他結論可供參考。但是,我會想象提供了一個SDK(因此「假設他們不是......」)。 –