Σελίδα 1 από 2 1 2 ΤελευταίαΤελευταία
Εμφάνιση αποτελεσμάτων : 1 έως 10 από 11

Θέμα: I2C Interface

  1. #1
    Μέλος Το avatar του χρήστη cdesp
    Όνομα
    Χρήστος
    Εγγραφή
    Sep 2009
    Περιοχή
    Κιλκις
    Μηνύματα
    253

    Προεπιλογή I2C Interface

    Καλησπέρα,

    προσπαθώ να επικοινωνήσω με ένα DS1307 μέσω I2C χρησιμοποιώντας το PCA9665 για την επικοινωνία. Ενώ οι παλμοί που βγάζει το εν λόγω ολοκληρωμένο φαίνεται ότι είναι οι σωστοί το DS1307 δεν στέλνει το ACK bit μετά την αποστολή της διευθυνσής του ενώ όταν το συνδέω σε Arduino το στέλνει.
    Παρακάτω παραθέτω τους παλμούς από το PCA9665 και από το Arduino.

    PCA9665
    PCA9665.png

    Arduino
    Arduino.png

    Έχω τροφοδοτήσει το DS1307 με 3.3V και με 5V με ακριβώς το ίδιο αποτέλεσμα. Επίσης έχω βάλει pullup στα SDA Και Scl από 1Κ2 έως 10Κ ohm και με 3.3V και με 5V το αποτέλεσμα δεν αλλάζει. Η ταχύτητα που χρησιμοποιεί το Arduino είναι 100Khz ενώ το PCA γύρω στα 98.

    Αν κάποιος έχει καμιά ιδέα τι μπορεί να φταίει.

    0 Not allowed! Not allowed!

  2. #2
    Μέλος Το avatar του χρήστη SProg
    Όνομα
    Σάββας
    Εγγραφή
    Mar 2014
    Περιοχή
    Θεσσαλονίκη
    Μηνύματα
    2.612

    Προεπιλογή

    To start bit δεν φαίνεται να ξεκινάει σωστά, επίσης δεν είναι ξεκάθαρες οι κλίμακες του χρόνου..

    Ανέβασε και το κώδικα που γράφεις.

    0 Not allowed! Not allowed!
    Τελευταία επεξεργασία από το χρήστη SProg : 16-02-21 στις 22:45

  3. #3
    Μέλος Το avatar του χρήστη cdesp
    Όνομα
    Χρήστος
    Εγγραφή
    Sep 2009
    Περιοχή
    Κιλκις
    Μηνύματα
    253

    Προεπιλογή

    update
    Νομίζω βρήκα ένα πιθανό πρόβλημα. Σε έλεγχο που έκανα με τον παλμογράφο το SDA κινείται μεταξύ 0.7v και 4v. Το 0.7 είναι το κατόφλι για το 0 στο i2c οπότε ίσως να φταίει αυτό. To scl κατεβαίνει μέχρι το 0.4V. Πώς μπορώ να κατεβάσω το 0.7v ώστε να είναι μέσα στις προδιαγραφές του i2c;


    -----
    Το Ds1307 έχει και δεύτερη συσκευή i2c στην διεύθυνση 0χ50 η οποία λειτουργεί κανονικά (εννοώ κάνει acknowledge). Η συσκευή πιθανόν να είναι κάποια Eprom.

    και ο κώδικας για τον έλεγχο του pca9665
    Κώδικας:
    ;---------- I2C PCA9665 ROUTINES -----------------
    
    
    I2C_RDSTAT_WT:    IN A,(DI2C_CON)        ;READ CONTROL REGISTER BIT 3 IS SI
            BIT 3,A            ;CHECK BIT 3 SI
            JR Z,I2C_RDSTAT_WT    ;BIT 3 SHOULD BE SET IF VALID STATUS
            IN A,(DI2C_STA)        ;VALID HERE
            RET
            
    I2C_RDSTAT_NW:    IN A,(DI2C_CON)        ;READ CONTROL REGISTER BIT 3 IS SI
            BIT 3,A            ;CHECK BIT 3 SI
            LD A,$FF        ;$FF=INVALID STATUS
            RET Z            ;BIT 3 SHOULD BE SET IF VALID STATUS
            IN A,(DI2C_STA)        ;VALID HERE
            RET
    
    
    
    
    I2C_INIT:    LD A,I2CADR
            OUT (DI2C_INDPTR),A
            LD A,$E0
            OUT (DI2C_INDIR),A  ;SET MY SLAVE ADDR
    
    
            LD A,$40        ;INIT
            OUT (DI2C_CON),A    ;
            LD B,250
            CALL DELAYMICRO
            LD B,250
            CALL DELAYMICRO        ;DELAY 500 MICROSECS
            ;SET SPEED MODE
            ;MODE     0x00, 0x9D, 0x86    STANDARD
            ;    0x01, 0x2C, 0x14    FAST
            ;    0x02, 0x011, 0x09    FAST+
            LD A,I2CMODE
            OUT (DI2C_INDPTR),A    ;SELECT I2CMODE REGISTER
            LD A,0            ;SELECT MODE 0
            OUT (DI2C_INDIR),A
            LD A,I2CSCLL
            OUT (DI2C_INDPTR),A    ;SELECT I2CMODE REGISTER
            LD A,$9D        ;SELECT CLK L
            OUT (DI2C_INDIR),A
            LD A,I2CSCLH
            OUT (DI2C_INDPTR),A    ;SELECT I2CMODE REGISTER
            LD A,$86        ;SELECT CLK H
            OUT (DI2C_INDIR),A
    
    
            RET
    
    
    
    
    ;D = ADDR OF DEVICE
    ;HL BUFFER ADDRESS
    ;BC BYTE COUNT
    I2C_WRITE:
    I2C_WR_BYTE:     LD A,$60        ;START
              OUT (DI2C_CON),A
    WRB_LP1:    CALL I2C_RDSTAT_WT     ;WAIT FOR INTERRUPT SI=1
            LD E,A            ;SAVE STATUS
            CP MASTER_START_TXed    ;A HAS THE STATUS
            JR Z,WRB_S1
            CP MASTER_RESTART_TXed
            JR Z,WRB_S1
            CP MASTER_DATA_W_ACK
            JR Z,WRB_S2
            CP MASTER_SLA_W_ACK
            JR Z,WRB_S3
            CP MASTER_SLA_W_NAK
            JR Z,WRB_EXIT
            CP MASTER_DATA_W_NAK
            JR Z,WRB_EXIT
            CP MASTER_ARB_LOST
            RET Z
            CP SLAVE_AL_ADDRESSED_R
            RET Z
            CP SLAVE_AL_ADDRESSED_W
            RET Z
            CP SLAVE_GENERALCALL_AL 
            RET Z
            RET
    
    
    WRB_S1:        LD A,D             ;DEVICE ADDR
            SLA A
            AND $FE            ;ADDR+WRITE ON D0=0
            OUT (DI2C_DAT),A        
            LD A,$40
              OUT (DI2C_CON),A        
            JR WRB_LP1
    WRB_S2:        DEC BC
    WRB_S3:        LD A,B
            OR C
            JR Z,WRB_EXIT
            LD A,(HL)
            INC HL
            OUT (DI2C_DAT),A
            LD A,$40
              OUT (DI2C_CON),A
            JR WRB_LP1    
    
    
    WRB_EXIT:    LD A,$50        ;STOP
              OUT (DI2C_CON),A
            LD A,B
            OR C
            RET  ;IF A NOT ZERO THEN ERROR        
    
    
    ;D DEVICE ADDR
    ;HL BYTE BUFFER
    ;BC BYTE COUNT
    I2C_READ:    
    I2C_RD_BYTE:    LD A,B
            OR C
            RET Z    ;RETURN IF ZERO BYTE COUNT
            LD A,$60
              OUT (DI2C_CON),A
    RDB_LP1:    CALL I2C_RDSTAT_WT     ;WAIT FOR INTERRUPT SI=1
            LD E,0
            CP MASTER_START_TXed
            JR Z,RDB_S1
            MASTER_RESTART_TXed
            JR Z,RDB_S1
            CP MASTER_DATA_R_NAK
            JR Z,RDB_S2
            CP MASTER_DATA_R_ACK
            JR Z,RDB_S3
            CP MASTER_SLA_R_ACK
            JR Z,RDB_S4
            CP MASTER_SLA_R_NAK
            JR Z,RDB_EXIT
            CP MASTER_ARB_LOST
            RET Z
            CP SLAVE_AL_ADDRESSED_R
            RET Z
            CP SLAVE_AL_ADDRESSED_W
            RET Z
            CP SLAVE_GENERALCALL_AL 
            RET Z
            RET        
    
    
    
    
    RDB_S1:        LD A,D             ;DEVICE ADDR
            SLA A
            OR $01            ;ADDR + READ COMMAND
            OUT (DI2C_DAT),A
            LD A,$40
              OUT (DI2C_CON),A
            JR RDB_LP1
    RDB_S2:        LD E,1            ;MEANS WE EXIT
    RDB_S3:        IN A,(DI2C_DAT)        ;READ DATA
            LD (HL),A
            INC HL
            DEC BC            
    RDB_S4:        LD A,B            ; IS LENGTH 0
            OR C
            JR Z,RDB_EXIT    
            LD A,E
            CP 1
            JR Z,RDB_EXIT    
            LD A,B
            ADD C
            CP 1
            LD A,$40    
            JR Z,RDB_NXT1
            LD A,$C0
    RDB_NXT1:    OUT (DI2C_CON),A      ;WRITE $40 IF BYTE COUNT BC=1 ELSE WRITE $C0    
            JR RDB_LP1
    
    
    RDB_EXIT:    LD A,$50
              OUT (DI2C_CON),A
            LD A,B
            OR C
            RET  ;IF A NOT ZERO THEN ERROR    
    
    
    
    
        
    
    
    
    
    
    
    ;---------- I2C PCA9665 ROUTINES END-----------------

    0 Not allowed! Not allowed!
    Τελευταία επεξεργασία από το χρήστη cdesp : 17-02-21 στις 11:10

  4. #4
    Μέλος Το avatar του χρήστη SProg
    Όνομα
    Σάββας
    Εγγραφή
    Mar 2014
    Περιοχή
    Θεσσαλονίκη
    Μηνύματα
    2.612

    Προεπιλογή

    Πως το βρήκες το 0.7V; Tι αντιστάσεις pull-up έχεις βάλει;

    0 Not allowed! Not allowed!

  5. #5
    Μέλος Το avatar του χρήστη cdesp
    Όνομα
    Χρήστος
    Εγγραφή
    Sep 2009
    Περιοχή
    Κιλκις
    Μηνύματα
    253

    Προεπιλογή

    Update 2

    Ο κώδικας δεν έχει λάθος.
    Έχοντας πάνω το logic analyser και τον παλμογράφο και βάζοντας δυο πυκνωτές γύρω στα 66-100pf και δυο αντιστάσεις στα 600ohm το i2c λειτουργεί, όχι πάντα αλλά τουλάχιστον μια στις 4 λειτουργεί κανονικά και στέλνω όλα τα bytes (9 συνολικά). Άλλες φορές στέλνει λιγότερα πριν βγάλει λάθος.
    οπότε μένει να βρώ τις κατάλληλες αντιστάσεις και πυκνωτές για να λειτουργήσει...

    0 Not allowed! Not allowed!

  6. #6
    Συντονιστής Το avatar του χρήστη nestoras
    Όνομα
    Παναγιώτης
    Εγγραφή
    Feb 2006
    Περιοχή
    Ξάνθη
    Μηνύματα
    4.615

    Προεπιλογή

    Παράθεση Αρχικό μήνυμα από cdesp Εμφάνιση μηνυμάτων
    Update 2

    Ο κώδικας δεν έχει λάθος.
    Έχοντας πάνω το logic analyser και τον παλμογράφο και βάζοντας δυο πυκνωτές γύρω στα 66-100pf και δυο αντιστάσεις στα 600ohm το i2c λειτουργεί, όχι πάντα αλλά τουλάχιστον μια στις 4 λειτουργεί κανονικά και στέλνω όλα τα bytes (9 συνολικά). Άλλες φορές στέλνει λιγότερα πριν βγάλει λάθος.
    οπότε μένει να βρώ τις κατάλληλες αντιστάσεις και πυκνωτές για να λειτουργήσει...
    Αν ισχύει αυτό που έγραψες ποιο πριν με το οριακό threshold για το logic low τότε υπάρχει πρόβλημα με το hardware ή με τις καλωδιώσεις ή με την πλακέτα. Στο I2C κοιτάμε να αποφύγουμε τις χωρητικότητες κι εσύ λες ότι προσθέτεις χωρητικότητα για να φτιάξεις το πρόβλημα. Που ακριβώς τις προσθέτεις? Οι ισχυρές pull-up θεωρώ ότι κάνουν χειρότερο το πρόβλημα στο "LOW". Είναι εύκολο να δείξεις το κομμάτι του σχηματικού καθώς επίσης και όλο το I2C bus αλλά και το είδος των περιφερειακών σου?

    0 Not allowed! Not allowed!
    FreeBsD For Ever

  7. #7
    Μέλος Το avatar του χρήστη cdesp
    Όνομα
    Χρήστος
    Εγγραφή
    Sep 2009
    Περιοχή
    Κιλκις
    Μηνύματα
    253

    Προεπιλογή

    Το κύκλωμα είναι πολύ απλό:
    i2c_schema.png

    με pullup 10k στα 3.3V χωρίς πυκνωτές το είχα στην αρχή.
    Αφού δεν δούλευε έβγαλα τις αντιστάσεις και τώρα τις έχω σε breadboard για να μπορώ να τις αλλάζω, έχω δοκιμάσει από 330ohm έως 4k7 στα 5v.

    Τους πυκνωτές 66pf τους έβαλα ίσως από παρανόηση λόγω αυτού του σχεδίου :
    BusSetup.gif
    https://www.i2c-bus.org/i2c-primer/t...i2c-bus-setup/

    Πιθανόν το Cp που φαίνεται εκεί να είναι το φορτίο που έχουν τα καλώδια από μόνα τους.

    0 Not allowed! Not allowed!

  8. #8
    Συντονιστής Το avatar του χρήστη nestoras
    Όνομα
    Παναγιώτης
    Εγγραφή
    Feb 2006
    Περιοχή
    Ξάνθη
    Μηνύματα
    4.615

    Προεπιλογή

    Παράθεση Αρχικό μήνυμα από cdesp Εμφάνιση μηνυμάτων
    Το κύκλωμα είναι πολύ απλό:
    i2c_schema.png

    με pullup 10k στα 3.3V χωρίς πυκνωτές το είχα στην αρχή.
    Αφού δεν δούλευε έβγαλα τις αντιστάσεις και τώρα τις έχω σε breadboard για να μπορώ να τις αλλάζω, έχω δοκιμάσει από 330ohm έως 4k7 στα 5v.

    Τους πυκνωτές 66pf τους έβαλα ίσως από παρανόηση λόγω αυτού του σχεδίου :
    BusSetup.gif
    https://www.i2c-bus.org/i2c-primer/t...i2c-bus-setup/

    Πιθανόν το Cp που φαίνεται εκεί να είναι το φορτίο που έχουν τα καλώδια από μόνα τους.
    Τη χωρητικότητα στο I2C την αποφεύγουμε γενικά. Πχ, το πόσο μακρυά μπορεί να παίξει το bus καθορίζεται από τη μέγιστη χωρητικότητα του bus (περίπου 400pF). Θα κοιτάξω τα σχηματικά και θα απαντήσω πιο αργά αν βρω κάποιο πιθανό σφάλμα.

    0 Not allowed! Not allowed!
    FreeBsD For Ever

  9. #9
    Μέλος Το avatar του χρήστη cdesp
    Όνομα
    Χρήστος
    Εγγραφή
    Sep 2009
    Περιοχή
    Κιλκις
    Μηνύματα
    253

    Προεπιλογή

    Μετά από πολλές δοκιμές τελικά κατάφερα να το κάνω να δουλέψει. Αν και θα ήθελα κάτι πιο απλό παραθέτω το σχηματικό της λύσης:
    I2C_CON_WORKING.png

    Το DS1307 συνδέεται σε 5v, όπως και οι Pull-Up resistors.

    Τώρα αν χρειαστεί να συνδέσω και καμιά άλλη συσκευή i2c π.χ. καμιά lcd 16x2 με i2c Interface ελπίζω να λειτουργήσει χωρίς προβλήματα.

    0 Not allowed! Not allowed!

  10. Ένα μέλος ευχαρίστησε τον cdesp για αυτό το χρήσιμο μήνυμα:

    Panoss (17-02-21)

  11. #10
    Μέλος Το avatar του χρήστη cdesp
    Όνομα
    Χρήστος
    Εγγραφή
    Sep 2009
    Περιοχή
    Κιλκις
    Μηνύματα
    253

    Προεπιλογή

    Καλησπέρα,

    Έχω συνδέσει εκτός από το ds1307 RTC και μια LCD 16x2 με I2C addon. Διαβάζω ημερομηνία και ώρα από το DS1307 και την τυπώνω στην LCD Οθόνη καθώς και στην LCD16x2 μέσω I2C.
    Εδώ το βίντεο: https://www.youtube.com/watch?v=I_7u3WERX_o

    Για την σύνδεση της LCD16x2 έπρεπε να βάλω δυο αντιστάσεις 100Ω, όπως και στο DS1307, ανάμεσα στα SDA,SCL. Εδώ όμως λειτυργεί και χωρίς τους πυκνωτές των 33uf.

    0 Not allowed! Not allowed!

Σελίδα 1 από 2 1 2 ΤελευταίαΤελευταία

Παρόμοια Θέματα

  1. Bus interface
    By p_stama in forum Διάφορα Κυκλώματα
    Απαντήσεις: 4
    Τελευταίο Μήνυμα: 04-06-14, 12:45
  2. interface
    By p_stama in forum Αυτοματισμοί
    Απαντήσεις: 8
    Τελευταίο Μήνυμα: 20-02-12, 14:43
  3. Interface 5V -> 2.0V~2,7V
    By PsychotIC_N4n0b0t in forum Γενικά
    Απαντήσεις: 6
    Τελευταίο Μήνυμα: 07-10-10, 15:09
  4. i2c
    By Dragonblades in forum Ηλεκτρονικά
    Απαντήσεις: 7
    Τελευταίο Μήνυμα: 02-12-09, 20:39
  5. Midi interface
    By Killo_Watt in forum Γενικά
    Απαντήσεις: 8
    Τελευταίο Μήνυμα: 27-12-05, 21:47

Δικαιώματα - Επιλογές

  • Δημιουργία θεμάτων: Όχι
  • Υποβολή μηνυμάτων: Όχι
  • Σύναψη αρχείων: Όχι
  • Επεξεργασία μηνυμάτων: Όχι
  •  
  • BB code: σε λειτουργία
  • Smilies: σε λειτουργία
  • [IMG]: σε λειτουργία
  • [VIDEO] code is σε λειτουργία
  • HTML: εκτός λειτουργίας