I2C2 no está leyendo: PIC24

0

Estoy intentando usar I2C2 en mi PIC24FJ64GA002 para leer y escribir en un CAP1188 y no puedo hacer que ninguna de las funciones funcione. Estoy probando la función de escritura al desvincular el LED de las salidas del sensor y aumentarlas o disminuirlas. Estoy intentando probar la función de lectura leyendo el registro 0xFD que tiene el ID del producto, pero cuando controlo el búfer I2C2RCV siempre es 0. Se agradecerá cualquier ayuda, ¡gracias! Edit: Conseguí que ambos trabajaran, ¡pero me imagino que pondré el código de trabajo si alguien más está teniendo problemas! a veces solo se aleja por un tiempo y vuelve a mirar el código para encontrar sus errores :)

void initChip(){
  CLKDIVbits.RCDIV = 0;
  AD1PCFG = 0x9FFE;
  I2C2CON = 0;
  TRISBbits.TRISB3 = 0;
  TRISBbits.TRISB2 = 0;
  I2C2BRG = 157;
  I2C2CONbits.I2CEN = 1;
  _MI2C2IF = 0;
 }

void chipWrite(unsigned char reg, unsigned char data){
  //Start bit
  I2C2CONbits.SEN = 1;
  while(I2C2CONbits.SEN);
  IFS3bits.MI2C2IF = 0;

  //Slave address bit
  I2C2TRN = 0b01010000;
  while(!IFS3bits.MI2C2IF);
  IFS3bits.MI2C2IF = 0;

  //Register address
  I2C2TRN = reg;
  while(!IFS3bits.MI2C2IF);
  IFS3bits.MI2C2IF = 0;

  //Data
  I2C2TRN = data;
  while(!IFS3bits.MI2C2IF);
  IFS3bits.MI2C2IF = 0;

  //Stop bit
  I2C2CONbits.PEN = 1;
  IFS3bits.MI2C2IF = 0;
  while(I2C2CONbits.PEN);
 }

unsigned char chipRead(unsigned char reg){   
  unsigned char msb = 0;

  /*configure i2c to send ACK*/   
  I2C2CONbits.ACKDT = 0;  

  /*start*/   
  I2C2CONbits.SEN = 1;   
  while(I2C2CONbits.SEN);

  /*sensor address*/   
  I2C2TRN = 0b01010000;   
  while(I2C2STATbits.TBF);   
  while(I2C2STATbits.TRSTAT);
  while(I2C2STATbits.ACKSTAT);

  /*Register for reading*/   
  I2C2TRN = reg;   
  while(I2C2STATbits.TBF);  
  while(I2C2STATbits.TRSTAT);
  while(I2C2STATbits.ACKSTAT);

  /*repeated start*/   
  I2C2CONbits.RSEN = 1;   
  while(I2C2CONbits.RSEN);

  /*Slave address with read=1*/
  I2C2TRN = 0b01010001;   
  while(I2C2STATbits.TBF); 
  while(I2C2STATbits.TRSTAT);
  while(I2C2STATbits.ACKSTAT);

  /*receiver enabled*/   
  I2C2CONbits.RCEN = 1;

  /*read first byte data*/   
  while(!I2C2STATbits.RBF);   
  msb = I2C2RCV;   

  /*configure i2c to send nack*/    
  I2C2CONbits.ACKDT = 1;   
  /*send nack*/   
  I2C2CONbits.ACKEN = 1;
  while(I2C1CONbits.ACKEN);

  /*send stop*/   
  I2C2CONbits.PEN = 1;   
  while(I2C2CONbits.PEN);
  I2C2CONbits.I2CEN = 0;

  return msb; 
}

int main(void) {
initChip();
char key = 0b00000000;
chipWrite(0x72,0xFF);
//chipWrite(0x74, 0b01011000);

while(1){
    key = chipRead(0xFD);
    asm("nop");
    if(key == 0b01010000){
        asm("nop");
    }
}

return 0;
}
    
pregunta vazqu133

0 respuestas

Lea otras preguntas en las etiquetas