Fundamentos de la CII

Conceptos básicos del protocolo IIC

1. Capa física de IIC

  • Un bus IIIC utiliza dos líneas de bus, una línea de datos en serie bidireccional y una línea de reloj en serie. La línea de datos se usa para recibir y transmitir datos, y la línea de reloj se usa para sincronizar el envío y la recepción de datos.
  • Cada dispositivo conectado al host tiene una dirección independiente, y el host puede acceder y operar diferentes dispositivos a través de esta dirección. Es decir, el host distingue cada uno de los diferentes dispositivos conectados al bus por una dirección diferente. La dirección puede ser de 7 bits o de 10 bits.

2. Características de la capa física

  • El bus está conectado a la fuente de alimentación a través de una resistencia pull-up, que generalmente es una resistencia de 4,7 K. Cuando el dispositivo IIC está inactivo, emitirá un estado de alta impedancia, que corresponde a la salida de drenaje abierto al aprender GPIO antes El estado de alta impedancia es equivalente a conectar una gran resistencia, se aproxima a un estado abierto. Un 1 lógico en el IIC no es un estado de alto nivel, sino un estado de alta impedancia. El propósito de conectar una resistencia pull-up es evitar un cortocircuito entre diferentes dispositivos.

3. La capa de protocolo de IIC

  • El protocolo IIC define las señales de inicio y fin de la comunicación, la validez de los datos, la respuesta, el arbitraje, la sincronización del reloj y la transmisión de direcciones.

El proceso básico de lectura y escritura de IIC

  • El maestro escribe datos al esclavo: primero envía una señal de inicio y luego transmite la dirección del esclavo, seguida de una señal de lectura y escritura, '0' significa escritura, '1' significa lectura. Enviar estas tres partes equivale a transmitir la dirección a través del bus. Una vez completada la transmisión, el dispositivo de la dirección correspondiente enviará una señal de respuesta al host después de recibir la solicitud de comunicación del host.Después de recibir la señal de respuesta, puede enviar los datos correspondientes al dispositivo.Después de que el host envíe cada byte, el esclavo enviará una señal de respuesta al host, y el host puede continuar enviando datos al dispositivo; si por alguna razón, el dispositivo no necesita recibir datos u ocurren otros problemas, el dispositivo devuelve una falta de respuesta señal, en este momento el host Cuando se recibe, se envía una señal de parada, interrumpiendo la comunicación.
  • El host lee los datos del dispositivo: el proceso general es el mismo que para escribir datos. Primero, transmita la dirección, principalmente en los bits de lectura y escritura. Habrá diferencias: '1' representa lectura; después de lectura y escritura se envían bits, el dispositivo enviará una señal de respuesta y los datos se transmiten al host.Después de que el host reciba el primer byte de datos, si desea continuar leyendo datos del dispositivo, el host enviará una señal de respuesta inmediatamente , y luego el esclavo continuará enviándolo al host.Datos, después de leer cada byte de datos, si desea continuar leyendo, debe enviar una señal de respuesta, y el host no necesita continuar leyendo los datos del dispositivo Si no necesita continuar leyendo datos, envíe una señal de no respuesta después del último byte de datos y envíe una señal de parada para interrumpir la comunicación.
  • Formato compuesto de comunicación: El estado inicial se compone básicamente de la dirección de escritura. Esta parte es generalmente la dirección de la unidad de almacenamiento o la dirección de registro del sensor. A diferencia de la dirección del dispositivo, la dirección de registro de la memoria o sensor se envía en la forma de transmisión de datos Es transmitir la dirección del dispositivo primero y luego enviar la dirección interna de la memoria o la dirección de registro del sensor como datos. Luego repita el proceso de lectura y escritura para leer y escribir en una determinada dirección interna del dispositivo.

Señales de inicio y parada de la comunicación:

  • Inicio: SCL es alto, SDA cambia de alto a bajo.
  • Detener: SCL es alto, SDA cambia de bajo a alto.
    Validez de los datos:
  • El IIC transmite datos a través de la línea SDA, la línea SCL se utiliza para sincronizar los datos y la línea de datos SDA transmite un bit de datos en cada ciclo de reloj de SCL. Los datos de SDA no son válidos cuando el SCL es bajo y el estado de SDA cambia en este momento.

Dirección y dirección de datos:

  • MSB: dirección esclava
  • LSB: leer y escribir bits
  • Después de la señal de inicio, la dirección y los bits de lectura y escritura pueden combinarse directamente en datos de 8 u 11 bits y enviarse directamente.

respuesta:

  • La transmisión de direcciones y la transmisión de datos del IIC llevan una respuesta, y la respuesta incluye una señal de respuesta y una señal de no respuesta; el anfitrión genera una señal de reloj durante la transmisión, y en el noveno ciclo de reloj, el remitente de datos libera el control sobre el SDA, y el receptor de datos controla el estado de SDA.Si SDA es alto, significa una señal de no respuesta; si SDA es bajo, significa una señal de respuesta.
  • Al leer datos, el host controla el envío de la señal de respuesta.

4.Expresión de la función del protocolo IIC (STM32)

  • Establezca o borre un determinado bit del registro de datos de salida del puerto Registro ODR de forma independiente a través del registro BSRR y el registro BSR BSRR corresponde a la función GPIO_SetBits en la función de biblioteca, y BSR corresponde a la función GPIO_ResetBits en la función de biblioteca.

  • El estado lógico del pin PB6 se puede establecer en 1 mediante GPIOB->BSRR=GPIO_Pin_6. Los niveles alto, bajo y bajo del puerto IO están representados por definiciones de macro.

  • Retraso del autobús I2C

static void i2c_Delay(void)
{
	uint8_t i;
	for (i = 0; i < 10; i++);//通过具体的工作频率确定具体的时钟周期
}
  • señal de inicio
void i2c_Start(void)
{
	EEPROM_I2C_SDA_1();//SDA为高
	EEPROM_I2C_SCL_1();//SCL为高
	i2c_Delay();
	EEPROM_I2C_SDA_0();//当SCL为高电平,SDA由高到低转换表示起始信号。
	i2c_Delay();
	EEPROM_I2C_SCL_0();
	i2c_Delay();
}
  • señal final
void i2c_Stop(void)
{
	EEPROM_I2C_SDA_0();//SDA为低
	EEPROM_I2C_SCL_1();//SCL为高
	i2c_Delay();
	EEPROM_I2C_SDA_1();//SDA由低向高转换,SCL为高,表示结束信号
}
  • Enviar 1 byte de datos al dispositivo de bus IIC
void i2c_SendByte(uint8_t _ucByte)
{
	uint8_t i;
	for (i = 0; i < 8; i++)//0X80代表1000 0000 ,通过下面代码的左移和位与通过SDA总线将数据发送出去
	                       //数据每次与操作,1000 0000 中只有1的与操作有效,通过循环移位将每次与的结果发送
	{		
		if (_ucByte & 0x80)
		{
			EEPROM_I2C_SDA_1();
		}
		else
		{
			EEPROM_I2C_SDA_0();
		}
		i2c_Delay();
		EEPROM_I2C_SCL_1();
		i2c_Delay();	
		EEPROM_I2C_SCL_0();//SCL由1到0,表示SDA数据线状态可能发生改变
		if (i == 7)
		{
			 EEPROM_I2C_SDA_1(); // 释放总线
		}
		_ucByte <<= 1;	/* 左移一个bit */
		i2c_Delay();
	}
}
  • Leer un byte de un dispositivo de bus IIC
uint8_t i2c_ReadByte(void)
{
	uint8_t i;
	uint8_t value;
	/* 读到的第一个bit为数据的bit7 */
	value = 0;
	for (i = 0; i < 8; i++)//通过循环对SDA总线的状态进行判断,为1值++;为0移位补0,直到成为一个八位数据        
	                       //二进制中100+1为110,++实现8位数据中1的增加
	{
		value <<= 1;
		EEPROM_I2C_SCL_1();
		i2c_Delay();
		if (EEPROM_I2C_SDA_READ())
		{
			value++;
		}
		EEPROM_I2C_SCL_0();
		i2c_Delay();
	}
	return value;
}

  • Lea la señal de respuesta del dispositivo
uint8_t i2c_WaitAck(void)
{
	uint8_t re;

	EEPROM_I2C_SDA_1();	// CPU释放SDA总线,操作BSRR寄存器不仅可以设置IO状态,还可以将其某一位设置为可写入
	i2c_Delay();
	EEPROM_I2C_SCL_1();	/* CPU驱动SCL = 1, 此时器件会返回ACK应答 */
	i2c_Delay();
	if (EEPROM_I2C_SDA_READ())	/* CPU读取SDA口线状态,此时的SDA总线可受外部设备控制 */
	{
		re = 1;//1为有应答
	}
	else
	{
		re = 0;
	}
	EEPROM_I2C_SCL_0();
	i2c_Delay();
	return re;
}
  • El host genera una señal de reconocimiento
void i2c_Ack(void)
{
	EEPROM_I2C_SDA_0();	/* CPU驱动SDA = 0 */
	i2c_Delay();
	EEPROM_I2C_SCL_1();	/* CPU产生1个时钟 */
	i2c_Delay();
	EEPROM_I2C_SCL_0();
	i2c_Delay();
	EEPROM_I2C_SDA_1();	/* CPU释放SDA总线 */
}
  • El host genera una señal de no reconocimiento
void i2c_NAck(void)
{
	EEPROM_I2C_SDA_1();	/* CPU驱动SDA = 1 */
	i2c_Delay();
	EEPROM_I2C_SCL_1();	/* CPU产生1个时钟 */
	i2c_Delay();
	EEPROM_I2C_SCL_0();
	i2c_Delay();	
}

Supongo que te gusta

Origin blog.csdn.net/qq_52487856/article/details/122163100
Recomendado
Clasificación