Las Subrutinas - IES Antonio Machado

Anuncio
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
Descargar