Autor Tema: No me funciona el I2c para lectura  (Leído 2407 veces)

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

Desconectado lfedericop

  • PIC10
  • *
  • Mensajes: 7
No me funciona el I2c para lectura
« en: 26 de Noviembre de 2010, 10:53:06 »
Que tal como les va, soy nuevo en el foro, hace un tiempo que ando buscando algun post de algo parecido y la verdad no encontre.
Tengo el siguiente problema, estoy trabajando con el pic 24fj128ga010 , con el pickit 3 y el MPLAB v8.56 en C30.
Tengo conectada una memoria 24LC64 y no la puedo leer, pero si la puedo escribir y borrar, la verdad ya no se que estoy haciendo mal,
Pongo las funciones a disposicion. (Estoy usando las librerias de microchip i2c.h)

Saludos


Código: C
  1. void initi2c(void)
  2. {
  3.  
  4.         unsigned int config2, config1;
  5.  
  6.         config1 = (I2C_ON | I2C_IDLE_CON | I2C_CLK_REL | I2C_IPMI_EN | I2C_10BIT_ADD
  7.                 | I2C_SLW_DIS | I2C_SM_DIS | I2C_GCALL_EN | I2C_STR_EN | I2C_ACK
  8.                 | I2C_ACK_EN | I2C_RCV_EN | I2C_STOP_EN | I2C_RESTART_EN | I2C_START_EN); //para escritura funca
  9.  
  10.         config2 = 0x4E;/* Baud rate is set for 100 Khz */      
  11.         //config2 = 0x12;/* Baud rate is set for 400 Khz */    
  12.  
  13.         /* Configure I2C for 10 bit address mode */
  14.         OpenI2C1(config1,config2);
  15.         //I2C1CON = 0x940F;
  16.         IdleI2C1();                                             //Ensure Module is Idle    
  17.     T1CON=0x8030;
  18.     TMR1=0;
  19.     while( TMR1< 100);
  20. }
[/color]

Código: C
  1. void HDByteSingleWriteI2C(unsigned char ControlByte, unsigned char HighAdd, unsigned char LowAdd, unsigned char data)//FUNCA
  2. {      
  3.         //unsigned char z;
  4.         //z=0; 
  5.  
  6.         initi2c();
  7.         StartI2C1();                                            //Generate Start COndition
  8.         delay_10us(10);
  9.         MasterWriteI2C1(ControlByte); //WriteI2C(ControlByte);                  //Write Control byte
  10.         IdleI2C1();
  11.         while(I2C1STATbits.ACKSTAT);            //ErrorCode = ACKStatus();              //Return ACK Status    
  12.         MasterWriteI2C1(HighAdd);
  13.         IdleI2C1();                                             //Write High Address
  14.         MasterWriteI2C1(LowAdd);                //Write Low Address
  15.         IdleI2C1();
  16.         //while(I2C1STATbits.ACKSTAT);          //Return ACK Status
  17.         while(!IFS1bits.MI2C1IF); //Wait for ninth clock cycle
  18.         IFS1bits.MI2C1IF = 0; //Clear interrupt flag
  19.         MasterWriteI2C1(data);  //Write Data
  20.         //while(I2C1STATbits.ACKSTAT); 
  21.         IdleI2C1();
  22.         StopI2C1();                                                     //Initiate Stop Condition
  23.         //while(I2C1CONbits.PEN);
  24.         //EEAckPolling(ControlByte);            //perform Ack Polling
  25.         delay_ms(8);
  26.         return;
  27. }
  28.  
  29. unsigned char lectura_memo(void)
  30. {
  31.         unsigned char direcalta, direcbaja, control_write, control_read;
  32.         unsigned char z;
  33.         direcalta = 0x00;
  34.         direcbaja = 0x06;
  35.         control_write = 0xA0;  
  36.         control_read = 0xA1;
  37.        
  38.         IdleI2C1();
  39.         StartI2C1();                                            //Generate Start COndition
  40.         delay_10us(10);
  41.         //while(!I2C1STATbits.S);                               //ESPERO QUE SE COMPLETE START
  42.         MasterWriteI2C1(0xA8);
  43.         while(I2C1STATbits.TBF);
  44.         IdleI2C1();
  45.         while(I2C1STATbits.ACKSTAT);            //ESPERO ACK
  46.         MasterWriteI2C1(0x00);
  47.         while(I2C1STATbits.TBF);
  48.         IdleI2C1();
  49.         while(I2C1STATbits.ACKSTAT);            //ESPERO ACK
  50.         MasterWriteI2C1(0x06);
  51.         while(I2C1STATbits.TBF);
  52.         IdleI2C1();
  53.         while(I2C1STATbits.ACKSTAT);            //ESPERO ACK
  54.         StartI2C1();
  55.         while (I2C1CONbits.RSEN);       // Wait until re-start condition is over//while(!I2C1STATbits.S);//ESPERO QUE SE COMPLETE START
  56.         MasterWriteI2C1(0xA9); 
  57.         IdleI2C1();
  58.         while(I2C1STATbits.ACKSTAT);
  59.         //while(!I2C1CONbits.RCEN ); //= 1;    
  60.         //while(!I2C1STATbits.RBF);
  61.         z = MasterReadI2C1();
  62.         IdleI2C1();
  63.         NotAckI2C1();
  64.         StopI2C1();                                                     //Initiate Stop Condition
  65.         IdleI2C1();
  66.         delay_ms(1);
  67.         return z;      
  68.        
  69. }
[/color]

Desconectado ablanco93

  • PIC10
  • *
  • Mensajes: 15
Re: No me funciona el I2c para lectura
« Respuesta #1 en: 29 de Noviembre de 2010, 11:47:45 »
Hola que tal, mira te voy a mostrar como fue que yo configure mi  modulo de I2C.
Código: [Seleccionar]

#define USE_AND_OR //USED FOR THE OpenI2C1 INSTRUCTION
#include<stdlib.h>                                 //ESTAS LIBRERIAS SON PARA VARIOS USOS EN EL PROGRAMA NO PARA LA CONFIGURACION
#include<string.h>                                    //
#include<stdio.h>                                     //
#define FCY 2000000UL //THIS IS FOR THE USE OF THE DELAY LIBRARY "libpic30.h"
#include<libpic30.h>
#include<i2c.h>                                         //LIBRERIA DEL I2C

unsigned int config1,config2;

void eeprom_ini() //FUNCION QUE INICIALIZA A LA MEMORIA EEPROM
{
/* Turn off I2C modules */
    CloseI2C1();    //Disbale I2C1 mdolue if enabled previously
config2 =(37); //CONFIGURE OF THE I2C1BRG REGISTER: 100KHZ
config1 =(I2C_ON | I2C_7BIT_ADD); //CONFIGURE OF THE I2C1CON REGISTER: I2C1 ENABLE, I2CADD IS 7 BIT ADDRESS
OpenI2C1(I2C1CON | config1,config2); //CONFIGURATION OF THE MICROCONTROLLER AS MASTER AND WITH VELOCITY OF 100KHZ (SLEW RATE DISABLED)
}

/*EL SIGUIENTE CODIGO LEERA UN BYTE DE LA MEMORIA*/

        IdleI2C1();         //WAIT TILL THE COMUNICATION BUS IS FREE
StartI2C1();          //COMUNICATION START!
    while(I2C1CONbits.SEN ); //WAIT TILL START CONDITION IS OVER

        IdleI2C1();        //WAIT TILL THE COMUNICATION BUS IS FREE
MasterWriteI2C1(0xA0);       //CONTROL BYTE TO WRITE
                                 
IdleI2C1(); //WAIT TILL THE COMUNICATION BUS IS FREE
MasterWriteI2C1(addr_alta); //*************** High byte of the eeprom address

IdleI2C1(); //WAIT TILL THE COMUNICATION BUS IS FREE
MasterWriteI2C1(addr_baja);                 //*************** low byte of the eeprom address

        IdleI2C1(); //WAIT TILL THE COMUNICATION BUS IS FREE
RestartI2C1();
while(I2C1CONbits.SEN); //WAIT TILL START CONDITION IS OVER

IdleI2C1(); //WAIT TILL THE COMUNICATION BUS IS FREE
MasterWriteI2C1(0xA1); //CONTROL BYTE TO READ

        IdleI2C1(); //WAIT TILL THE COMUNICATION BUS IS FREE
byte1=MasterReadI2C1(); //READ DE BUS

IdleI2C1();
NotAckI2C1();                                             //AQUI LE DICES A LA MEMORIA QUE YA NO TE MANDE DATOS.

IdleI2C1();
StopI2C1();



Es muy importante la instruccion IdleI2C1(); ya que te ayuda a que no haya colision de datos en el bus I2C.
Esto es un ejemplo asi muy rapido y basico de como seria leer un byte, ojala y te pueda servir

Desconectado lfedericop

  • PIC10
  • *
  • Mensajes: 7
Re: No me funciona el I2c para lectura
« Respuesta #2 en: 30 de Noviembre de 2010, 09:04:19 »
Ya lo estoy probando y te aviso como fue.
Te agradezco.

Desconectado lfedericop

  • PIC10
  • *
  • Mensajes: 7
Re: No me funciona el I2c para lectura
« Respuesta #3 en: 30 de Noviembre de 2010, 09:36:55 »
Lo estube probando y lo unico que logro que me devuelva es el byte de control.
La verdad no entiendo que estoy haciendo mal.
Voy a seguir intentando.
Muchas gracias

Desconectado lfedericop

  • PIC10
  • *
  • Mensajes: 7
Re: No me funciona el I2c para lectura
« Respuesta #4 en: 30 de Noviembre de 2010, 14:31:18 »
Encontre el problema use las librerias de esta nota de aplicacion y funciona como debe ser.

http://ww1.microchip.com/downloads/en/AppNotes/001079.zip

Muchas gracias

Desconectado lfedericop

  • PIC10
  • *
  • Mensajes: 7
Re: No me funciona el I2c para lectura
« Respuesta #5 en: 30 de Noviembre de 2010, 14:34:24 »
GRACIAS ablanco93.
Si la proxima te puedo ayudar en algo avisame.
Saludos