¿No se pueden leer los datos de I2C?

1

Estoy conectando DS1307 con PIC32MX795F512L usando biblioteca periférica . Puedo enviar datos pero no puedo recibirlos.

Código:

#include <plib.h>

#define BAUDRATE    115200
#define Fsck        100000
#define BRG         ((FPB/2/Fsck)-2)

#define FCY     66000000L
#define FPB     (FCY/2)

#pragma config POSCMOD=HS, FNOSC=PRIPLL 
#pragma config FPLLIDIV=DIV_3, FPLLMUL=MUL_18, FPLLODIV=DIV_1 
#pragma config FPBDIV=DIV_2, FWDTEN=OFF  
#pragma config FSOSCEN = OFF 
#pragma config ICESEL = ICS_PGx2

int main(int argc, char** argv)
{

 OpenUART1( UART_EN | UART_NO_PAR_8BIT | UART_1STOPBIT  , UART_RX_ENABLE | UART_TX_ENABLE, (FPB/16/BAUDRATE)-1 );
putsUART1("START\n");
int res;

OpenI2C2(I2C_EN, 163); // I2C channel Configuration

StartI2C2();

IdleI2C2();
MasterWriteI2C2(0xD0); 
Nop();
MasterWriteI2C2(0x01); 
Nop();
MasterWriteI2C2(0b00010011); 
Nop();
StopI2C2();

IdleI2C2(); 
StartI2C2();
IdleI2C2(); 
MasterWriteI2C2(0xD0);

Nop();
MasterWriteI2C2(0x01);
Nop();
StopI2C2();

RestartI2C2();
IdleI2C2();
MasterWriteI2C2(0xD1);
Nop();
MasterWriteI2C2(0x01);
IdleI2C2();
res = MasterReadI2C2();
Nop();
NotAckI2C2();
Nop();
StopI2C2();

 //converting to ASCII
unsigned char x,y,p1,p2;
x = res & 0x0F;
p1 = x | 0x30;
y = res & 0xF0;
y = y >> 4;
p2 = y | 0x30;

char value1[5] ;
char value2[5] ;
sprintf(value1,"%d",p1);
sprintf(value2,"%d",p2);
putsUART1(value1);
putsUART1(value2);
putsUART1("\n");


while(1)
{

}

return (EXIT_SUCCESS);
}

UART funciona bien y no hay colisión porque la función MasterWriteI2C2() devuelve -1 si hay colisión y devuelve 0 si no hay colisión y la transmisión de datos es exitosa & Recibí 0, eso significa que los datos se están transmitiendo, pero no sé por qué no puedo leerlos. Por favor ayuda.

EDITAR:

Resolví el problema al que me enfrentaba y ahora I2C está funcionando porque puedo ver que el valor recibido en el registro I2CRCV es el mismo que estoy enviando. Pero necesito enviar el valor a UART para el cual creo que necesito convertirlos a ASCII, pero después de convertir los valores cambiarán. Digamos que he establecido un valor de 13 en el registro de segundos, entonces su valor cambiará durante la conversión, entonces, ¿cómo puedo configurar el valor de RTC? Necesito crear una lógica para poder establecer el valor RTC desde UART. Por favor ayuda!

    
pregunta user007

1 respuesta

1

No revisé tu código, pero surge un problema obvio de inmediato.

No usas un UART para hacer IIC. Tenga en cuenta que "A" en UART significa "asíncrono", que IIC definitivamente no lo es.

Para hacer IIC, use el periférico IIC o hágalo todo en firmware. En realidad, es bastante fácil cuando eres el maestro, ya que eres el dueño del reloj.

    
respondido por el Olin Lathrop

Lea otras preguntas en las etiquetas