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

Click For Summary

Discussion Overview

The discussion revolves around the challenges of reading the second data byte from a PCF8563 real-time clock via I2C communication. Participants are exploring the necessity of restarting the I2C condition to successfully read the second byte, despite the datasheet suggesting that continuous data transfer is possible without a restart.

Discussion Character

  • Technical explanation
  • Debate/contested
  • Mathematical reasoning

Main Points Raised

  • One participant suggests that the second data can be read after the first, but they need to restart the condition to do so.
  • Another participant questions the need for a restart, asking if the two data bytes can simply be read in order and requesting more detail about the problem.
  • A participant shares their code, indicating that without the restart condition, the second data cannot be read, despite the datasheet stating that continuous transfer is possible.
  • There is a challenge to identify whether there is an issue in the provided code that prevents the second data from being read without a restart.

Areas of Agreement / Disagreement

Participants express differing views on the necessity of restarting the I2C condition to read the second data byte. The discussion remains unresolved regarding the correct approach to reading the data as per the datasheet's claims.

Contextual Notes

The discussion highlights potential limitations in understanding the I2C communication process with the PCF8563, including dependencies on the implementation in the provided code and interpretations of the datasheet.

lolkc2
Messages
3
Reaction score
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?
 
Engineering news on Phys.org
lolkc2 said:
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:
;/**
; * 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
 
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?
 

Similar threads

  • · Replies 2 ·
Replies
2
Views
3K
Replies
8
Views
2K
  • · Replies 68 ·
3
Replies
68
Views
6K
  • · Replies 8 ·
Replies
8
Views
2K
  • · Replies 26 ·
Replies
26
Views
2K
  • · Replies 10 ·
Replies
10
Views
4K
Replies
7
Views
3K
  • · Replies 12 ·
Replies
12
Views
2K
  • · Replies 5 ·
Replies
5
Views
4K
  • · Replies 15 ·
Replies
15
Views
4K