Leyendo un solo byte usando una interfaz de 3 hilos

0

Estoy tratando de comunicarme con DS1302 (RTC) usando P16f877A MCU. Intenté leer un solo registro (digamos Hora-registro) de DS1302 y poner su valor en un determinado PORT / LCD. Pero estoy haciendo algo mal porque cada vez que obtengo el mismo valor, es decir, 0x01 cuando leo fecha, hora, minutos o segundos etc.

Aquí es cómo estoy haciendo para leer el byte de RTC.

sbit EN at PORTC.B2;
sbit SCLK at PORTC.B3;
sbit SDI at PORTC.B4;
sbit SDO at PORTC.B5;

sbit EN_Direction at TRISC2_bit;
sbit SCLK_Direction at TRISC3_bit;
sbit SDI_Direction at TRISC4_bit;
sbit SDO_Direction at TRISC5_bit;

// SPI Initialization Fucntion

void SPI_init(void){

          INTCON |= 0xC0;     // GIE and PEIE enable
          SSPSTAT.SMP = 0;    // Sample at MIDDLE
          SSPSTAT.CKE = 1;    // Data send on Rising Edge
          SSPCON |= 0x21;    // Serial Port Enable, Idle state Clk is Low, Clock = Fosc/16 => 31 KBytes/sec
          SCLK_Direction=0;
          SDO_Direction =0;
          EN_Direction  =0;      // Output Ports
          SDI_Direction =1;
          EN  =   1;                
}

// ============== Main function =============

void main(){

           SPI_init();
           EN=0;                       // Active low signal
           SSPBUF = 0x85;         // Hour Address
           while(SSPSTAT.BF == 0);     // Adress Transmission not complete ? Stay here
           value=SSPBUF;               // Read to Clear BufferFullStatusBit
           while(SSPSTAT.BF == 0);     // Recieve byte not complete ? Stay here
           value=SSPBUF;               // Store the recieved Byte
           EN=1;                       // Fininsh Reading
           PORTB=value;                // Transfer byte to PORTB
}

El diagrama de tiempo de RTC es el siguiente

    
pregunta Nouman Tajik

2 respuestas

0

Sugeriría leer el registro de segundos y verificar si BIT-7 es 1 [CH]. Si es 1 [CH] tendrá que borrarlo, para que el DS1302 haga tictac.
Busque en la hoja de datos de "CLOCK HALT FLAG".

    
respondido por el anishkumar
0

Dos soluciones.

  1. Use el software SPI y cambie la dirección de los datos.

  2. Use una resistencia para aislar las líneas de miso y mosi. Miso a sdio directamente y mosi a sdio a través de una resistencia.

Note también que CE es activo alto.

    
respondido por el dannyf

Lea otras preguntas en las etiquetas