Autor Tema: módulo i2c1 pic24FJ no me funciona correctamente.  (Leído 7384 veces)

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

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
módulo i2c1 pic24FJ no me funciona correctamente.
« en: 23 de Diciembre de 2010, 09:06:29 »
Hola amigos!

Llevo ya un par de días tratanto de configurar el módulo i2c del pic24FJ64GB002.


Note que cuando escribo en el registro TRISB , el i2c1 no me genera clock y SDA siempre se queda en 0.

Leyendo el manual reference de la familia 24FJ64GB , dice que el módulo se encarga de la escritura del registro TRIS.
Por lo que siempre inicio mis programas con el TRISB=0; LATB=0;

Los pines son RB9=SDA RB8=CLK

Configure el TRIS como entrada y nada , luego 11 , 10 , 01 , 00 y nada que funciona.
Si comento la linea funciona bien el módulo.

LA familia 24FJGA tiene varios problemas con el modulo i2c , ya intente las soluciones que marca pero sin resultado alguno.
En la ERRATA del que uso 24FJ64GB family no marca ningun error con el i2c

>> aqui un post del problema pero en los 24FJ64GA
Se me estará bloqueando el módulo y este no cargue el buffer y genere el clock ????

Solo dispongo del pickit2 con el cual pude ver algunas tramas.

Este es el programa :
Código: C
  1. //include basic header definition
  2. #include <p24FJ64GB002.h>
  3.  
  4. //------------ Configuration WORDS -----------------------//
  5. _CONFIG1(WDTPS_PS1 & FWPSA_PR128 & FWDTEN_OFF & ICS_PGx3 & GWRP_ON & GCP_OFF & JTAGEN_OFF)
  6. _CONFIG2(POSCMOD_NONE & IOL1WAY_OFF & I2C1SEL_PRI & OSCIOFNC_ON  & FCKSM_CSDCMD & FNOSC_FRCPLL & PLL96MHZ_ON & PLLDIV_NODIV & IESO_OFF)
  7. _CONFIG3(SOSCSEL_IO & WUTSEL_LEG & WPDIS_WPDIS & WPCFG_WPCFGDIS & WPEND_WPENDMEM )
  8. _CONFIG4(DSWDTPS_DSWDTPS3 & DSWDTOSC_LPRC & RTCOSC_LPRC & DSBOREN_OFF & DSBOREN_OFF )
  9. //------------------------------------------------------------//
  10.  
  11. //------ Hardware definition -----------//
  12. //#define Button_1 PORTBbits.RB15                       //Button 1 conected to RB15 pin
  13. //#define Button_2 PORTBbits.RB14                       //Button 2 conected to RB14 pin
  14.         // the push button has an external pullup resistor, Normaly Open
  15.  
  16. #define LED_1    LATBbits.LATB7                         //Led 1 conected to RB9
  17. //#define LED_2  LATBbits.LATB5                         //Led 2 conected to RB8
  18. //------------------------------------//
  19. //*************************************************************//
  20. //#define USE_AND_OR  //used to compatibility,now the compiler use '&'(AND) instead of '|'(OR)
  21.  
  22.  #define FCY            16000000                                        // FCY = Fosc/2  Fosc=32MHz
  23.  #define FSCL       100000                              // Frequency Clock Rate in Hz
  24.                                                                                                 // 100KHz,400KHz,1MHz.
  25.  #define I2C1BRGval     ((FCY/FSCL)-(FCY/10000000)-1)
  26.  
  27.  
  28. #include<i2c.h>
  29. #include "retardo.h"
  30.  
  31. #define EEPROM_SIZE   32768
  32.  
  33. unsigned char ControlByte;      //Control Byte
  34.  
  35. unsigned char Data;            //Data Byte
  36. unsigned int ee_address;
  37.  
  38. //*************************************************************//
  39. int main(void)
  40. {
  41. //----- PORTS & Peripherals  Configuration              --------------//
  42.         AD1PCFG=0xFFFF;                                         // ALL PINS AS DIGITALS
  43.  
  44.         LATA=0;                                                         // Latch port
  45.         //LATB=0;                                                               //
  46.         //TRISB=0;                                                              // <-------------****????
  47.         TRISA=0;       
  48.  
  49.         delay_ms(1000);
  50. //******************************************************************
  51.  
  52.  
  53.  
  54.         ControlByte = 0xA0;     // Control byte 1010(A)  0000(0) wired address A2 A1 A0
  55.  
  56.         Data = 0x81;   //1000 0001
  57.  
  58.         CloseI2C1();
  59.         Nop();
  60.         Nop();
  61.         OpenI2C1( I2C_ON,I2C1BRGval);
  62.  
  63.         ee_address=0x7FFE;
  64.        
  65. //-------------main Program      ------------//
  66. while(1){                                       // (1) infinite loop
  67.                
  68.         StartI2C1();   //Send the Start Bit
  69.         IdleI2C1();      //Wait to complete
  70.  
  71.         MasterWriteI2C1(ControlByte);
  72.         IdleI2C1();      //Wait to complete
  73.  
  74.    while(I2C1STATbits.TBF);     //Wait till device id is transmitted
  75.  
  76.    while(I2C1STATbits.ACKSTAT);
  77.  
  78.         MasterWriteI2C1(ee_address>>8);
  79.         IdleI2C1();      //Wait to complete
  80.    while(I2C1STATbits.TBF);     //Wait till Haddress id is transmitted
  81.    while(I2C1STATbits.ACKSTAT);
  82.  
  83.         MasterWriteI2C1(ee_address & 0xFF);
  84.         IdleI2C1();      //Wait to complete
  85.  
  86.    while(I2C1STATbits.TBF);     //Wait till Laddress is transmitted
  87.  
  88.    while(I2C1STATbits.ACKSTAT);
  89.  
  90.         MasterWriteI2C1(Data);
  91.         IdleI2C1();      //Wait to complete
  92.    while(I2C1STATbits.TBF);     //Wait till data is transmitted
  93.    while(I2C1STATbits.ACKSTAT);
  94.  
  95.         StopI2C1();   //Send the Stop condition
  96.         IdleI2C1();   //Wait to complete
  97.  
  98.    while(I2C1CONbits.PEN);  //Wait till stop sequence is completed
  99.  
  100.    CloseI2C1();             //Disable I2C
  101.  
  102.  
  103. while(1); //loop here
  104.  
  105.                 }                                       //end while
  106.  
  107. }                                       //end main.
« Última modificación: 23 de Diciembre de 2010, 09:59:39 por AKENAFAB »

Desconectado gary_servin

  • PIC12
  • **
  • Mensajes: 65
Re: módulo i2c1 pic24FJ no me funciona correctamente.
« Respuesta #1 en: 23 de Diciembre de 2010, 13:56:10 »
Que tal AKENAFAB?

En el link del foro de microchip que pusiste recomiendan que hagas esto:
Citar
LATBbits.LATBx = 0;   //where LATBx = the SDAx pin
LATBbits.LATBx = 1;

    This must be done AFTER the module is enabled, and your TRISB must be set such that the SDAx pin is configured as an output


Saludos!


Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: módulo i2c1 pic24FJ no me funciona correctamente.
« Respuesta #2 en: 23 de Diciembre de 2010, 17:17:45 »
Que tal AKENAFAB?

En el link del foro de microchip que pusiste recomiendan que hagas esto:
Código: C
  1. LATBbits.LATBx = 0;   //where LATBx = the SDAx pin
  2. LATBbits.LATBx = 1;
  3.  
  4.     This must be done AFTER the module is enabled, and your TRISB must be set such that the SDAx pin is configured as an output

No me sirve  :cry:,ya probe eso y las demás propuestas sin resultado.
Lo raro es que yo uso la familia GB que segun no presenta el problema a diferencia de la GA.

Lo intentaré nuevamente y probaré el i2c2 para ver si este responde bien.

Saludos y gracias!!

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: módulo i2c1 pic24FJ no me funciona correctamente.
« Respuesta #3 en: 23 de Diciembre de 2010, 20:06:47 »
Pues el error que tengo no parece ser al mencionado en la serie 24FJGA.

Probe en el i2c2 y pasa exactamente lo mismo.

Ahora haciendo más pruebas con el TRISB y LATB. Recordemos que el i2c1 esta en RB9(SDA) y RB8 (SCL).

si escribo en el LATB , el modulo funciona perfecto , ya sea que escriba 0000's ó 1111's.

Si escribo en el registro TRISB=0, el modulo ya no funciona , no hay cambio de estado en los pines y permanecen en 0.
Si escribo en el registro TRISB=1,osea como entrada , el modulo no funciona.

YA probe combinacion de 00 RB9-RB8 ,01,10,11 en el TRISB y nada , no funciona.

Si elimino TRISB y lo hago bit a bit ,

Código: [Seleccionar]
TRISBbits.TRISB9=1;
TRISBbits.TRISB8=1;

Funciona correctamente.

Si lo hago con :
Código: [Seleccionar]
LATA=0; // Latch port

LATBbits.LATB8=1;
LATBbits.LATB9=1;

TRISA=0;
//TRISB=0; //
TRISBbits.TRISB9=0;
TRISBbits.TRISB8=0;

Funciona correctamente siempre que LAT correspondiente este a 1,sí LAT esta a 0 las lineas SDA y SCL estan a 0.

Porque será esto???
Por las pruebas que he realizado , al escribir en TRISB  se jode todo.
En el manual reference del i2c indica que el propio modulo se encarga de escribir los registros tris.

Como funciona TRISB=0;
y como funciona    TRISBbits.TRISXX=0/1;


TRISB=0; carga el valor 0 y lo escribe en TRISB , TRISBbits.TRISBX, usa la instruccion bset , osea solo modifica el bit.





Por ahora funciona , pero cuando lo quiera integrar con otros programas escribiendo en TRISB como que no me da confianza a que funcione >_< .

Saludos!
« Última modificación: 23 de Diciembre de 2010, 20:23:48 por AKENAFAB »

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: módulo i2c1 pic24FJ no me funciona correctamente.
« Respuesta #4 en: 23 de Diciembre de 2010, 20:39:11 »
Aqui realizo otra prueba.

No toco TRISB y envio un byte , esta se escribe correctamente.

Despues hago una pausa de 10us

Cargo el TRISB=0;

Intento la escritura pero como ven SDA=0 y SCL ya no se genera más.

Si quito el TRISB.

El modulo sigue funcionando.Se ve que envia la direcciona luego espera el ACK,la memoria responde , despues envío la direccion 7FF pero ya no hay ACK porque la memoria esta ocupada.Asi que hasta aqui todo bien.

Me esta jodiendo el i2c y sus berrinches con el TRIS


« Última modificación: 23 de Diciembre de 2010, 20:57:10 por AKENAFAB »

Desconectado Sferum

  • PIC10
  • *
  • Mensajes: 4
Re: módulo i2c1 pic24FJ no me funciona correctamente.
« Respuesta #5 en: 12 de Septiembre de 2011, 06:55:33 »
Hola a todos.

Estoy teniendo problemas con el PIC24FJ32GB002 y su dichoso modulo I2C. No hay forma que funcione correctamente.

Cada vez que le indico que realice un start ( StartI2C1() ) el modulo se queda pillado sin ejecutarlo nunca. Es mas, las salidas permanecen en triestado sin llegar al cero.

Habeis encontradoa lguna solucion? O algun codigo que fuencione que pueda probar en mi micro?

Muchas gracias

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: módulo i2c1 pic24FJ no me funciona correctamente.
« Respuesta #6 en: 12 de Septiembre de 2011, 09:31:46 »
pero porque haces el tris? Yo cuando hice mis pruebas el mismo i2c se encargaba de configurar los puertos de entrada/salida. Solo debias configurarlo antes de activar el modulo, y luego el mismo modulo se encarga de hacer el resto.

Desconectado Sferum

  • PIC10
  • *
  • Mensajes: 4
Re: módulo i2c1 pic24FJ no me funciona correctamente.
« Respuesta #7 en: 12 de Septiembre de 2011, 11:32:59 »
Yo en mi codigo no toco siquiera los tris. Y aun asi el I2C1 no funciona (como dije, comienza el start pero no termina, quedando el LSB de I2C1CON = 1)
Aun asi, volvere a verificar que no toco nignun tris.
Por otra parte, parece que el I2C2 si funciona


EDIT:

No puedo verificarlo al 100% porque no tengo un osciloscopio/analizador-logico a mano, pero parece que lo he podido solucionar (despues de 2 dias y una noche en vela).
Desactiva el JTAG en los configuration bits, y asegurate de que lo está. Yo creia que lo habia deshabilitado, pero no se que locura que al compilar en modo debug se me volvio a activar. Total, ya funcionan ambas patillas del I2C1 (... por ahora)
 :-/
« Última modificación: 12 de Septiembre de 2011, 14:12:19 por Sferum »

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: módulo i2c1 pic24FJ no me funciona correctamente.
« Respuesta #8 en: 12 de Septiembre de 2011, 14:12:29 »
Yo en mi codigo no toco siquiera los tris. Y aun asi el I2C1 no funciona (como dije, comienza el start pero no termina, quedando el LSB de I2C1CON = 1)
Aun asi, volvere a verificar que no toco nignun tris.
Por otra parte, parece que el I2C2 si funciona

Se supone que para este módelo de pic no deberia haber ese problema,igual leí en el foro microchip de otro modelo en el que el i2c2 funciona correctamente.

No se si ya has probado lo que realice y describi aquí.

Desde entonces no he hecho más pruebas.

Saludos!

Desconectado Sferum

  • PIC10
  • *
  • Mensajes: 4
Re: módulo i2c1 pic24FJ no me funciona correctamente.
« Respuesta #9 en: 12 de Septiembre de 2011, 14:24:47 »
Como dije no usaba los tris. Ahora que funciona el I2C1 he intentado lo que describias aqui, y es verdad, tan pronto toco TRISB deja de funcionar :S
¿No se suponia que el modulo tomaba el control?

Mi solucion:
Añade en al rutina de INI del I2C1, antes de habilitarlo estas dos lineas

   _TRISB8=1;
   _TRISB9=1;
« Última modificación: 12 de Septiembre de 2011, 14:30:54 por Sferum »

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: módulo i2c1 pic24FJ no me funciona correctamente.
« Respuesta #10 en: 12 de Septiembre de 2011, 16:18:47 »
Lo voy a probar.

¿Entonces ya quedo solucionado tu problema???

Desconectado Sferum

  • PIC10
  • *
  • Mensajes: 4
Re: módulo i2c1 pic24FJ no me funciona correctamente.
« Respuesta #11 en: 12 de Septiembre de 2011, 21:16:58 »
Si, muchas gracias. :)

Desconectado danifiguerola

  • PIC10
  • *
  • Mensajes: 24
Re: módulo i2c1 pic24FJ no me funciona correctamente.
« Respuesta #12 en: 25 de Agosto de 2015, 11:56:38 »
Hola, ya se que hace mucho de el último post pero tengo un problema con el I2C justo con un pic24fj64gb002.

Quiero conectar una eeprom y no hay manera

Código: [Seleccionar]
/*
 * File:   eeprom.c
 * Author: danielfiguerola
 *
 * Created on 24 / agost / 2015, 21:58
 */

#include <stdio.h>
#include <stdlib.h>
#include <p24FJ64GB002.h>
#define FCY 4000000UL               // Definir FCY (meitat de freqüencia del //rellotge (necessari per utilizar llibreria libpic per delays)
#include <libpic30.h>               // Llibreria amb funcions de retard
#include "lcd_control.c"            // Funcions control LCD
/*
 *
 */

#define eeprom_i2c_w    0xA1
#define eeprom_i2c_r    0xA0

/////// Paraules de configuració/////////

_CONFIG1 (JTAGEN_OFF & FWDTEN_OFF);                     //Mòdul JTAG deshabilitat (RB5-RB9 i/o digitals) i WDT desactivat
_CONFIG2 (POSCMOD_NONE & OSCIOFNC_ON & FNOSC_FRC);      //Oscil·lador primari desactivat, RA3 i/o digital, Oscil·lador FRC seleccionat
_CONFIG3 (SOSCSEL_IO);                                  //RA4 i RB4 i/o digitals
//_CONFIG4 (RTCOSC_LPRC);                                 //Es selecciona el LPRC intern com a rellotge de referència del mòdul RTCC


//// FUNCIONS/////

void i2c_stop()
{
    I2C2CONbits.PEN = 1;
    while (I2C2CONbits.PEN);   //Espera que finalitzi condició de start
    I2C2CONbits.RCEN = 0;
    I2C2STATbits.IWCOL = 0;
    I2C2STATbits.BCL = 0;
    _MI2C2IF = 0;
    //DelayuSec(10);
}

void inicialitzar_I2C()
{
    unsigned char a;

    I2C2BRG = 9;           //A 8MHZ correspon a 100kHz
    I2C2CONbits.I2CEN = 0; // Desactiva el modul
    I2C2CONbits.DISSLW = 1; // Desactiva el slew rate control
    _MI2C2IF = 0;
    I2C2CONbits.I2CEN = 1; // Actibva el modul i2c
    a = I2C2RCV;                //Buidar el registre
    i2c_stop();
}

void i2c_start()

    I2C2CONbits.ACKDT = 0;
    I2C2CONbits.SEN = 1;               //Activa condició de start
    while (I2C2CONbits.SEN);   //Espera que finalitzi condició de start
    __delay_us(2);
}

void i2c_restart()
{
    I2C2CONbits.RSEN = 1;
    while (I2C2CONbits.RSEN);
}

unsigned char escriure_byte_I2C(unsigned char dada8)
{

    while (I2C1STATbits.TBF);
    _MI2C2IF = 0;           //Esborra bandera d'interrupció
    I2C2TRN = dada8;         //Automàticament TBF = 1
    while (I2C2STATbits.TBF);   //Espera que finalitzi transmissió i rebre ACK
   
    while (I2C2STATbits.TRSTAT);
   // _MI2C2IF = 0;           //Esborra bandera d'interrupció
   // {
   //     return (0);
   // }
    //else
      //  return (1);
   if (I2C2STATbits.ACKSTAT == 1)
   {
      return(1);
   }
   return(0);
}

unsigned char rebre_byte_I2C ()
{
    unsigned char dada=0;

    _MI2C2IF = 0;           //Esborra bandera d'interrupció
    I2C2CONbits.RCEN = 1;
    while (I2C2STATbits.RBF);   //Espera que finalitzi transmissió
    _MI2C2IF = 0;           //Esborra bandera d'interrupció
    dada = I2C2RCV;
    return (dada);
}

void generar_ACK()
{
    I2C2CONbits.ACKDT = 0;
    I2C2CONbits.ACKEN = 1;
    while (I2C2CONbits.ACKEN);
   // while (_MI2C2IF !=1);   //Espera que finalitzi transmissió
   // _MI2C2IF = 0;           //Esborra bandera d'interrupció
}

void generar_NACK()
{
    I2C2CONbits.ACKDT = 1;
    I2C2CONbits.ACKEN = 1;
  //while (I2C2CONbits.ACKEN);
   // while (_MI2C2IF !=1);   //Espera que finalitzi transmissió
   // _MI2C2IF = 0;           //Esborra bandera d'interrupció
}


unsigned char escriure_word_i2c(unsigned int dada16)
{
    unsigned char dadaL, dadaH, fet;

    dadaL = (unsigned char) dada16&0x00FF;
    dadaH = (unsigned char) dada16>>8;

    fet = escriure_byte_I2C(dadaH);

    if (fet == 0)
    {
        fet = escriure_byte_I2C(dadaL);
    }
    else
        fet = 1;

    return (fet);
}

unsigned int rebre_word_i2c()
{
    unsigned int dada;
    unsigned char dadaL, dadaH;
   
    dadaH = rebre_byte_I2C ();
   
    generar_ACK();
   
    dadaL = rebre_byte_I2C ();
   
    generar_ACK();
   
    dada = dadaH <<8;
    dada = dada || dadaL;
   
    return (dada);
}

unsigned int rebre_ultim_word_i2c()
{
    unsigned int dada;
    unsigned char dadaL, dadaH;

    dadaH = rebre_byte_I2C ();

    generar_ACK();

    dadaL = rebre_byte_I2C ();

    generar_NACK();

    dada = dadaH <<8;
    dada = dada || dadaL;

    return (dada);
}


int main()
{
    unsigned char a=0, b=0, error=0;
    unsigned char buf[5];

   // AD1PCFG = 0xffff;           //Tots els ports digitals menys AN10 (RB14) analògic
   // TRISB = 0xE018;             //Com a entrada: RB2 (DS18B20), RB3 (TSL235R), RB4 (polsador)
                                //RB13 (pluviòmetre), RB14 (HIH-4010) i RB15 (anemòmetre)
                                //Com a sortida: RB0 (activa reg), RB5, RB7 (RS i E de LCD) i RB8, RB9, RB10
                                //i RB11 (dades LCD)

    _TRISB5 = 0;
    _TRISB7 = 0;
    _TRISB8 = 0;
    _TRISB9 = 0;
    _TRISB10 = 0;
    _TRISB11 = 0;

    ini_LCD_4bits();                            //Inicialitza LCD en mode 4 bits
    __delay_ms(1000);                           //Espera 1 segon

    escriure_txt("Hola");
    __delay_ms(2000);

    a = 32;
    b = 20;

    inicialitzar_I2C();


    LATBbits.LATB2 = 0;   //where LATBx = the SDAx pin
    LATBbits.LATB2 = 1;

    i2c_start();
    error = escriure_byte_I2C(eeprom_i2c_w);
    error = escriure_byte_I2C(0x00);
    error = escriure_byte_I2C(0x00);
    error = escriure_byte_I2C(32);

    if (error == 1)
    {
         escriure_txt("error");
    __delay_ms(2000);
    }

    i2c_stop();

    i2c_start();
    error = escriure_byte_I2C(eeprom_i2c_w);
    error = escriure_byte_I2C(0x00);
    error = escriure_byte_I2C(0x00);
    __delay_us(10);
    if (error == 1)
    {
         escriure_txt("error");
    __delay_ms(2000);
    }
    i2c_restart();
    error = escriure_byte_I2C(eeprom_i2c_r);
    a = rebre_byte_I2C ();

     if (error == 1)
    {
         escriure_txt("error");
    __delay_ms(2000);
    }
   
    generar_NACK();


    escriure_cmd (0x01);                    //Borrar LCD
    escriure_cmd(0x02);
    sprintf (buf, "%d", a);         //la humitat màxima
    escriure_txt(buf);//
    __delay_ms(3000);

    while(1);

}


No se. parece que no hace nada. Corre todo el programa y al final saca por el LCD un 0. Como si no hubiera escrito o leido en la eeprom (o ninguna de las dos cosas).

Me lo he mirado por todos los lados y no veo donde está mal. Ando muy perdido  :shock:

Gracias

Desconectado danifiguerola

  • PIC10
  • *
  • Mensajes: 24
Re: módulo i2c1 pic24FJ no me funciona correctamente.
« Respuesta #13 en: 25 de Agosto de 2015, 15:28:58 »
Solucionado  :-/

Tenia al revés lo de escribir y leer  :8}

Y un par de detalles más