0

我最近接到了为我们产品中的一些 I2C 设备编写驱动程序的任务。在这方面我是一个完整的初学者,但我已经设法混合使用并i2cset控制一些 LED。i2cgetsmbus

我最近的任务是从Atmel ATSHA204芯片的 EEPROM 中读取一个 7 字节的序列号。我的第一项工作是唤醒芯片。数据表说这是按如下方式完成的

唤醒条件要求系统处理器手动将 SDA 引脚驱动为低电平持续 tWLO,或者以足够慢的时钟速率传输 0x00 数据字节,以使 SDA 在最短 tWLO 周期内为低电平。当设备唤醒时,正常的处理器 I2C 硬件和/或软件可用于设备通信,直至并包括将设备重新置于低功耗(睡眠)模式所需的 I/O 序列。

因此,似乎我必须手动将其中一个 I2C 引脚设置为低 tWLO 时间,这显然至少需要 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

我想我不确定最后一点,在设备唤醒之前如何继续写?我将不胜感激,因为像这样的低级编程对我来说是新的。

4

2 回答 2

3

你不想传递0x00write函数。该参数不是一个值,它是一个指向包含数据的缓冲区的指针。您需要知道您的 I2C 运行的时钟速度。这将确定需要写入多少字节 0x00 才能满足唤醒所需的持续时间。

于 2013-05-22T01:02:33.853 回答
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!");
        break;
     }
    }
 return awake;
}
于 2016-06-17T07:52:56.823 回答