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
"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?
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 | }
|
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.
Stefan schrieb: > Quarz gemeint? Und woher kommen die 5000ns? 5µs low, 5µs high => 10µs Periode => 100KHz.
Tip nebenbei: Erst Takt vom I2C-Modul einschalten, dann Pins konfigurieren. Gibt sonst Puls auf SCL/SDA.
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.