Moin
Aufgrund von einer großen Frequenzdifferenz zwischen dem Takt was für
I2C eingestellt wurde und dem was tatsächlich vorhanden war, stellte ich
fest das etwas nicht stimmt.
Als MCU kommt ein STM32F107 zum Einsatz. Der wird mit einem externen
8MHz Quarz betrieben.
1 | RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV2 | RCC_CFGR2_PLL2MUL10 |
|
2 | RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
|
Als SYSCLK sind demnach 72MHz eingestellt.
Die I2C Std lib holt sich den Takt as der RCC Stdlib
Da steht
1 | RCC_Clocks->SYSCLK_Frequency = (((HSE_VALUE / prediv2factor) * pll2mull) / prediv1factor) * pllmull;
|
Wenn ich das jetzt per Hand rechne, komme ich auf 72MHz
Laut Debugger (Coocox) habe ich da aber einen Wert von 225000000
Daher ist dann auch mein PCLK1 falsch berechnet, was dazu führt, das das
I2C mi einem ganz anderen Takt läuft.
Wenn ich aber in der I2C Std lib PCLK1 manuell eintrage, dann stimmten
die I2C Takte
1 | RCC_GetClocksFreq(&rcc_clocks);
|
2 | //pclk1 = rcc_clocks.PCLK1_Frequency;
|
3 | pclk1 = 36000000;
|
Das wundert mich insofern, weil die Timer die ich nutze, richtig laufen
1 | prescaler = 17999;
|
2 | period = (72 * milliseconds * 1000) / (prescaler + 1) - 1;
|
Ist in den Std libs ein Bug enthalten, den ich übersehen habe?