protocolo de comunicación IIC

A, rasgos básicos de la CII

La comunicación de dos hilos: una línea de datos (SDA) y una línea de reloj (SCL).
IIC puede estar vinculado a una pluralidad de dispositivos, los puntos principales de la máquina (acceso Slave huésped). En el dispositivo bus IIC tiene una dirección de dispositivo única, un host correspondiente está determinada por la dirección del dispositivo esclavo.
CII comunicación half-duplex, la resistencia pull-up hardware necesario es generalmente valor típico es 4.7K 4.7K ~ 10K. El límite máximo de la capacitancia del bus de 400pF.
Aquí Insertar imagen Descripción

Dos, CII Comunicación Momento

CII es alto cuando está inactivo.
Escribir datos desde el ordenador central para
indicar el inicio y la parada de Aquí Insertar imagen Descripción
señal de inicio: cuando el SCL es alta, la SDA de mayor a menor
señal de parada: cuando el SCL es alta, la SDA de bajo a alto

void I2C_Start(void)   //起始信号函数
{
 SDA_Out(1);   //SDA输出高
 SCL_Out(1);   //SCL输出高
 delay_us(5);
 SDA_Out(0);   //SDA输出低
 delay_us(5);
 SCL_Out(0);
 delay_us(3);
}
void I2c_Stop(void)   //停止信号函数
{
 SDA_Out(0);    //SDA输出低
 SCL_Out(0);    //SCL输出低
 delay_us(5);
 SCL_Out(1);    //SCL输出高
 delay_us(5);
 SDA_Out(1);
 delay_us(3);
}

Los datos cambia a un nivel bajo sólo en SCI

 ****主机发送数据到从机****

Aquí Insertar imagen Descripción
sombreadas de datos transmitidos a la máquina host, datos en blanco se devuelve desde la máquina.
[Bits de lectura-escritura dirección de 7 bits de esclavos como una dirección, el bit más bajo se (0: operación de escritura al esclavo; 1: Esclavo leer) Leer +] + alta señal de inicio: primer anfitrión envía ACK (enviado desde el esclavo al maestro ) leer datos de escritura + + ACK + ... + leer datos de escritura + ACK + señal de parada.
Enviar datos al ordenador host es un esclavo de la máquina host desde el ACK.
Recibir datos de un ordenador central para
Aquí Insertar imagen Descripción
los datos de transmisión a los datos devueltos desde la máquina de esclavo, el anfitrión está sombreado blanco.
[Bits de lectura-escritura dirección de 7 bits de esclavos como una dirección, el bit más bajo se (0: operación de escritura al esclavo; 1: Esclavo leer) Leer +] + alta señal de inicio: primer anfitrión envía ACK (enviado desde el esclavo al maestro ) leer datos de escritura + + ACK + ... + leer + ACK + señal de parada de escritura de datos.
Resumen ACK: ACK se envía a los datos de dispositivo del dispositivo de transmisión de datos que reciben.

void Ack(void)  //主机读ACK
{ 
    SCL_Out(0);  
    delay_us(2); 
 SDA_Out(1);
 SDA_IN(); 
 delay_us(2);
 SCL_Out(1);
 SDA_Out(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7));  
    delay_us(4);
 SCL_Out(0);
    SDA_OUT();
 delay_us(2);
}
void Nack(uint8_t ack)  //主机写ACK
{
 SCL_Out(0);
 delay_us(2); 
 if(ack == 1)
    SDA_Out(1);
 else
   SDA_Out(0); //写应答信号
  delay_us(2);   
  SCL_Out(1);                    //拉高时钟线
  delay_us(4);                 //延时
  SCL_Out(0);                   //拉低时钟线
  delay_us(2);                 //延时

}

El maestro envía los datos de función ACK, y la última función es el host recibe un alto datos Nack Nack

void I2c_SendByte(uint8_t _ucByte)  //主机发送8bit数据
{
  uint8_t i;
  for (i = 0; i < 8; i++)
 {  
   if (_ucByte & 0x80)
    SDA_Out(1);
  else
    SDA_Out(0); 
 delay_us(2);
  SCL_Out(1);
  delay_us(2);
  _ucByte <<= 1;   //左移一个bit 
  SCL_Out(0);
 }
 SDA_Out(0);
 delay_us(1);
 SCL_Out(0);
 delay_us(1);
}
uint8_t I2c_ReadByte(void)    //主机接收8bit数据
{
  uint8_t i;
  uint8_t value;
  /* 读到第1个bit为数据的bit7 */
 value = 0;
 for (i = 0; i < 8; i++)
 {
  value<<=1;
  SCL_Out(0);
  SDA_IN(); 
  delay_us(2);
  if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7))
   value |= 0x01 ;
  else
   value &= 0xfe;
  SCL_Out(1);
  delay_us(2);
 }
 SCL_Out(0);
 SDA_OUT();
 delay_us(2);
 SDA_Out(0);
 delay_us(2);
 return value;
}
int I2C_Write(uint8_t addr , uint8_t* buff, uint8_t size)  //主机发数据
{
 uint8_t i; 
 I2C_Start();
  I2c_SendByte(addr);
  Ack();
  for(i = 0; i < size; i++)
 {
 I2c_SendByte(buff[i]);
  Ack();
 }
  I2c_Stop(); 
 return 0;
}
int I2C_Read(uint8_t addr , uint8_t* buff, uint8_t size,uint8_t bus_bit) //主机接收数据
{
 uint8_t i,busy; 
 I2C_Start();
  I2c_SendByte(addr+1);
 delay_us(2);
 Ack(); 
  for(i = 0; i< (size-1); i++)
 {
      buff[i] = I2c_ReadByte();
   delay_us(2);
    Nack(0);
  } 
  buff[size-1] = I2c_ReadByte();
 delay_us(2);
  Nack(1);
 delay_us(10);
  I2c_Stop(); 
 return 0;
}
Publicó un artículo original · ganado elogios 0 · Vistas 16

Supongo que te gusta

Origin blog.csdn.net/qq_37387733/article/details/104786198
Recomendado
Clasificación