Autor Tema: Leer/escribir diferentes registros de otro dispositivo mediante i2c  (Leído 2686 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado wATAw

  • PIC12
  • **
  • Mensajes: 52
Buenas me han surgido unas dudas entorno al i2c. He intentado buscar cosas en el foro, y aunque haya bastantes cosas sobre el tema, no acabo de aclararme. No se trata de escribir en una eeprom si no de comunicarme con un dispositivo. Este dispositivo tiene diferentes registros, y quiero poder leerlos asi como escribirlos(el dispositivo actuara según los valores de esos registros). No se si la escritura y lectura se hacen de esta manera:

Escritura:

i2c_start(); //Start condition
i2c_write(DIRECCION); //Dirección del dispositivo esclavo
delay_ms(3);
i2c_write(DIRECCION_REGISTRO); //Escogemos el registro en el que queremos escribir.
delay_ms(3);
i2c_write(valor); //Valor a escribir en el registro.
delay_ms(3);
i2c_stop();


Lectura:

i2c_start(); //Start condition
i2c_write(DIRECCION); //Dirección del dispositivo esclavo
delay_ms(3);
i2c_write(DIRECCION_REGISTRO); //Escogemos el registro en el que queremos leer.
delay_ms(3);
valor=i2c_read();
delay_ms(3);

Se haría asi?? Y si despues de escribir, leemos?leeríamos los valores sucesivos al registro antes escrito?
Espero que podais resolverme la duda.
Gracias de antemano.

Desconectado Marioguillote

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1926
    • Servisystem
Re: Leer/escribir diferentes registros de otro dispositivo mediante i2c
« Respuesta #1 en: 25 de Marzo de 2008, 15:58:18 »
Hola wataw !

No todos los dispositivos que trabajan con I2C se comunican de la misma forma.
Quiero decir, no todos poseen los mismos protocolos de acceso.
Por darte un ejemplo, una memoria 24C04 no se abre para leerla, de la misma forma que lo hace una 24C64.
Lo mismo sucede para escribirla.
Tampoco todos los dispositivos "colgados" del bus I2C, poseen la misma "Slave Address" ya que sino, no podría conectarse más que un sólo dispositivo al bus.

De que dispositivo estamos hablando y que no es una memoria ?
En su datasheet estarán todas las respuestas de cómo comunicarte con él.

Saludos
Mario

Desconectado wATAw

  • PIC12
  • **
  • Mensajes: 52
Re: Leer/escribir diferentes registros de otro dispositivo mediante i2c
« Respuesta #2 en: 25 de Marzo de 2008, 17:08:01 »
Muchas gracias por la respuesta!!!!
Es un chip especifico para baterias de ion litio...vamos que no es algo común, asiq tendre que mirarlo en el datasheet!!!muchas gracias!!!

Desconectado wATAw

  • PIC12
  • **
  • Mensajes: 52
Re: Leer/escribir diferentes registros de otro dispositivo mediante i2c
« Respuesta #3 en: 25 de Marzo de 2008, 18:47:54 »
Bueno tengo novedades, he consultado el datasheet y aparece lo siguiente:
Write:


Read:


Me surgen dudas en cuanto al ACK, y el NACK. Se tienen en cuenta en CSS??o tengo que pasar de el??

Nose si este codigo es correcto:

Write:

i2c_start(); //Start condition
i2c_write(0x50); //Dirección del dispositivo esclavo
delay_ms(3);
i2c_write(DIRECCION_REGISTRO); //Escogemos el registro en el que queremos escribir.
delay_ms(3);
i2c_write(valor); //Valor a escribir en el registro.
delay_ms(3);
i2c_stop();

El write lo tengo bastante claro, me imagino que será algo similar a lo que he puesto. Por el contrario el Read no lo tengo tan claro. No entiendo el Random read, y no se si para leer un registro en concreto, tengo que usar el "current adress read" pero colocandome primero en el registro mediante una "falsa" escritura. Algo similar a esto:

i2c_start(); //Start condition
i2c_write(0x50); //Dirección del dispositivo esclavo
delay_ms(3);
i2c_write(DIRECCION_REGISTRO); //Escogemos el registro en el que queremos escribir.
delay_ms(3);
i2c_stop(); **A lo mejor me sobra este Stop??
i2c_start(); //Start condition
i2c_write(0x50); **Creo que el Slave esta vez tengo que cambiarlo a 0x51
delay_ms(3);
valor=i2c_read();
delay_ms(3);
i2c_stop();

**Creo que lo he entendido
No se si será algo asi, espero que podais ayudarme. Por cierto, el byte slave del random read solo se usa en el random read verdad??El concepto de random read no lo veo muy claro...no se que utilidad puede tener.
Muchas gracias de antemano!!!

« Última modificación: 25 de Marzo de 2008, 18:54:22 por wATAw »

Desconectado wATAw

  • PIC12
  • **
  • Mensajes: 52
Re: Leer/escribir diferentes registros de otro dispositivo mediante i2c
« Respuesta #4 en: 25 de Marzo de 2008, 18:57:37 »
Yo creo que quedaria de esta manera:
Write:

i2c_start(); //Start condition
i2c_write(0x50); //Dirección del dispositivo esclavo
delay_ms(3);
i2c_write(DIRECCION_REGISTRO); //Escogemos el registro en el que queremos escribir.
delay_ms(3);
i2c_write(valor); //Valor a escribir en el registro.
delay_ms(3);
i2c_stop();

Read:

i2c_start(); //Start condition
i2c_write(0x50); //Dirección del dispositivo esclavo
delay_ms(3);
i2c_write(DIRECCION_REGISTRO); //Escogemos el registro en el que queremos escribir.
delay_ms(3);
i2c_start(); //Start condition
i2c_write(0x51);
delay_ms(3);
valor=i2c_read();
delay_ms(3);
i2c_stop();

Creo que sería algo asi. De todas maneras sigo mosca con el ACK y el NACK...a ver que opinais!!!
Muchas gracias!!



Desconectado ales

  • PIC10
  • *
  • Mensajes: 33
Re: Leer/escribir diferentes registros de otro dispositivo mediante i2c
« Respuesta #5 en: 16 de Abril de 2008, 13:21:53 »
Con respecto a lo que debes enviarle al dispositivo depende de el como tal, pero con el CCS cuando hacer un
i2c_read() el dispositivo esclavo por defecto envia un ACK al Master, si haces: i2c_read(0) no se solicita el Ack al esclavo.
Esto se usa por si el dispositivo esclavo no tiene implementado enviar un Ack entonces no colgar al Master en la espera del Ack.
Cuando poner i2c_read() el compilador escoge por defecto: i2c_read(1) que es para esperar el Ack.

Espera que te sirva.

Saludos.


 

anything