Forum: Mikrocontroller und Digitale Elektronik STM32F4xx I2C bei aktivieren Busy


von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


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.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Ich habe jetzt mein Programm mal auf ein Discovery Board auf gespielt 
und den Pin GPIO_Pin_7 auf GPIO_Pin_9 umbenannt, da dieses Board auch so 
verdrahtet ist.

Geht auch nicht :-/

Somit, es muss an meiner Software liegen. Ich weiß bloß noch nicht wo.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Hat niemand eine Idee wonach ich noch schauen könnte?

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


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?

von Ruppi66 (Gast)


Lesenswert?

Hallo Markus,
Bin ab mo wieder Zuhause. Hatte bei meinem
F2 auch Startprobleme mit der Umstellung von
der F1 Lib auf die F2 Lib (f4 Lib)

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Bisher fand ich die Verbesserungen zwischen F1 und F2/F4 sehr gut.

Nur bei dem I2C Problem bin ich echt ratlos was da noch fehlt.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?


von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

EIn paar Tage was anderes gemacht, dann klappt das auch wieder.
Ich habe es heraus gefunden:

Die Zeile:
GPIO_PinAFConfig(GPIOB, GPIO_Pin_6, GPIO_AF_I2C1);

muss so heißen:
GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_I2C1);

von Jörg R. (ruppi66)


Lesenswert?

Hallo Markus,

sehe Du hast es selbst gefunden.
Bei den neuen Libs muß man echt peinlichst auf
die Type des Übergabeparameters achten.
Habe beim Programmieren immer das Help-File zur
Lib offen.

Gruß Ruppi66

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


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!

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


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.

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.