Estoy usando una placa Raspberry Pi Zero como controlador I2C y una Raspberry Pi Pico como objetivo I2C, y pasando datos entre ellos usando I2C.
Utilizo algo así:
unsigned char buf[256];
write(fd, buf, 1)
para escribir 1 byte de datos desde el controlador al objetivo. Los pines SDA y SCL muestran lo que espero en el osciloscopio.
Utilizo algo así para que el controlador lea 1 byte de datos del objetivo:
unsigned char buf[256];
read(fd, buf, 1)
En este punto estoy obteniendo un ALTO en el bit ACK del marco de datos, cuando pensé que debería ser bajo, según este tutorial que estoy siguiendo. Para una dirección de destino I2C de 0x22, esta es la forma de onda que estoy obteniendo:
El marco de dirección parece correcto (bits de LSB a MSB, bit RW establecido en 1, ACK establecido en 0).
Los bits de datos en el marco de datos se ven correctos (0xA8 de MSB a LSB), pero el bit ACK está alto.
El programa objetivo de Raspberry Pi Pico está escrito de tal manera que cada función read() devolverá un byte del siguiente elemento de una matriz uint_8 en su memoria. Estoy llamando a la función read() anterior dentro de un bucle.
Veo que el bit ACK siempre está ALTO cada vez que se llama a esta función. Pero parece que el proceso de lectura I2C en sí se está ejecutando correctamente, ya que los datos leídos en el programa del controlador I2C coinciden con los datos en la memoria del objetivo I2C.
¿Qué está sucediendo aquí? ¿Estoy obteniendo la forma de onda correcta en la línea SDA?
https://www.ti.com/lit/an/slva704/slva704.pdf?ts=1636643901705&ref_url=https%253A%252F%252Fwww.google.com%252F
Ver página 5 Sec2.3 punto 4
- Un maestro-receptor ha terminado de leer datos e indica esto al esclavo a través de un NACK.
El bit ACK para los marcos de datos es lo que espero si hago read(fd, buf, 2)
, con el último marco de datos teniendo el bit ACK ALTO como aquí.