Questa è una domanda successiva a Cosa succede se ometto le resistenze pullup sulle linee I2C?
In un orologio da parete digitale che ho progettato (utilizzando l'RTC DS1307 e l'MCU ATmega328), ho accidentalmente omesso le resistenze di pull-up che devono essere collegate a entrambe le linee I2C. Alla fine ho avuto la fortuna che i pull-up interni sulle linee ATmega I2C fossero sufficienti a permettere (a malapena) la comunicazione tra i dispositivi. Il risultato sono stati lunghi tempi di salita sulle linee I2C e riduzione della velocità a 32kHz , come si vede nelle immagini dell'oscilloscopio di seguito.
Modifica: in realtà, la frequenza è esattamente 100kHz - ci sono 2 picchi per 20us sulla traccia verde. Inizialmente pensavo ci fosse una riduzione a 32 kHz perché il mio oscilloscopio calcolava la frequenza sulla traccia gialla.
Ciò che mi lascia perplesso ora è come il i dispositivi hanno deciso che 32 kHz erano sufficienti per la comunicazione. La scheda tecnica DS1307 afferma che il dispositivo supporta la frequenza di 100 kHz sul bus I2C. Come mai invece è finito a usare 32kHz? Esiste una sorta di fase di handshake in cui la frequenza viene stabilita?
Alla fine, la mia domanda è davvero questa: Come viene stabilita la frequenza di clock tra master e slave nel protocollo I2C?
Non sono riuscito a trovare quelle informazioni cercando in rete.
Nel caso in cui ciò sia importante, sto usando Arduino IDE 1.03 e il mio firmware gestisce RTC utilizzando la libreria DS1307RTC Arduino (tramite le sue funzioni RTC.read ()
e RTC.write ()
). Quella libreria a sua volta usa Wire.h
per parlare con l'RTC.