¿No puede leer datos de I2C?

Estoy interactuando DS1307con PIC32MX795F512Lel uso de la 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 y he recibido 0, eso significa que se están transmitiendo datos pero no sé por qué no puede volver a leer los datos. Por favor ayuda.

EDITAR:

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

No entiendo: "Puedo enviar datos pero no puedo recibirlos. Estoy recibiendo los datos en UART, así que también los estoy convirtiendo a ASCII, recibo 48, que es 0". ¿Recibes los datos en UART? ¿Y tú no en I2C?
Quiero decir que estoy tratando de obtener datos de I2C y luego transmitirlos en serie, pero en serie recibo 0
¿Miró en un osciloscopio si había datos en la línea SDA? Los datos enviados me parecen correctos, entonces podría provenir de un problema diferente: 1) Tiempo, su nop puede no ser suficiente. Hay una función dada por el microchip para esperar hasta que el I2C se haya iniciado o el I2C esté INACTIVO, etc. 2) El hardware, que puede provenir de las resistencias en la línea I2C. Además, no entiendo por qué no reconoces I2C al final de la lectura.
No tengo osciloscopio, así que no puedo comprobarlo. Anteriormente, estaba usando IdleI2C(), que espera a que el bus esté inactivo, pero seguía siendo el problema, así que pensé en usar Nop(). En el hardware, hay resistencias de 1k en la línea I2C.
@ user007 Parece que esta pregunta debería cerrarse ya que dijo que la resolvió. Si tiene otra pregunta, cree una nueva pregunta. No agregue temas no relacionados en la misma pregunta.
claro, haré una nueva pregunta. No se como cerrar esta pregunta. No vienen opciones. Gracias

Respuestas (1)

No me metí en tu código, pero surge un problema obvio de inmediato.

No usa un UART para hacer IIC. Tenga en cuenta que la "A" en UART significa "asincrónico", que definitivamente no es IIC.

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

Creo que la mención del funcionamiento de UART es cómo se devuelve la información de depuración, parece que el OpenI2C2etc. es el código I2C.
... a menos que el dispositivo intente estirar el reloj.
Resolví el problema al que me enfrentaba y ahora I2C funciona, ya que puedo ver que el valor recibido en el registro I2CRCV es el mismo que estoy enviando. Pero necesito enviar el valor a UART por lo que creo que necesito convertirlos a ASCII pero después de convertir los valores cambiarán. Digamos que he establecido 13un valor en secondsel registro, luego su valor cambiará durante la conversión, entonces, ¿cómo puedo establecer el valor RTC? Estoy confundido.!