Estoy interactuando DS1307
con PIC32MX795F512L
el 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 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.
OpenI2C2
etc. es el código I2C.13
un valor en seconds
el registro, luego su valor cambiará durante la conversión, entonces, ¿cómo puedo establecer el valor RTC? Estoy confundido.!
taxis
usuario007
Damián
usuario007
efox29
usuario007