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
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); |
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.
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.
pegel schrieb: > MCP_I2C_ADDR<<1 | MCP_I2C_W Meine Funktion ist für einen MCP23009. MCP_I2C_ADDR ist die 7bit Adresse. #define MCP_I2C_W (0) //Write #define MCP_I2C_R (1) //Read Ich denke es liegt an den Type casts für die HAL_I2C_Master_Transmit Funktion.
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.
Hast du das Type casting probiert? Pull up Widerstände sind am I2C?
Was ist an PC7? MCP Reset? Das würde ich richtig benennen und auch nicht Toggeln, sondern definiert setzen.
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!
:
Bearbeitet durch User
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
Sicher, kann man machen. Aber so ist es klar, dass es eine 7bit Adresse ist und ob gelesen oder geschrieben wird. Kann jeder so machen wie er es mag.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.