TEMA 20.1 EL BUS 2 IC PERIFÉRICOS Memorias serie Uno los elementos que se utilizan en la comunicación i2c son las memorias serie, como ejemplo tomamos la memoria M24512 se ST. Esta memoria posee una capacidad de 64K x 8 bits, por lo que se necesitan 16 bits para direccionarla o lo que es lo mismo 2 bytes. El pinout y diagrama lógico de dicha memoria es: CCFF DPE MÓDULO DE PROYECTOS 2 Los nombres de las señales son: La dirección del dispositivo es la siguiente: CCFF DPE MÓDULO DE PROYECTOS 3 Como podemos comprobar existe una parte fija (b7 a b4), y otra seleccionable por hard (b3-b1), además del bit de selección de lectura/escritura (R/W#) Si mediante el hard los 3 bits (b3-b1) a “0”. 6 5 7 SCL SDA WC E0 E1 E2 1 2 3 M24512 CCFF DPE MÓDULO DE PROYECTOS 4 El byte de dirección quedará como: A0 para operaciones de escritura A1 para operaciones de lectura Evidentemente podemos conectar mas de una memoria, pero su dirección deberá ser diferente 6 5 7 SCL SDA WC E0 E1 E2 1 2 3 M24512 U2 6 5 7 SCL SDA WC E0 E1 E2 1 2 3 M24512 Para la segunda memoria tendremos: A3 para las operaciones de escritura A2 para las operaciones de lectura CCFF DPE MÓDULO DE PROYECTOS 5 Hasta ahora no hemos hecho referencia al pin WC (Write Control) Esta señal es utilizada para la protección de la totalidad de la memoria ante escrituras involuntarias, si esta señal está a H, las operaciones de escritura están deshabilitadas. Mientras la señal WC se encuentra a nivel H, la selección de dispositivo y los bytes de dirección son reconocidos, pero los bytes de datos no. Si este pin está desconectado (al aire), la señal es puesta a L internamente, y las operaciones de escritura son reconocidas. CCFF DPE MÓDULO DE PROYECTOS 6 De lo anterior se deduce que para efectuar escrituras, se debe gobernar esta señal desde el master, o bien poner dicho terminal a masa. 6 5 7 SCL SDA WC 1 2 3 E0 E1 E2 M24512 U2 6 5 7 SCL SDA WC E0 E1 E2 1 2 3 M24512 La secuencia que se debe seguir para la escritura de un byte es: CCFF DPE MÓDULO DE PROYECTOS 7 Este dispositivo, posee un modo de escritura de página, en el cual las direcciones en la memoria se autoincrementan (solo el byte de menor peso), por esto la condición que debe cumplirse, es que todas las direcciones que van a ser escritas deben tener en común los 8 bits de mayor peso. Hay que prestar cuidado a que el número de datos no sea superior al final de la página ya que si no se sobreescribirían. (una página la componen 128 datos o bytes). La escritura finaliza cuando el master genera una señal de parada (Stop). CCFF DPE MÓDULO DE PROYECTOS 8 Secuencia de escritura de una página Las velocidades de transferencia de datos que admite son: Modo estándar: 100Kbits/segundo Modo rápido: máximo 400Kbits/s CCFF DPE MÓDULO DE PROYECTOS 9 Manejo de la memoria en C desde el compilador CCS El compilador CCS dispone de un driver para el manejo de esta memoria, y de otros específicos para dispositivos i2c CCFF DPE MÓDULO DE PROYECTOS 10 4 3 CCFF DPE MÓDULO DE PROYECTOS 11 1 2 CCFF DPE MÓDULO DE PROYECTOS 12 Analicemos el driver: void write_ext_eeprom(long int address, BYTE data) { short int status; i2c_start(); i2c_write(0xa0); i2c_write(address>>8); i2c_write(address); i2c_write(data); i2c_stop(); i2c_start(); status=i2c_write(0xa0); while(status==1) { i2c_start(); status=i2c_write(0xa0); } 1 //inicializamos la transmisión reloj a nivel bajo //dirección del esclavo + bit de escritura //byte H de la dirección de memoria donde queremos escribir //mandamos byte L de la dirección de memoria //enviamos el dato a escribir //finalizamos la transmisión //reinicio de la transmisión //en status debo recibir un 0 para indicar que el esclavo //ha devuelto ACK# y evitar escrituras incorrectas //si no he recibido ACK = 0 espero a que responda el sclavo //lazo de espera para que responda el esclavo } Recuerde que las direcciones de la EEprom son 2 bytes CCFF DPE MÓDULO DE PROYECTOS 13 BYTE read_ext_eeprom(long int address) { 2 BYTE data; // i2c_start(); //inicalizamos la transmisión i2c_write(0xa0); //dirección del esclavo + bit de escritura (el último = 0) i2c_write(address>>8); //byte H de la dirección de memoria donde queremos leer i2c_write(address); //byte L de la dirección donde queremos leer i2c_start(); //reinicio i2c_write(0xa1); //dirección del esclavo + bit de lectura (el último= 1) data=i2c_read(0); //en la variable data guardamos dato leido, no esperamos ACK i2c_stop(); //finalizamos la transmisión return(data); //retornamos dato leído } CCFF DPE MÓDULO DE PROYECTOS 14 3 void init_ext_eeprom() { output_float(EEPROM_SCL); //pone en SCL en como entrada y nivel H en colector A. output_float(EEPROM_SDA); //pone en DA en como entrada y nivel H en colector A } #ifndef EEPROM_SDA //compilacion condicional #define EEPROM_SDA PIN_B1 #define EEPROM_SCL PIN_B0 //si no se definen en main toma estos pines // si no se definen en main toma estos pines 4 #endif Como podemos comprobar el driver tiene una dirección fija que es: =0xA0 para escritura y 0xA1 para lectura, si se desea utilizar la memoria en otra dirección de las posibles deberíamos modificar el driver. CCFF DPE MÓDULO DE PROYECTOS 15 Ejercicio de Aplicación Como aplicación realicemos el siguiente circuito: CCFF DPE MÓDULO DE PROYECTOS 16 En este circuito deseamos guardar datos en las primeras 20 posiciones de memoria. Posteriormente se leerá dicha información. Los valores leídos y escritos se a información enviada y recibida se representará en un lcd Lm044L, que es un display de 4 líneas y 20 caracteres por línea. El ejercicio se ralizará de por partes, construyéndose por partes. Se deberán utilizar los drivers que incorpora el compilador , haciendo en ellos las correcciones oportunas. Como ampliación el alumno deberá hacer que se escriban y lean las 20 últimas posiciones de memoria. CCFF DPE MÓDULO DE PROYECTOS 17 Comenzamos definiendo nuestro proyecto: CCFF DPE MÓDULO DE PROYECTOS 18 CCFF DPE MÓDULO DE PROYECTOS 19 Veamos el programa y fichero.h generado por el propio compilador: CCFF DPE MÓDULO DE PROYECTOS 20 Programa: CCFF DPE MÓDULO DE PROYECTOS 21 CCFF DPE MÓDULO DE PROYECTOS 22 Para la simulación, utilizaremos el siguiente circuito: CCFF DPE MÓDULO DE PROYECTOS 23 Como podemos ver hemos incluido un debugger de bus I2C, cuyo modo de funcionamiento podemos obtener haciendo seleccionando el dispositivo y luego haciendo clic sobre Display Model Help CCFF DPE MÓDULO DE PROYECTOS 24 Obteniéndose la siguiente ayuda: CCFF DPE MÓDULO DE PROYECTOS 25 Comenzamos la simulación: CCFF DPE MÓDULO DE PROYECTOS 26 Antes de comenzar conviene que comprobemos que la memoria se encuentra sin ningún dato escrito (todo a FF): CCFF DPE MÓDULO DE PROYECTOS 27 Ahora simulamos observe que hemos incluido un punto de ruptura para visualizar como se va escribiendo cada uno de los datos: CCFF DPE MÓDULO DE PROYECTOS 28 Observamos que el analizador de bus I2C ha realizado una captura, veamos que información nos facilita: Instante en que comienza la transmisión Instante en que finaliza la transmisión Información presente en el bus I2C CCFF DPE MÓDULO DE PROYECTOS 29 El significado de la información presente en el bus es : S Comando de Start A0 Dirección del esclavo y orden de escritura A Ack 00 Byte alto de dirección de la EEprom A Ack 00 Byte bajo de dirección de la EEprom A Ack 02 Byte de datos A Ack P Stop CCFF DPE MÓDULO DE PROYECTOS 30 La secuencia de comunicación puede ser vista con más detalle si hacemos clic sobre “ +” en el debugger I2C: CCFF DPE MÓDULO DE PROYECTOS 31 Evidentemente todo lo visto en las transparencias anteriores está en concordancia con lo definido en el programa que hemos desarrollado. CCFF DPE MÓDULO DE PROYECTOS 32