STM32 i2c MCP23017 keine Kommunikation

OP (Firma: TU Darmstadt) #5296259
Hallo!

Ich versuche seit einigen Tagen eine I2C Kommunikation von einem STM32 
Board zum MCP23017 Expander herzustellen. Ich bin bereits einige 
Erklärungen durchgegangen und der Init "sollte" richtig sein. Erzeugt 
wurde dieser mit der MXCube Software.
Ich kann bisher sagen das der Expander nicht kaputt ist, da ich ihn über 
einen normalen Arduino ansprechen kann. Weiterhin besitze ich keinen 
Oszi oder Logic-Analyzer, kann also nicht sehen was gesendet wird.
Auf den ersten Blick wird das Datenregister des I2C Moduls richtig 
beladen, jedoch sehe ich nichts. Was passieren soll, ist nur das der 
GPIOA Port vom Expander auf Output und dann auf HIGH gestellt wird. Evtl 
könnte mich jemand weisen, wo ich einen Fehler gemacht habe.

Dateien auf Github: [[https://github.com/ravnicas/stm32f207igh]] inkl 
dem CubeMX Projekt
Gast #5296306
A0 bis A2 hast du auf GND gelegt?

Der Transmit sieht bei mit so aus:
1
uint8_t data[]={1,2};
2
HAL_I2C_Master_Transmit(&hi2c2,(uint16_t)(MCP_I2C_ADDR<<1 | MCP_I2C_W),(uint8_t*)data,sizeof(data),10);
OP (Firma: TU Darmstadt) #5296361
A0 bis A2 sind auf GND, so sollte die Adresse 0x20 sein. Ich war davon 
ausgegangen das HAL den LShift durchführt und den das R/W bit setzt. 
Aber ob die Adresse nun 0x20 oder 0x40 ist, macht für meinen Fehler 
keinen Unterschied.
Weiterhin, was ist denn MCP_I2C_W?
1
uint8_t I2C_Write_Byte(uint8_t addr, uint8_t data)
2
{
3
  uint8_t buf[] = {addr, data};
4
  uint8_t d;
5
  while (HAL_I2C_GetState(&hi2c2) != HAL_I2C_STATE_READY);
6
  d = HAL_I2C_Master_Transmit(&hi2c2, SLAVE_ADDRESS, buf, 2, TIMEOUT);
7
  if ( d != HAL_OK) {
8
      return d;
9
  }
10
  return HAL_OK;
11
}

Das wäre die Funktion welche ich allgemein zum schreiben nutzen wollte.
Gast #5296363
Ich weiß das hilft hier nicht unbedingt aber Kauf doch einen Saleae 
Logic analyzer clone aus China für 5€ den kann man für viele Sachen 
brauchen und das nächste mal hast du dann einen.
OP (Firma: TU Darmstadt) #5296810
An der Stelle weiß ich das nicht, aber laut HAL Dokumentation soll ich 
wohl einfach nur die Slave Adresse vorgeben, sprich 0x20. Ich hab beides 
probiert und es scheint keinen Unterschied zu machen.

Ich hatte anstatt einem Logic Analyzer, einen Arduino mit I2C Sniffer 
Code probiert. Ein einfaches Beispiel für den Teensy läuft durch und 
wird erkannt. Beim STM ist die Rückgabe nur 0.
OP (Firma: TU Darmstadt) #5298160
An PC7 ist bloß eine on-board LED damit ich sehe, ob das Programm 
durchgelaufen ist. Pull-up waren 5 kOhm.
Mal abgesehen davon, der typecast war es vermutlich wirklich. Nun läuft 
es mit 0x20 als Adresse in der HAL Funktion. Vielen Dank!
Gast #5307037
pegel schrieb:
> pegel wrote:
>  > MCP_I2C_ADDR << 1 | MCP_I2C_W
>
> My function is for a MCP23009 .
> MCP_I2C_ADDR is the 7bit address.
>
> #define MCP_I2C_W (0) // Write
> #define MCP_I2C_R (1) // Read
>
> I think it's because of the type casts for the HAL_I2C_Master_Transmit
> Function.

Hello,
Once you shift to the left for 1 bit the MCP address you do not need to 
"or" the last bit (R/W bit aka MCP_I2C_W). Simple delete that "or" and 
use "0x20<<1" instead of SLAVE ADDRESS.
Best regards

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.