Forum: Mikrocontroller und Digitale Elektronik STM32 I2C Clock Berechnung


von Stefan (Gast)


Lesenswert?

Hallo,


weiß jmd wie die Berechnung der I2C Frequenz beim STM32F103 
funktioniert? Bzw. wie kann ich z.B. genau 100kHz angeben?

Im Register ist nur Freq[5:0] Peripheral clock frequency angegeben

"The peripheral clock frequency must be configured using the input APB 
clock frequency (I2C peripheral connected to APB). The minimum allowed 
frequency is 2 MHz, the maximum frequency is limited by the maximum APB 
frequency (36 MHz) and an intrinsic limitation of 46 MHz."

Eine Berechnung finde ich leider im Datenblatt nicht.


Gruß
Stefan

von Stefan (Gast)


Lesenswert?

"If FREQR = 08, TPCLK1 = 125 ns so CCR must be programmed with 0x28
(0x28 <=> 40d x 125 ns = 5000 ns.)"

das hab grad noch im Datenblatt gefunden; ist mit 8MHz die Frequenz vom 
Quarz gemeint? Und woher kommen die 5000ns?

von (prx) A. K. (prx)


Lesenswert?

Ich habe mir das so zuammengereimt:
1
    // Set bit rate and rise time.
2
    if (rate <= 100000) {
3
        // 1T low, 1T high
4
        info->dev->CCR = ((F_APB1/2) + rate-1) / rate;
5
        // 1000ns rise time
6
        info->dev->TRISE = F_APB1/1000000 + 1;
7
    } else {
8
        // 2T low, 1T high
9
        info->dev->CCR = ((F_APB1/3) + rate-1) / rate | I2C_CCR_FS | I2C_CCR_DUTY;
10
        // 300ns rise time
11
        info->dev->TRISE = F_APB1/3333333 + 1;
12
    }

von TSE (Gast)


Lesenswert?

hast du die Möglichkeit das zu messen?
Schreib einfach ein kleines programm wo du I2C initialisierst und schick 
was raus.....

so weit ich mich aber noch erinnern kann ist der Wert den du in das 
Register geschrieben hast der tatsächliche Tacktwert. Also bei 400kHz 
400000 schreiben.

von (prx) A. K. (prx)


Lesenswert?

Stefan schrieb:

> Quarz gemeint? Und woher kommen die 5000ns?

5µs low, 5µs high => 10µs Periode => 100KHz.

von (prx) A. K. (prx)


Lesenswert?

Tip nebenbei: Erst Takt vom I2C-Modul einschalten, dann Pins 
konfigurieren. Gibt sonst Puls auf SCL/SDA.

von Stefan (Gast)


Lesenswert?

vielen Dank für eure Antworten!

Eine Frage hab ich noch bezüglich des CR2-Registers; welchen Sinn bzw. 
Zweck verfolgen die 6Bits FREQ[5:0] in diesem Register?

von (prx) A. K. (prx)


Lesenswert?

PS: Im obigen Code ist der >100KHz Zweig Unfug. Beweis für die Regel, 
dass was man mangels entsprechender Devices nicht testet dann auch nicht 
funktioniert.

von (prx) A. K. (prx)


Lesenswert?

Zu CR2:
1
info->dev->CR2 = I2C_CR2_ITEVTEN        // event interrupt enabled
2
               | I2C_CR2_ITERREN        // error interrupt enabled
3
               | F_APB1 / 1000000;      // peripheral clock frequency
Könnte mit den Timeouts vom SMBUS zusammenhängen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.