Problem in reading the 2nd data from pcf8563 real time clock by i2c

  • Thread starter lolkc2
  • Start date
  • #1
3
0
Suppose the 2nd data can be read after the first data, but i need to restart the condition the only can read the 2nd data. By that, i have read the slave address again before the 2nd data has been read. So how should i solve it?
 

Answers and Replies

  • #2
berkeman
Mentor
58,141
8,184
Suppose the 2nd data can be read after the first data, but i need to restart the condition the only can read the 2nd data. By that, i have read the slave address again before the 2nd data has been read. So how should i solve it?
Welcome to the PF.

Why do you need to restart anything? Can't you just read the two data bytes out in order? Can you describe the problem in a bit more detail?

PCF8563 RTC I2C Slave datasheet -- http://www.nxp.com/documents/data_sheet/PCF8563.pdf


:smile:
 
Last edited:
  • #3
3
0
;/**
; * EXP 1
; *
; * This program displays the character '0' on one
; * of the seven segment displays.
; */

list p = 18f4520

include "p18f4520.inc"

CONFIG OSC = INTIO67
CONFIG PWRT = ON
CONFIG WDT = OFF
CONFIG DEBUG = ON, LVP = OFF

WriteSlaveAddr EQU b'10100010'
ReadSlaveAddr EQU b'10100011'
SecsAddr EQU 0x02
SecsData EQU b'01010000'
MinsAddr EQU 0x03
MinsData EQU b'01011001'
HoursAddr EQU 0x04
HoursData EQU b'00000010'

ORG 0

start
clrf TRISC
bsf TRISC,3
bsf TRISC,4

;/BAUD RATE
movlw b'00001001'
movwf SSPADD
nop
nop

;/SLEW RATE CONTROL
movlw b'00000000'
movwf SSPSTAT
nop
nop

;/ENABLE SERIAL PORT
movlw b'00101000'
movwf SSPCON1
nop
nop

;SET TIME
call i2c_start
movlw WriteSlaveAddr
call i2c_send
call check_ack
movlw SecsAddr
call i2c_send
call check_ack
movlw SecsData
call i2c_send
call check_ack
movlw MinsData
call i2c_send
call check_ack
movlw HoursData
call i2c_send
call check_ack
call i2c_restart
movlw WriteSlaveAddr
call i2c_send
call check_ack
movlw SecsAddr
call i2c_send
call check_ack
call i2c_restart
movlw ReadSlaveAddr
call i2c_send
call check_ack
call receive_mode
; call i2c_restart
call i2c_send
call check_ack
call receive_mode
; call i2c_restart
call i2c_send
call check_ack
call receive_mode
call send_nack
call i2c_stop

;/START CONDITION
i2c_start
bsf SSPCON2,SEN
call check
nop
nop
return

;/I2C SEND
i2c_send
movwf SSPBUF
call check
nop
nop
return

;/STOP CONDITION
i2c_stop
bsf SSPCON2,PEN
call check
nop
nop
bz ending
return

;/INTERRUPT
check
btfss PIR1,SSPIF
goto check
bcf PIR1,SSPIF
nop
nop
return

check_ack
btfsc SSPCON2,ACKSTAT
goto i2c_fail
nop
nop
return

i2c_restart
bsf SSPCON2,RSEN
call check
nop
nop
return

send_nack
bsf SSPCON2,ACKDT
bsf SSPCON2,ACKEN
call check
nop
nop
return

receive_mode
bsf SSPCON2,RCEN
call check
nop
nop
return

i2c_fail
call i2c_stop

ending
bra ending


END
 
  • #4
3
0
This is my code. If i didn't add the restart condition, the 2nd data cannot be read. But the data sheet mention that the data can be transfer continuous without any restart. So I need to figure out the problem. Is it any problem in my code?
 

Related Threads on Problem in reading the 2nd data from pcf8563 real time clock by i2c

Replies
1
Views
2K
  • Last Post
Replies
1
Views
2K
  • Last Post
Replies
6
Views
3K
  • Last Post
Replies
3
Views
2K
Replies
1
Views
2K
Replies
9
Views
3K
Replies
6
Views
5K
  • Last Post
Replies
11
Views
2K
  • Last Post
Replies
2
Views
7K
  • Last Post
Replies
2
Views
1K
Top