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 );
}