[Aprendizaje de STC MCU] Lección 15: Comunicación I2C-EEPROM

[Intrusión del resumen del curso del Sr. Zhu]

En esta lección, aprenderemos cómo usar el puerto IO de una microcomputadora de un solo chip 51 para simular la sincronización I2C y realizar una comunicación bidireccional con AT24C02 (EEPROM).

La segunda parte, introducción del capítulo

1.15.1 EEPROM y su conocimiento previo
Esta sección se enfoca en EEPROM y sus conceptos relacionados, enfocándose en la memoria y la interfaz I2C en el sistema de microcontroladores .
1.15.2 Diagrama esquemático y manual de datos 1
Esta sección primero analiza brevemente el diagrama esquemático y el cableado, y luego se centra en la lectura del manual de datos AT24C02 .
1.15.3 Manual de esquemas y datos 2
Esta sección describe los conceptos clave del protocolo I2C , así como las hojas de datos y las partes relacionadas con los protocolos I2C.
1.15.4. Diagrama de temporización de bajo nivel I2C y programa 1
Esta sección analiza principalmente la parte de temporización de bajo nivel del código en la rutina oficial , y
compara y analiza el diagrama de temporización en el manual de datos 1.15.5. Prueba de lectura y escritura de
EEPROM 1 Esta sección describe la EEPROM La secuencia de lectura y escritura de la capa superior se centra en el principio de determinar la dirección esclava I2C y la configuración del registro.
1.15.6 Prueba 2 de
lectura y escritura de EEPROM Esta sección luego analiza el tiempo de lectura y escritura superior de EEPROM, enfocándose en el diagrama de tiempo superior en el manual de datos.

Tercera parte, Registro del aula

1.15.1. EEPROM y su conocimiento previo

1.15.1.1, EEPROM
(1) Algunos conceptos:

  • ROM (Memoria de solo lectura), RAM (Memoria de acceso aleatorio), PROM (ROM programable), EPROM (ROM borrable), EEPROM (ROM borrable eléctricamente) ¡
    Pise el enlace para comprenderlo!

(2) ¿Por qué necesitamos EEPROM?

  • La ROM dentro del microcontrolador solo se puede borrar y reescribir cuando se descarga el programa, pero el programa en sí no se puede reescribir. El programa de datos en la RAM dentro del microcontrolador se puede cambiar mientras está en ejecución, pero se perderá cuando se apague. A veces tenemos algunos datos que deben almacenarse en el sistema, lo que requiere que no se pierdan después de un corte de energía, y el programa debe poder cambiarse. Por tanto, la ROM y la RAM internas no son buenas. En este momento, se necesita una EEPROM en el sistema

(3) La diferencia y la conexión entre EEPROM y flash

  • Flash pertenece a EEPROM en un sentido amplio porque también es una rom borrable eléctricamente. Pero para distinguirlo de la EEPROM borrable general en bytes, lo llamamos flash.
    La mejora que aporta el flash es que el borrado ya no es en bytes, sino en bloques, lo que simplifica el circuito a la vez, aumenta la densidad de datos y reduce el costo. La ROM en M es generalmente flash.

(4) Hay dos formas de EEPROM en el sistema: integrado dentro del microcontrolador y expandido externamente
EEPROMDiagrama esquemático EEPROM

1.15.1.2 Cómo programar EEPROM

  • Sincronización inferior de la interfaz I2C
  • Tiempo de lectura y escritura de registro definido por dispositivo

1.15.2. Esquema y hoja de datos 1

1.15.2.1. Diagrama esquemático y determinación del cableado
(1) Definición de pines clave y sus conexiones

Línea de reloj SCL, transmitiendo señal CLK.
Línea de datos SDA, transmisión de datos de comunicación
WE señal de habilitación de protección de escritura

(2) Cableado

P2.0 se conecta a SCL
P2.1 se conecta a SDA
WE conectamos a GND

1.15.2.2, información del chip de navegación manual de datos AT24C02
(1)

  • descripción
  • Caracteristicas
  • diagrama de bloques
  • Descripción del pin

(2) Información básica de I2CInserte la descripción de la imagen aquí

  • Instrucciones detalladas
  • Funciones destacadas del manual I2C
  • Dispositivo maestro, dispositivo esclavo, transmisor, receptor
  • Direccionamiento de dispositivos (para distinguir dispositivos esclavos )

(3) Temporización de bajo nivel I2C
Inserte la descripción de la imagen aquí

  • Señal de inicio: SCL de alto nivel, borde descendente SDA
  • Señal de parada: SCL de alto nivel, borde ascendente SDA
  • Enviar byte: después del inicio, el dispositivo maestro transmite, primero envía la dirección esclava, luego envía los datos válidos y finalmente se detiene
  • Byte de lectura: después del inicio, el dispositivo esclavo primero envía su propia dirección, luego coloca los datos en el bus y finalmente se detiene
  • Condición de inicio repetido: similar a la condición de inicio, la condición de inicio repetido ocurre antes de la condición de parada. Cuando el maestro desea continuar enviando mensajes al esclavo, puede enviar una condición de inicio repetida después de que se complete la transmisión de un byte, en lugar de generar una condición de parada.

(4) Resumen de I2C

  • La interfaz más utilizada entre la CPU principal y sus chips auxiliares, especialmente varios sensores, es muy importante en la era de Internet de las cosas;
  • Tres cables: GND, SCL, SDA , serie, tipo de nivel;
  • La estructura del bus, puede ser de uno a muchos, se pueden colgar cientos de dispositivos en el bus, distinguidos por la dirección del esclavo ;
  • Modo maestro-esclavo, el dispositivo maestro inicia la comunicación y el arbitraje de bus, y el dispositivo esclavo responde pasivamente;
  • Al mismo tiempo, sólo un dispositivo esclavo puede comunicarse con el dispositivo maestro y los otros dispositivos esclavos están en estado de "hibernación";
  • La velocidad de comunicación es general (nivel de kbps), no adecuada para tipos de información como voz y video;
  • El LSB de la información de dirección del dispositivo es el bit de selección de operación de lectura / escritura, el alto es la operación de lectura y el bajo es la operación de escritura ;
  • La transmisión de datos es una transmisión big-endian, es decir, el bit alto se transmite primero ;
  • Los datos se transmiten en bytes y pueden transmitir una pluralidad de bytes consecutivos;
  • Las condiciones de inicio y parada son controladas por el dispositivo maestro, y la recepción y la respuesta son ejecutadas por el receptor y el transmisor respectivamente.

1.15.4. Diagrama y programa de secuencia de bajo nivel I2C

Programa de muestra oficial: \ Paso 3 51 rutina \ 16, EEPROM (24C02) \ pantalla de tubo digital EEPROM \
Enlace de descarga del programa
1.15.4.1 , señal de inicio y señal de fin
(1) Señal de inicio: cuando SCL permanece alto, SDA Hay una señal de alto a bajo ( flanco descendente )
(2) Señal de fin: cuando SCL permanece alto, SDA tiene un bajo a alto ( flanco ascendente )
(3) El bus está inactivo: si el SCL y SDA de un dispositivo permanecen altos, Significa que el dispositivo está inactivo; consulte el
código
Inserte la descripción de la imagen aquí
1.15.4.2, transmisión de bits.
Cada pulso de reloj transmite un bit de datos. SDA debe permanecer estable cuando SCL es alto , porque el cambio de SDA en este momento se considera una señal de inicio / fin . Como sigue:
Inserte la descripción de la imagen aquí
Referencia
Inserte la descripción de la imagen aquí

1.15.4.3, I2C envía un byte
(1) Procesamiento de bits de respuesta (receptor -> remitente )

  • Cada byte debe ir seguido de un bit de reconocimiento (ACK) .

(2) Cuando I2C envía un byte, comienza desde el bit alto ( microcontrolador -> receptor )

  • Tomando el Byte de transmisión: 1010 1010 (0xAAh) como ejemplo, la secuencia de transmisión SDA SCL es la siguiente:
    Inserte la descripción de la imagen aquí
    Como se puede ver en la figura anterior, el dispositivo esclavo baja SDA para indicar una respuesta y mantiene un nivel bajo estable durante el pulso de respuesta.
    -Mira el código

1.15.4.4, I2C recibe un byte ( receptor -> MCU )
(1) Concepto: liberar el bus.

  • En 51 microcomputadoras de un solo chip, SDA = 1 es para liberar el bus; en otras microcomputadoras de un solo chip más avanzadas (como STM32, etc.), el procesamiento aquí es un poco diferente.
  • Por qué SDA = 1 es para liberar el bus, porque cuando el microordenador de un solo chip 51 tira del pin hacia arriba, el dispositivo esclavo puede optar por tirar de este pin hacia arriba o hacia abajo; pero cuando el microordenador de un solo chip 51 tira de este pin hacia abajo (conectado a tierra), El dispositivo esclavo ya no puede tirar de este pin alto.

1.15.5. Prueba de lectura y escritura EEPROM 1

1.15.5.1, 24C02 lee y escribe secuencia de alto nivel ( STC51 -> AT24C02 )

La sincronización de alto nivel es utilizar la sincronización de bajo nivel para completar la comunicación con el chip, con precisión al manual 24C02

(1) Operación de escritura
Inserte la descripción de la imagen aquí

  • La dirección de palabra es la dirección de memoria de escritura
    Inserte la descripción de la imagen aquí

-Mira el código

(2) Operación de lectura

  • Lectura aleatoria
    Lectura aleatoria

  • Mira el manual, mira el código

(3) Se entienden las operaciones generales de lectura y escritura, pero ¿de dónde proviene la dirección?

  • La dirección del dispositivo la
    define el propio dispositivo esclavo . Los diferentes dispositivos esclavos tienen diferentes métodos de definición de dirección. La definición de hardware debe determinarse verificando la hoja de datos del chip específico.
    Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí
Al analizar el diagrama esquemático y la definición de dirección de 24C02 , podemos obtener:

Dirección de lectura: 1010 0001 (0xA1)
Dirección de escritura: 1010 0000 (0xA0)

¿Cuántas piezas AT24C02 se pueden conectar como máximo?

  • La dirección de bytes (dirección de memoria EEPROM)
    Inserte la descripción de la imagen aquí
    es fea. Para facilitar la comprensión, ¡miremos la pizarra!

1.15.6. Prueba 2 de lectura y escritura de EEPROM

Envíe un byte de datos a la EEPROM y escríbalos en la memoria específica de EEPROM;
luego lea los datos de la EEPROM e imprímalos a través del puerto serie.

1.15.6.1 Establecimiento del proyecto e importación de archivos

  • Utilice directamente i2c.hy i2c.c del programa oficial de muestra

1.15.6.2, agregue el código de salida en serie

  • Utilice directamente los archivos del puerto serie escritos antes: serial.cy serial.h

1.15.6.3, prueba EEPROM

  • Envíe la impresión de datos de recepción de datos al puerto serie

1.15.6.4. El problema del programa está resuelto. El
contenido leído es incorrecto porque la EEPROM no puede soportar una lectura y escritura continuas rápidas. Por lo tanto, agregue un retraso de 20 ms entre lectura y escritura. Después de la prueba, se comprueba que la lectura y la escritura son correctas.

Adjunte el código final del programa:

//main.c
#include "serial.h"
#include "i2c.h"
/*******************************************************************************
一、接线
P2.0--SCL、P2.1--SDA  
设置在i2c.h

二、程序功能
给EEPROM发送一个字节的数据,把它们写在EEPROM特定内存下;
然后读取EEPROM的数据之后,通过串口打印出来。
*******************************************************************************/

void At24c02Write(unsigned char ,unsigned char );
unsigned char At24c02Read(unsigned char );
void delay20ms(void)   //误差 -0.000000000005us
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=222;b>0;b--)
            for(a=40;a>0;a--);
}

void main(void)
{
	//变量声明
	u8 src_data[] = "12345678"; //要发送的数据
	u8 buf[8];//接收数据的buf
	u8 addr = 0;	//特定的地址
	u8 i = 0;
	//串口初始化
	uart_init();
	
	//发送数据
	for(i = 0;i<8;i++)
	{
		At24c02Write(addr,src_data[i]);
		delay20ms();
		addr++;
	}
	
	//接收数据
	addr = 0;
	for(i = 0;i<8;i++)
	{
		buf[i] = At24c02Read(addr);
		delay20ms();
		addr++;
	}
	
	//向串口打印
	for(i = 0;i<8;i++)
	{
		uart_send_byte(buf[i]);
	}
	while(1);
}

void At24c02Write(unsigned char addr,unsigned char dat)
{
	I2C_Start();
	I2C_SendByte(0xa0, 1);//发送写器件地址
	I2C_SendByte(addr, 1);//发送要写入内存地址
	I2C_SendByte(dat, 0);	//发送数据
	I2C_Stop();
}
/*******************************************************************************
* 函 数 名         : unsigned char At24c02Read(unsigned char addr)
* 函数功能		   : 读取24c02的一个地址的一个数据
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

unsigned char At24c02Read(unsigned char addr)
{
	unsigned char num;
	I2C_Start();
	I2C_SendByte(0xa0, 1); //发送写器件地址
	I2C_SendByte(addr, 1); //发送要读取的字地址
	I2C_Start();
	I2C_SendByte(0xa1, 1); //发送读器件地址
	num = I2C_ReadByte(); //读取数据
	I2C_Stop();
	return num;	
}

Enlace de descarga del programa para esta lección : I2C ¡
Esta lección ha terminado!

Supongo que te gusta

Origin blog.csdn.net/qq_27148893/article/details/110168332
Recomendado
Clasificación