STM32F4xx I2C bei aktivieren Busy

(Firma: EleLa - www.elela.de) #2703316
Lesenswert?

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.
(Firma: EleLa - www.elela.de) #2704283
Lesenswert?

Ich habe das Programm mal ganz einfach gemacht:
1
int main(void)
2
{
3
  I2C1_DBG = (I2C_TypeDef *)  I2C1_BASE; // Damit ich debuggen kann
4
  RCC->APB1ENR |= RCC_APB1ENR_I2C1EN;  // Click I2C1 aktivieren
5
  while(1);
6
}

Und "main()" steht direkt in der Vector-Tabelle drin, es gibt keinen 
Startup-Code, nichts.

Sobald der Clock vom I2C1 aktiviert wird, wird im SR2 das Busy Bit 
gesetzt.

Was ist jetzt daran falsch?
(Firma: EleLa - www.elela.de) #2704996
Lesenswert?

(Firma: EleLa - www.elela.de) #2711537
Lesenswert?

Die Demos von ST sind auch nicht so einfach. Defines mit anderen Defines 
benutzt und Initialisierungen in lauter kleine einzelne Funktionen 
gepackt, da sucht man erst mal alles zusammen und macht das einfacher.
Wenn ich nicht schon intensiv zuvor gesucht hätte, würde ich hier auch 
nicht schreiben.
Manchmal sieht man vor lauter Defines die richtigen Werte nicht mehr.

Dennoch Danke für die angebotene Hilfe!
(Firma: EleLa - www.elela.de) #2711548
Lesenswert?

Hier habe ich ein Demo gefunden:

https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2Fcortex_mx_stm32%2FSTM32F207%20-%20I2C%20error%20-%20ack%20failure%20AF%20after%20first%20call%20to%20SendData&FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B&currentviews=436

da steht die Zeile:
I2C_InitStruct.I2C_ClockSpeed = 30000; // speed = 300K

Da fehlt eine 0 und der hat nur 30K I2C_ClockSpeed.

Ich lese ein EEPROM mit 30KB Daten aus, da merkt man die fehlende 0 
schnell.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren