TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: gera en 11 de Septiembre de 2009, 02:08:19
-
Buenas amigos!!!
Ando haciendo unas pruebas con el bus i2c y me surgieron algunas dudas. Queria saber si las funciones i2c_write() e i2c_read() agregan automaticamente el bit de R/W. O yo tengo q agregar en el bit0 de la direccion la operacion q voy a realizar?
| start | A7 A6 A5 A4 A3 A2 A1 | R/W | ACK | ... DATA ... | ACK | stop | idle |
Saludos y gracias desde ya!!!
-
No, tu tienes que mandar el byte con la dirección + el bit de escritura/lectura.
-
Entonces si mi esclavo tiene la direccion 0x5D (0b1011101), y quiero escribir tengo q hacer algo asi:
i2c_start(); //condicion de start
i2c_write(0b10111010); //direccion 0x5D modo escritura
i2c_write(0x13); //registro de configuracion
ack=i2c_write(0b00010101);//resetea, modo2 (escaneo contínuo), habilita escaneo electrodos
i2c_stop();
Porq en ese caso el esclavo no responde con el ack. Solo lo hace cuando en el primer write pongo i2c_write(0x5D); :?
-
Mirá esta es la librería para escribir/leer una memoria serial:
i2c_start();
i2c_write(0xa0);
i2c_write(address>>8);
i2c_write(address);
i2c_start();
i2c_write(0xa1);
data=i2c_read(0);
i2c_stop();
Y si write te devuelve un 1 es un nack.
-
Hmm, a ver si entiendo. La direccion de la memoria serial es 0x50 (1010000), entonces primero mandamos un 0xA (010100000) diciendo q vamos a escribir, luego enviamos la parte alta y baja de la direccion de memoria. Volvemos a enviar la direccion, pero esta vez con un 1 al final para indicar lectura, leemos el dato del esclavo y terminamos. Estoy en lo cierto?
Por lo tanto en mi caso, si la direccion es 0x5D, tengo q enviar 0xBA para escribir, y 0xBB para leer. Y el ack tiene q ser igual a 0 para indicar q la operacion fue valida. Es asi?
Gracias por tu aclaracion suky!!
-
Exactamente, debería ser 0xBA para escribir y 0xBB para leer.
-
Muchas gracias suky!!! :-/ :-/
Ahi logre hacerlo andar. Todavia tiene problemas, pero ese es otro tema jeje.
adios!!
-
y donde se recibe o lee el ACK o NACK?
-
i2c_write devuelve la condición de ack.
Saludos!
-
digamos que me conecto a una memoria, esta devuelve un ack? en que parte explícitamente del código que dejaste esta eso?
-
No, en la librería de la memoria externa no hace uso del ack, osea no testea si se recibe o no el ack cuando escribe la dirección. Si lo hace cuando envío un byte (o varios, escritura en página) y espera a que la memoria haga el proceso de guardado interno:
while(status==1)
{
i2c_start();
status=i2c_write(0xa0);
}
i2c_stop();
-
aaaah ok, entonces el write_i2c es una función que devuelve un valor
En este caso deuveleve un 0 =ACK y un 1=NACK
Esa parte no me la sabía, pasa que siempre vi al i2c en alto nivel, no veía los detalles, ahora lo entiendo mejor. Entonces si quiero preguntar por todos los ACK's debo hacer algo parecido, no?
Gracias, por la respuesta, saludos
-
Claro, lo q hago yo es ir guardandolos en un arreglo, en caso de haber un nack, se donde se produjo. Otra forma es repetir una operacion mientras haya nack, o ir haciendo un AND entre los ack.
saludos!
-
ok, muchas gracias por contestar, que bueno es darse cuenta como trabaja el I2C a fondo :mrgreen:
saludos
-
Yo habia estudiado el bus i2c en circuitos digitales.. pero no me terminaba de cerrar hasta ahora q le puse mano encima jaja.
-
Yo habia estudiado el bus i2c en circuitos digitales.. pero no me terminaba de cerrar hasta ahora q le puse mano encima jaja.
Jejeje! Si lo mejor es ponerse a trabajar en ello, siempre se aprende mas!
-
Hola feliz 2010 ,la estructura que dan mas arriba es = en caso de que quiera comunicar dos pic 16f877a?,quiero prácticar y no dispongo de esa memoria que usan aca,mi inquietud es como se determina la direccion del pic q va a ser esclavo,¿es convencional? con las memorias parece que no; vi por ahi q algunas memorias se pueden mandar hasta 4 pines a masa o a alimentacion para jugar un poco con su direccion en el bus,pero con otro pic como es? Grax.
-
A mi en el proteus si no tengo conectada la memoria se queda colgado el programa , porque???
Se queda esperando la respuesta??????
Esto solo en proteus!
En la "vida real" no se queda bloqueado y sigue.
Aqui es donde se bloquea
init_ext_eeprom(); //Inicializar EEPROM
-
En la vida real ase exactamente lo mismo :5] . y no es que se cuelgue mas bien pienso que se queda esperando respuesta del bus. :?
Lo que es molesto por que en algún momento pretendí que mi programa me informara si no obtenía respuesta de la memoria, lo cual no fue posible porque el programa simplemente se congela como si entrara en un bucle esperando respuesta del bus.
-
En la vida real ase exactamente lo mismo :5] . y no es que se cuelgue mas bien pienso que se queda esperando respuesta del bus. :?
Lo que es molesto por que en algún momento pretendí que mi programa me informara si no obtenía respuesta de la memoria, lo cual no fue posible porque el programa simplemente se congela como si entrara en un bucle esperando respuesta del bus.
Pues a mi en fisico no se bloquea , pero se me hace raro , no veo en las funciones donde este esperando respuesta >_<.
Tambien se bloquea con el RTC en el proteus , pero si lo quito del pcb sigue el programa , no se que ocurra.
-
Mmm pues a mi si se me congelaba. no probé retirando la memoria del bus mas bien intente simular una falla en la memoria desconectando un hilo del bus ya fuera data o clok.
Ahora si en físico si continúa y en proteus no y el programa con el que pruebas es exactamente el mismo pues es fallo es del simulador al cual no le programaron que hacer si en el bus no hay nada :D :D :D
-
Hola feliz 2010 ,la estructura que dan mas arriba es = en caso de que quiera comunicar dos pic 16f877a?,quiero prácticar y no dispongo de esa memoria que usan aca,mi inquietud es como se determina la direccion del pic q va a ser esclavo,¿es convencional? con las memorias parece que no; vi por ahi q algunas memorias se pueden mandar hasta 4 pines a masa o a alimentacion para jugar un poco con su dirección en el bus,pero con otro pic como es? Grax.
Exactamente, el protocolo es el mismo. El PIC maestro tiene que enviar el bits Start, un byte con la dirección y si se quiere escribir o leer en el esclavo, y después dependerá de la acción a realizar.
CCS para modo esclavo tiene la función i2c_isr_state(), con la cual se puede determinar que operación quiere hacer el maestro sobre el esclavo al recibir una interrupción por recepción de datos I2C.
A mi en el proteus si no tengo conectada la memoria se queda colgado el programa , porque???
Se queda esperando la respuesta??????
Esto solo en proteus!
En la "vida real" no se queda bloqueado y sigue.
Aqui es donde se bloquea
init_ext_eeprom(); //Inicializar EEPROM
Es sumamente extraño que se bloque en esa función, porque solo se establecen los pines SDA y SCL como entrada utilizando la función output_float :?
Saludos!
-
Proteus sigue con sus fallas en i2c , prueben cambiar la imagen de la eeprom y no lo lograran a menos que eliminen la eeprom y peguen otra y carguen otra vez la imagen >_<.