Autor Tema: Duda con acceso a RAM en PCF2127AT  (Leído 2436 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Duda con acceso a RAM en PCF2127AT
« en: 04 de Agosto de 2014, 18:32:11 »
Hola amigos, llevo dos días rompiéndome los cuernos con un RTC muy interesante de NXP, ya que integra el oscilador, el swich-over para la batería y 512 bytes de RAM no volátil. Es el PCF2127AT.

El caso es que estoy intentando hablar con él a través de un sencillo bus I2C, y ya he conseguido domar la parte del RTC: ya lo pongo en hora y puedo leerla sin problemas.

Sin embargo, la gestión de la RAM es algo diferente, ya que no funciona como estamos acostumbrados en otro tipo de memorias serie. En este caso los procesos de escritura y lectura son así:


Pues por más vueltas que le doy a las funciones no consigo que vayan bien. Aquí las dejo por si podéis echarme una mano:

Código: C
  1. #define PCF2127_CONTROL1   0x00     //control/status 1
  2. #define PCF2127_CONTROL2   0x01     //control/status 2
  3. #define PCF2127_CONTROL3   0x02     //control/status 2
  4. #define PCF2127_CLKOUT     0x0F     //CLKOUT control
  5.  
  6.  
  7.  
  8. #define PCF2127_SECONDS    0x03     //0..59 BCD (bit7 is VL)
  9. #define PCF2127_MINUTES    0x04     //0..59 BCD
  10. #define PCF2127_HOURS      0x05     //0..23 bcd
  11. #define PCF2127_DAYS       0x06     //1..31 bcd
  12. #define PCF2127_WEEKDAY    0x07     //0..6
  13. #define PCF2127_MONTHS     0x08     //0..12 (bit7 is Century, leave clear for 20xx)
  14. #define PCF2127_YEARS      0x09     //0..99 bcd
  15.  
  16. #define PCF2127_SECOND_ALARM  0x0A  //0..59 BCD
  17. #define PCF2127_MINUTE_ALARM  0x0B  //0..59 BCD
  18. #define PCF2127_HOUR_ALARM    0x0C  //0..23 BCD
  19. #define PCF2127_DAY_ALARM     0x0D  //0..31 BCD
  20. #define PCF2127_WEEKDAY_ALARM 0x0E  //0..6
  21.  
  22. #define PCF2127_RAM_ADR_MSB 0x1A
  23. #define PCF2127_RAM_ADR_LSB 0x1B
  24. #define PCF2127_RAM_WRT_CMD 0x1C
  25. #define PCF2127_RAM_RD_CMD  0x1D
  26.  
  27. void write_ram(unsigned int16 direccion, int8 valor) {
  28.  
  29.    i2c_start(STREAM_PCF2127);
  30.    i2c_write(STREAM_PCF2127, PCF2127_I2C_ADDR);
  31.    i2c_write(STREAM_PCF2127, PCF2127_RAM_ADR_MSB);
  32.    i2c_write(STREAM_PCF2127, direccion>>8);
  33.    i2c_write(STREAM_PCF2127, direccion&0xFF);
  34.    
  35.    i2c_start(STREAM_PCF2127);
  36.    i2c_write(STREAM_PCF2127, PCF2127_I2C_ADDR);
  37.    i2c_write(STREAM_PCF2127, PCF2127_RAM_WRT_CMD);
  38.    i2c_write(STREAM_PCF2127, valor);
  39.    
  40.    i2c_stop(STREAM_PCF2127);
  41. }
  42.  
  43. int8 read_ram(unsigned int16 direccion) {
  44.    int8 valor;
  45.    
  46.    i2c_start(STREAM_PCF2127);
  47.    i2c_write(STREAM_PCF2127, PCF2127_I2C_ADDR);
  48.    i2c_write(STREAM_PCF2127, PCF2127_RAM_ADR_MSB);
  49.    i2c_write(STREAM_PCF2127, direccion>>8);
  50.    i2c_write(STREAM_PCF2127, direccion&0xFF);
  51.    
  52.    i2c_start(STREAM_PCF2127,2);
  53.    i2c_write(STREAM_PCF2127, PCF2127_I2C_ADDR);
  54.    i2c_write(STREAM_PCF2127, PCF2127_RAM_RD_CMD);
  55.    i2c_write(STREAM_PCF2127, 0xFF);
  56.    
  57.    i2c_start(STREAM_PCF2127,2);
  58.    i2c_write(STREAM_PCF2127, PCF2127_I2C_ADDR+1);
  59.    
  60.    valor = i2c_read(STREAM_PCF2127,1);
  61.    i2c_stop(STREAM_PCF2127);
  62.    
  63.    return (valor);

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Duda con acceso a RAM en PCF2127AT
« Respuesta #1 en: 04 de Agosto de 2014, 19:26:09 »
El write a simple vista lo veo bien, pero en el read hay cosas que no me cuadran:

   i2c_write(STREAM_PCF2127, 0xFF); //???

   i2c_write(STREAM_PCF2127, PCF2127_I2C_ADDR+1); //+1 quizas para poner el bit R? Creo que asi no porque se modifica el ultimo bit, no el ultimo bit de la ADDR

Si miras la Figure 44 y 45 de la pagina 83 te sale mejor explicado, con ese flujo de datos y un analizador logico no deberias tener problemas en ver donde esta el fallo.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Duda con acceso a RAM en PCF2127AT
« Respuesta #2 en: 05 de Agosto de 2014, 01:34:48 »
Me equivoqué al limpiar la función para pegarla en el foro. Tenía todavía restos de sangre de la batalla.
La función que creo que es correcta (pero que tampoco funciona) es esta:

Código: C
  1. int8 read_ram(unsigned int16 direccion) {
  2.    int8 valor;
  3.    
  4.    i2c_start(STREAM_PCF2127);
  5.    i2c_write(STREAM_PCF2127, PCF2127_I2C_ADDR);
  6.    i2c_write(STREAM_PCF2127, PCF2127_RAM_ADR_MSB);
  7.    i2c_write(STREAM_PCF2127, direccion>>8);
  8.    i2c_write(STREAM_PCF2127, direccion&0xFF);
  9.    
  10.    i2c_start(STREAM_PCF2127,2);
  11.    i2c_write(STREAM_PCF2127, PCF2127_I2C_ADDR);
  12.    i2c_write(STREAM_PCF2127, PCF2127_RAM_RD_CMD);
  13.    
  14.    i2c_start(STREAM_PCF2127,2);
  15.    i2c_write(STREAM_PCF2127, PCF2127_I2C_ADDR|1);
  16.    
  17.    valor = i2c_read(STREAM_PCF2127,0);
  18.    i2c_stop(STREAM_PCF2127);
  19.    
  20.    return (valor);


Lo del analizador lógico no lo he probado, pero creo que tengo algo por ahí que podría servir. A ver si esta tarde lo busco y lo pongo en marcha.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Duda con acceso a RAM en PCF2127AT
« Respuesta #3 en: 05 de Agosto de 2014, 10:01:33 »
i2c_write(STREAM_PCF2127, PCF2127_I2C_ADDR|1);

estas seguro que es asi??

Eso te pone un 1 al final de la ADDR pero creo que no te modifica el bit R/W, realmente no se como va esa funcion porque nunca la he usado, pero no serian 7bits de addr + 1 bit R/W? o La addr son 8bits?? incluido el bit R/W?

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Duda con acceso a RAM en PCF2127AT
« Respuesta #4 en: 06 de Agosto de 2014, 04:47:06 »
Sí, eso es correcto.
PCF2127_I2C_ADDR es un byte cuyo bit menos significativo es 0, y se utiliza para R/W

De hecho, en la función de leer la hora actual lo tengo idéntico y funciona perfectamente.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Duda con acceso a RAM en PCF2127AT
« Respuesta #5 en: 06 de Agosto de 2014, 14:16:56 »
Pues ya he conectado el analizador lógico. Y sigo igual de perdido  :(

Haciendo este bucle de escritura:

   while (1) {
      write_ram(0x51,0xE7);
      delay_ms(1);
   }

Me encuentro con esto:

Todo parece correcto


Y si hago el bucle de lectura:
   while (1) {
      read_ram(0x51);
      delay_ms(1);
   }

Me encuentro con esto otro:



Es todo correcto, pero el cabronazo devuelve un 0.

¡Me tiene loco!

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Duda con acceso a RAM en PCF2127AT
« Respuesta #6 en: 06 de Agosto de 2014, 15:24:46 »
Yo tambien lo veo bien, algo raro habra ahi.

Puedes probar a leer algun registro de proposito para ver si te responde algo distinto de 0.

O bien pasarte a SPI que es mucho mas sencillo jeje

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Duda con acceso a RAM en PCF2127AT
« Respuesta #7 en: 06 de Agosto de 2014, 16:13:36 »
hola compañero

¿como van las vacaciones?
he mirado la foto del data que has puesto y me ronda una cosa por la cabeza
cuando pone que automáticamente sera incrementado a 1Bh no le entiendo...!

se debe de entender que el solo incrementa el puntero de direcciones?
o por el contrario el trasforma la dirección que tu le pasas?

por cierto con que haces el depurado?
esos gráficos están muy chulos..!
en que lo programas ccs...?

un saludo.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Duda con acceso a RAM en PCF2127AT
« Respuesta #8 en: 06 de Agosto de 2014, 16:18:20 »
Mucho me temo que por SPI pasaría lo mismo, porque está claro que no es un problema con la comunicación I2C, ya que va bien.
Sospecho que pasa algo raro con la RAM, lo mismo cambio el integrado a ver si es que ese está jodido.

Pajaro, lo de que se incrementan automáticamente hasta 1B significa que si te pones a leer o escribir desde 00, va pasando al siguiente registro, pero cuando llegue a 1B vuelve a empezar.

La depuración la hago con esto:
http://dangerousprototypes.com/docs/Open_Bench_Logic_Sniffer/es

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Duda con acceso a RAM en PCF2127AT
« Respuesta #9 en: 06 de Agosto de 2014, 16:29:08 »
Yo creo que el problema esta en la comunicacion mas que en el integrado, es raro que se le haya jodido la RAM y el integrado sin embargo funcione bien, piensa que aunque se anuncie como ram para propositos generales seguramente haya direcciones prohibidas donde se guardan los registros del propio componente, asi en vez de poner 2 ram utilizaran una compartida.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Duda con acceso a RAM en PCF2127AT
« Respuesta #10 en: 06 de Agosto de 2014, 16:36:32 »
Lamentablemente no puedo probar el SPI porque me faltan dos pines más en el micro.

He cambiado de integrado y funciona igual de mal  :(

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Duda con acceso a RAM en PCF2127AT
« Respuesta #11 en: 06 de Agosto de 2014, 18:06:20 »
hola compañero

tengo una pregunta puedes escribir en una dirección de la ram y después
verificar en  que dirección lo escribió?

hay forma de saber que escribe el dato donde tu realmente le has dicho?

verifica si la dirección que lees es realmente la que tu crees que lees?

verifica si después de leerla, que por alguna circunstancia rara no se borra el dato


me puedes decir...?
 comentar los resultados tengo curiosidad...


ese chisme de hardware (sniffer ) es el pequeño?

un saludo.


Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Duda con acceso a RAM en PCF2127AT
« Respuesta #12 en: 06 de Agosto de 2014, 18:29:20 »
Y no puedes quitar temporalmente algunos pines para poder usar SPI? Lo digo para probar, quizas puedas ver bien la lectura.


 

anything