Hallo,
Ich habe meine I2C Bus Routine vom STM32F103 genommen, die PortPin/AF
Konfiguration entsprechend dem STM32F4 angepasst und jetzt tut die nicht
mehr.
Ich suche jetzt schon sehr lange und immer, wenn der Clock vom I2Cx
aktiviert wird, wird sofort im SR2 Register das Busy Bit gesetzt.
(SR2=0x0002)
Hier der Code der Initialisierung:
1 | I2C1->CR1 &= ~I2C_CR1_PE; // Pheriperie Disable
|
2 | I2C_DeInit(I2C1);
|
3 |
|
4 | RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, DISABLE);
|
5 | RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
|
6 |
|
7 | GPIO_PinAFConfig(GPIOB, GPIO_Pin_6, GPIO_AF_I2C1);
|
8 | GPIO_PinAFConfig(GPIOB, GPIO_Pin_7, GPIO_AF_I2C1);
|
9 |
|
10 | GPIOB->BSRR = GPIO_Pin_6 | GPIO_Pin_7;
|
11 | GPIO_InitSt.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; // SCL / SDA
|
12 | GPIO_InitSt.GPIO_Mode = GPIO_Mode_AF;
|
13 | GPIO_InitSt.GPIO_OType = GPIO_OType_OD;
|
14 | GPIO_InitSt.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
15 | GPIO_InitSt.GPIO_Speed = GPIO_Speed_50MHz;
|
16 | GPIO_Init(GPIOB, &GPIO_InitSt);
|
17 |
|
18 | I2C1->CR1 |= I2C_CR1_PE; // Pheriperie Enable
|
19 |
|
20 | I2C_InitSt.I2C_Mode = I2C_Mode_I2C;
|
21 | I2C_InitSt.I2C_DutyCycle = I2C_DutyCycle_2;
|
22 | I2C_InitSt.I2C_OwnAddress1 = 0;//0x10;
|
23 | I2C_InitSt.I2C_Ack = I2C_Ack_Enable;
|
24 | I2C_InitSt.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
|
25 | I2C_Init(I2C1, &I2C_InitSt); // disable & enable
|
Ich habe die Reihenfolge/Befehle der Initialisierung mit dem ST
Democode, der Funktion "CPAL_I2C_Init()" (cpal_i2c.c) auch verglichen
und kann keinen Unterschied erkennen.
Auch wenn ich die Reihenfolge ändere, dass z.B. die GPIO / AF Definition
weiter oben ist, egal, sobald
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
ausgeführt wird, so wird das Busy-Bit gesetzt.
Die I2C Leitungen sind noch beide Hi.
Dann setze ich die GPIO_PinAFConfig() und beide Pins werden Low und
bleiben Low.
In der Doku steht, dass wenn man I2C_CR1_PE löscht/setzt, wird der
Busy-Status wieder erneut aktualisiert. Aber die Pins bleiben auch Low.
Das Board hatte zuvor einen STM32F103VD drauf und ich habe den jetzt
umgebaut auf einen STM32F417VG. Zuvor liefen auf beide I2C Busse, daher
kann ich ein Problem mit den Pull-Up Widerständen / Kurzschluss usw.
ausschließen. Und dass beide I2C Busse exakt gleich falsch das Busy Bit
setzt zeigt dass es doch am Programm liegen muss.
Hat jemand einen Tipp für mich, was da noch falsch sein könnte?
Vielen Dank im Voraus.
Grüße Markus.
PS: Die Clocks RCC_AHB1Periph_GPIOB sind zuvor schon Enabled, und was
anderes braucht es meines Wissens nach nicht. Beim STM32F1xx musste man
noch einen Clock für die AF aktivieren, den gibt es mit dem STM32F4xx
wohl nicht mehr.