Tutorial 9. Lectura de la memoria M24C32-EEPROM en Microcontrolador de la serie STM32F4.

El objetivo de este tutorial es mostrar como configurar nuestra tarjeta de desarrollo Ophyra para leer la memoria M24C32-EEPROM. Esta memoria esta integrada a la tarjeta y se utiliza el puerto serial I2C para manipularla. Para demostrar su funcionamiento realizaremos un ejemplo donde escribiremos una serie de 10 datos en sus localidades de memoria, posteriormente, leeremos esas mismas localidades y las enviaremos al puerto RS-232 para visualizarlos en la terminal del compilador.

Configurar Hardware usando STM32CubeMX.

Lo primero que vamos a realizar será la correspondiente configuración de los recursos de nuestra tarjeta en STM32CubeMX de la siguiente manera:

Creamos un proyecto nuevo (Imagen 1) y seleccionamos el microcontrolador STN32F407VG, como ya sabemos, que es el correspondiente a nuestra tarjeta Ophyra.

Imagen 1. Nuevo Proyecto en STM32CubeMX.

Imagen 2. Selección del microcontrolador.

Como ya se mencionó se utilizará la comunicación RS232 para desplegar la información proveniente de la memoria M24C32. Por lo que utilizaremos el recurso “USART 3”, así que lo buscamos en la parte izquierda de la ventana “Pinout”, lo seleccionamos y lo habilitamos. Seguidamente, en la parte donde dice “Modo” seleccionamos la opción de “Asynchronous”, y en el apartado que dice “Hardware Flow Control (RS232)” lo dejamos en la opción “Disable”, es decir deshabilitado. Ahora podremos observar los pines correspondientes a “TX” y a “RX”, es decir los pines correspondientes para transmitir y para recibir son habilitados y puestos de color verde como se puede apreciar en la imagen 3.

Imagen 3. Habilitación del puerto RS-232 número 3.

El siguiente paso es habilitar el puerto I2C número 1. En este puerto se encuentra conectada la memoria M24C32-EEPROM. Como se sabe este puerto utiliza dos pines o puertos para realizar la comunicación:

  • SDA: Puerto serial síncrono bidireccional, por donde se transmiten los datos de dispositivo a dispositivo.
  • SCL: Puerto serial de sicronía de datos, este genera una señal de reloj con la velocidad de transferencia de datos adecaudo al sensor.

En la sección de “Pinout” habilitamos el puerto I2C1 y lo ponemos en modo “I2C”, como se muestra en la Imagen 4. También en la imagen se observa que en los pines del microcontrolador se habilitan los puertos PB7 = I2C_SDA y PB6= I2C_SCL. Estos puertos están conectados por defecto a la memoria por lo tanto no es necesario moverlos o renombrarlos.

En el puerto I2C1 también está conectado un dispositivo adicional (el sensor MPU6050) como se detalla en la tabla 1. Ambos dispositivos tienen configurados por hardware sus ID o dirección de identificación esclavo como lo muestra la tabla. En el protocolo I2C, la ID siempre se envía al inicio de una comunicación entre dispositivos maestro-esclavo. Mediante estas direcciones se controla con que dispositivo esclavo se comunicará el dispositivo maestro. Cuando un dispositivo esclavo reconoce su ID, este responde al dispositivo maestro mediante una señal de reconocimiento (acknowledgemt en ingles), es en ese momento cuando se entabla una comunicación entre ambos.

Tabla 1. Dispositivos conectados al  puerto I2C1 de Ophyra.

Si deseamos utilizar otro dispositivo con protocolo I2C, no será posible utilizar el bus I2C1, ya que no se encuentra mapeado hacia algún pin físico de los puertos de expansión CN1, CN2 y CN3; sin embargo el microcontrolador de Ophyra tiene 2 puertos I2C adicionales, que son posible habilitar (I2C2 o el I2C3) recomendamos revisar el manual de Ophyra en la sección 5.14 Puertos de expansión para identificar en que conector tenemos disponible un puerto adicional I2C.

Imagen 4. Habilitación del puerto I2C y dispositivos conectados al mismo puerto.

A continuación damos click sobre la pestaña de “Configuration” y entramos a las ventanas de configuración de cada recurso activado (ver la imagen 5). En la imagen 6 se observa la ventana de configuración del protocolo RS-232.  Nos cercioramos que las configuraciones estén debidamente activadas y damos en el botón de aceptar. Ahora hacemos lo mismo con la configuración del puerto I2C.

Imagen 5. Botones a seleccionar.

Imagen 6. Parámetros del puerto RS-232 y del puerto I2C.

En la pestaña de configuración encontramos en conectividad “Conecctivity” el protoclo I2C. Accionando sobre este botón se muestran algunas configuraciones:

  • I2C Speed Mode: Modo de velocidad.
  • I2C Clock Speed (Hz): Frecuencia de velocidad.
  • Clock No Strech Mode: Modo que alenta la velocidad de comunicación.
  • Primary Address Length selection: Dirección primaria de comunicación.
  • Dual Address Acknowledge: Reconocer la dirección.
  • Primary slave address: Dirección esclava primaria.
  • General Call Adreess detection: Detección del reconocimiento de dirección.

 

Imagen 7. Generación de código.

Click en “Apply” y posteriormente en “Ok”. Ahora podemos proceder a generar el código, haciendo click sobre el icono de “Generate Source Code…“, ubicado en la parte superior de la ventana principal, donde se desplegará la siguiente ventana:

Imagen 8. Ventana de Proyect settings.

Una vez en esta ventana procedemos a configurar los siguientes parámetros:

  1. Project Name, se coloca un nombre para el proyecto, que en nuestro caso será “Tutorial_EEPROM”.

  2. En Project Location, en este campo solo debes asegurarte que se encuentre la dirección donde se ubica tu Workspace para Atollic TrueSTUDIO, en nuestro ejemplo el Wokspace se encuentra enC:\Users\Fernando\Atollic\TrueSTUDIO\ARM_workspace_7.1. Una vez seleccionada la ubicación automáticamente la sección Toolchain Folder Location se llenará.

  3. En la Toolchain / IDEaquí debemos seleccionar nuestro software que utilizaremos para programar, que por ser un Software libre, nosotros usaremos Atollic TrueSTUDIO, por lo tanto seleccionamos TrueSTUDIO.

  4. Seleccionamos la pestaña Code Generator y damos click sobre la opción que se muestra en la imagen.

  5. Al darle click sobre esta opción configuramos el STM32 CubeMX para que nos genere los archivos de configuración separados del archivo “main”. Este paso es opcional y depende de la preferencia del programador.

Finalmente damos click en “OK”, y a continuación se desplegará la ventana que muestra la generación del proyecto, en la cual vamos a dar click en“Open Project”.

Realizar programa en Atollic TrueSTUDIO.

Una vez que STM32CubeMx nos abre TrueStudio, nos dirigimos al explorador de proyectos donde se muestra el proyecto actual como se muestra en la siguiente imagen. Desplegamos las la carpeta de nuestro proyecto, y en el directorio “Src” buscamos el archivo “main.c” y le damos doble para que se despliegue en la ventana de texto.

Imagen 9. Selección del archivo “main”.

Dentro de la sección de “USER CODE BEGIN Includes” agregamos las directivas que se observan en en la imagen 10. Las primeras dos lineas corresponden a librerias estandar de C, mientras que la tercera línea corresponde a la dirección de esclavo o ID de la memoria M24C32 (ver tabla 1). Cabe aclarar que  en la tabla 1 se muestra la dirección 0x50 y en la imagen se muestra 0xA0. Esto es así, porque al número 0x50 se le realizó previamente un corrimiento a la izquierda quedando en el valor de 0xA0. Este corrimiento es necesario debido a que en el protocolo I2C, el bit menos significativo del ID se utiliza como un comando de escritura/lectura. Este bit es manipulado por el dispositivo maestro, poniéndolo a 1 cuando se desea leer información y 0 cuando se desea escribir en el dispositivo esclavo. Cabe hacer notar que esta gestión se realiza de manera automática por las instrucciones en C que comanda el comportamiento del puerto I2C.

Imagen 10.  Directivas iniciales a incluir en el programa.

A continuación escriba el código que se muestra la siguiente imagen.

Figura 11. Variables y secciones de configuración del sensor.

La sección marcada con el número 1, corresponde a las variables utilizadas para escribir y leer datos sobre la memoria M24C32.

La sección 2 genera 10 números mediante un ciclo o bucle for. La secuencia de números que se generan son: 100, 98, 96, 94, 92, 80, 88, 86, 84, 82. Estos números son almacenados temporalmente en el arreglo llamado “datos[10]” Cabe mencionar que estos números son generados arbitrariamente para cuestiones de demostración y no tienen ningún significado importante.

La sección 3 envía los datos hacia la memoria EEPROM y los escribe comenzando desde el espacio de memoria 0x00. Para ello se emplea la función de escritura de memoria que se describe a continuación:

HAL_I2C_Mem_Write(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7);

Como se observa esta instrucción requiere de 7 parámetros:

  • Arg1: Se especifica el puerto I2C con el que se está trabajando.
  • Arg2: Es el ID o dirección del dispositivo esclavo.
  • Arg3: Especifica la dirección del espacio de memoria a partir de la cual se comienzan a guardar los datos.
  • Arg4: Especifica el tamaño de palabra (32bits) de la memoria EEPROM.
  • Arg5: Buffer o arreglo de datos a escribir sobre la memoria.
  • Arg6: Cantidad de datos a escribir.
  • Arg7: Tiempo de espera máximo.

Ahora escribimos el código mostrado en la figura 12. Esta sección de código en general, lee los datos provenientes de la memoria, los envía al puerto USB-Serial, para su visualización en cualquier terminal serial. En este caso en particular utilizaremos la terminal serial que está integrada a Atollic-TrueStudio.

Imagen 12. Sección de programa a ejecutarse en ciclo infinito while.

A continuación vamos a describir cada sección del código:

La sección 1, lee los 10 bytes de información, mediante la siguiente instrucción:

 HAL_I2C_Mem_Read(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7);

Como se observa esta instrucción requiere de 7 parámetros:

  • Arg1: Se especifica el puerto I2C con el que se está trabajando.
  • Arg2: Es el ID o dirección del dispositivo esclavo.
  • Arg3: Especifica la dirección del espacio de memoria a partir de la cual se comienzan a leer los datos.
  • Arg4: Especifica el tamaño de palabra (32bits) de la memoria EEPROM.
  • Arg5: Buffer o arreglo de datos, donde se guardarán los datos leídos de la memoria.
  • Arg6: Cantidad de datos a leer.
  • Arg7: Tiempo de espera máximo.

La sección 2, envía cada dato leído proveniente de la memoria, hacia el puerto serial para su visualización en la terminal. Para más detalles sobre el envío y lectura de datos por el puerto serial consulte el tutorial 7.

Finalmente compilamos nuestro programa para generar el archivo *.HEX y descargarlo a nuestra tarjeta. Para ello seguir los pasos del 1 al 5  de esta GUÍA.

Cargar programa a nuestra tarjeta de Desarrollo Ophyra.

El último paso es programar tu tarjeta Ophyra. Si nunca lo has hecho, sigue los pasos del 6 al 12 de esta GUÍA.

Conclusiones.

Después de cargar el programa a la tarjeta Ophyra, abriremos la terminal del puerto serial que viene integrada en Atollic TRUESTUDIO. En la imagen 13 se muestra el botón que debemos presionar para que se nos habrá la terminal. Nota: Este botón puede variar de ubicación según la configuración de tu programa, por ello es necesario que lo identifiques bien.

Imagen 13. Botón para abrir la terminal serial de Atollic.

Al dar clik sobre el botón, se abrira una ventana de configuración como la que se muestra en la imagen 14.

Imagen 14. Ventana de configuración de la terminal serial de Atollic.

Seleccionamos el puerto COM correspondiente a nuestra tarjeta Ophyra, los demás parámetros no se modifican ya que así fue configurado por defecto el puerto serial de Ophyra; por último damos click en OK. Atollic abrirá una ventana en la parte inferior de la ventana, junto a la consola. En esta ventana observaremos los datos enviados por Ophyra (ver imagen 15).

Para este ejemplo se observará una cadena de datos correspondientes a cada lectura de la memoria M24C32-EEPROM. Es decir se observa la secuencia de los 10 datos previamente guardados en la memoria.

Para terminar o cerrar la comunicación con el puerto serial, debemos presionar el botón que se resalta en rojo en la  imagen 15.

Imagen 15. Terminal serial de Atollic activada. Despliegue de datos.

Hemos configurado y programado en Ophyra la memoria M24C32-EEPROM mediante el puerto serial I2C. Así mismo utilizamos el puerto serial RS232, para visualizar la información proveniente de la memoria en la terminal de Atollic.

Te sugerimos hacer ejercicios más complicados como la escritura de datos flotantes, y su posterior recuperación.

Si tienes alguna consulta o duda sobre este tutorial o referente a cualquier otro tema de Ophyra, contáctanos a nuestro Foro.

Menú