2013-05-21 87 views
0

我最近被授予了爲我們產品中的某些I2C器件編寫驅動程序的任務。我是一個完整的初學者,但我設法使用i2cseti2cget以及smbus的混合來控制一些LED。無法喚醒Atmel ATSHA204使用I2C

我最近的任務是從Atmel ATSHA204芯片的EEPROM中讀取7字節的序列號。我的第一份工作是喚醒芯片。數據表說如下

的喚醒條件要求要麼,該系統處理器手動驅動 SDA引腳爲低tWLO,或者爲0x00一個數據字節以 時鐘速率足夠慢發送這樣做SDA低至tWLO的最小時間。當設備喚醒時,正常的處理器I2C硬件和/或軟件可用於設備通信,直到包括I/O序列 ,以使設備回到低功耗(睡眠)模式。

因此,我似乎必須在tWLO時間手動將其中一個I2C引腳設置爲低電平,這顯然至少需要60微秒才能使用傳統的I2C調用。我真的不知道這是如何完成的,理想情況下,我會在C中這樣做,所以下面的工作有些變化嗎?

int file;  
file = open("/dev/i2c-0", O_RDWR); 
if (file < 0) { 
exit(1); 
} 

int addr = 0x64; // Address of LED driver 

if(ioctl(file, I2C_SLAVE, addr) < 0){ 
return 1; 
} 

write(file, 0x00, 1); //write a 0x00 to the chip to wake it up 

我猜我不確定最後一點,我該如何繼續寫下來,直到設備醒來?我很感謝這方面的幫助,因爲像這樣的低級編程對我來說是新的。

+0

您可能對electronics.stackexchange.com更好的運氣。 – Brian

回答

1

您不想將0x00傳遞給write函數。該參數不是一個值,它是一個指向包含數據的緩衝區的指針。您需要知道您的I2C運行的時鐘速度。這將決定需要寫入多少個0x00字節以滿足喚醒所需的持續時間。

0

下面可以幫助你清醒的芯片

bool wakeup (int fd) 
{ 
    unsigned char buf[4] = {0}; 
    bool awake = false; 
    if (fcntl(fd, F_GETFD) < 0) 
     perror ("Invalid FD.\n"); 
    while (!awake){ 
    if (write(fd, buf, sizeof(buf)) > 1){ 
     printf ("Device is awake!\n"); 
    } 
    if (read (fd, buf, sizeof(buf)) == 4){ 
     printf ("Awake Done!\n"); 
     awake = true; 
    } 
    else {  
     printf ("Failed to awake the device!"); 
    } 
    } 
return awake; 
}