¿Es necesario cerrar cada señal de START I2C por una señal de STOP?

0

¿Se podrían enviar dos señales de INICIO I2C una tras otra sin que se haya enviado una señal de PARADA? A continuación se muestra un ejemplo de bit bitging, donde no hay STOP entre el primer y el segundo START:

int16_t BMP180_readRegister16(uint8_t reg) {   
  i2c_start(); 
  i2c_writeByte(BMP180_ADDRESS); 
  if(!i2c_check_ack()){
    i2c_stop();
    return(0);
  }
  i2c_writeByte(reg);
  if(!i2c_check_ack()){
    i2c_stop();
    return(0);
  }
  i2c_start(); 
  i2c_writeByte(BMP180_ADDRESS+1);  
  if(!i2c_check_ack()){
    //os_printf("slave not ack..\n return \n");
    i2c_stop();
    return(0);
  }
  uint8_t msb = i2c_readByte();                 
  i2c_send_ack(1);                              
  uint8_t lsb = i2c_readByte();     
  i2c_send_ack(0);                              
  i2c_stop();                               
  int16_t res = msb << 8;
  res += lsb;   
  return res;                           
}

¿No es necesario que cada secuencia de INICIO esté cerrada por una secuencia de DETENER?

Gracias

    
pregunta Kar

2 respuestas

3

Sí, esto se llama un "inicio repetido". Por la página de Wikipedia :

  

En un mensaje combinado, cada lectura o escritura comienza con un INICIO y la dirección del esclavo. Después del primer START en un mensaje combinado, estos también se denominan bits de START repetidos. Los bits START repetidos no están precedidos por bits STOP, que es como los esclavos saben que la próxima transferencia es parte del mismo mensaje.

En una configuración de múltiples maestros, un inicio repetido también garantiza que otro maestro no pueda tomar el bus entre dos transacciones diferentes.

    
respondido por el Nick Johnson
1

Este es un ejemplo de un "inicio repetido" en el lenguaje I 2 C. Normalmente se ven cuando un maestro está "girando el bus" como parte de una sola transacción I 2 C, por lo que otro maestro no cree que el bus esté libre e intente agarrarlo, pero el el dispositivo esclavo puede enviar datos sin entrar en un conflicto de bus con el maestro (mientras que los conflictos de bus en I 2 C no se fríen debido a que es un bus de drenaje abierto, aún conducen a errores de transmisión) .

Una aplicación de ejemplo es una lectura de un dispositivo basado en registro, donde el maestro, como en su código de muestra, debe enviar una dirección de registro al dispositivo y luego darle al esclavo la oportunidad de enviar los datos presentes en esa dirección.

    
respondido por el ThreePhaseEel

Lea otras preguntas en las etiquetas