Problemas con I2C en PIC18F25K22

0

He estado buscando en Google por aproximadamente dos semanas y todavía no puedo hacer funcionar mi I2C. He usado esto (lo que parece estar completo) tutorial . Seguí los ejemplos de escritura maestra y lectura maestra para probar y leer desde mi sensor . He hecho referencia al I2C_MASTER.zip y I2C_SLAVE.zip desde el sitio de Microchip, y mi I2C todavía no funciona. ¿Puedo obtener algunos consejos?

Más información:

  • SDA, SCL conectado a SIC1 / SCL1 de PIC18F, configurado para drenaje abierto y cableado para suministrar voltaje
  • Intenté diferentes enfoques con IdleI2C1 () y EEAckPolling1 (dirección) sin progreso
  • Siguió el ejemplo de Microchip de verificar el bit de colisión, pero aún no funciona
  • Usando i2c.h del compilador XC8
  • SSP1ADD está configurado en 19, pero tal vez no esté bien. Tengo mi reloj funcionando a 8 Mhz con el oscilador interno, y obtuve ese valor usando Fclock = Fosc / ((SSPxADD + 1) * 4), donde Fclock es de 100 kHz y Fosc es de 8 Mhz
  • No tengo un osciloscopio para ver señales

¿Alguien sabe de alguna biblioteca que pueda usar fácilmente para leer y escribir sin preocuparme por las señales Ack / Nack?

Aquí está el código relevante:

void init()
{
    CloseI2C1();
    OpenI2C1(MASTER,SLEW_OFF);
    SSP1ADD = 19;

    getEEPROM();
}

void getEEPROM()
{
    static signed char status,data;
    IdleI2C1();
    StartI2C1();
    while(SSPCON2bits.SEN);
    do{
        status = WriteI2C1(MLX_EEPROM_WRITE);// Signal to EEPROM start point
        if(status == -1)
        {
            data = SSPBUF;
            SSPCON1bits.WCOL = 0;
        }
    }while(status!=0);
    IdleI2C1();
    do{
        status = WriteI2C1(0x00);// Signal to EEPROM start point
        if(status == -1)
        {
            data = SSPBUF;
            SSPCON1bits.WCOL = 0;
        }
    }while(status!=0);
    IdleI2C1();
    RestartI2C(); 
    do{
        status = WriteI2C1(MLX_EEPROM_READ);// Signal to EEPROM start point
        if(status == -1)
        {
            data = SSPBUF;
            SSPCON1bits.WCOL = 0;
        }
    }while(status!=0);
    IdleI2C1();
    getsI2C1(eepromData,255);
    /* // supposed to be the same as getsI2C1
    for(i = 0; i < 256; i++)
    {
        eepromData[i] = ReadI2C1();
        IdleI2C1();
    }
   */
    NotAckI2C();
    while ( SSPCON2bits.ACKEN );
    StopI2C();
    while ( SSPCON2bits.PEN );
}
    
pregunta WayneDinh

1 respuesta

1

Comience de manera simple, vea si puede obtener un acuse de recibo desde el dispositivo y continúe. Aquí hay un código de trabajo de un pic18f87j50.

void InitEEprom(void) {
    TRISDbits.TRISD6 = 0;
    TRISDbits.TRISD5 = 1;
    OpenI2C2(MASTER, SLEW_OFF);
    SSP2ADD = 0x36;
}

int FindDevice(unsigned char Control) {
    unsigned int ErrorCode;
    IdleI2C2(); //Ensure Module is Idle
    StartI2C2(); //Generate Start COndition
    SSP2BUF = Control;
    //WriteI2C2(Control); //Write Control byte
    IdleI2C2();
    ErrorCode = ACKStatus();
    StopI2C2();
    return ErrorCode; //Return ACK Status
}
    
respondido por el Erik Friesen

Lea otras preguntas en las etiquetas