Forum: Mikrocontroller und Digitale Elektronik I2C: HAL Lib + NodeRed


von Jk M. (h4l9000)


Lesenswert?

Hi zusammen,

und zwar habe ich eine i2c Verbindung zwischen RPi(RedNode) und einem 
STM32 Nucleo Board(Slave).

Master:
Gesendet werden 5 Bytes vom RPi aus mittels "node-red-contrib-i2c" (I2C 
OUT).
Der Knoten ist folgendermaßen definiert:
Adresse: 0x05 (STM32 Slave Adresse)
Command: 0  (?)
Payload: msg.payload (Buffer 5)
Send bytes: 5

_________________________________________

Slave:
Hier verwende ich die HAL Lib.
1
uint8_t i2cData[5];
2
3
  if(HAL_I2C_Init(&hi2c1) != HAL_OK)
4
  {
5
    /* Initialization Error */
6
    Error_Handler();    
7
  }
8
9
10
while(1)
11
{
12
if(HAL_I2C_Slave_Receive(&hi2c1, &i2cData[0], 5, 500)==HAL_OK)
13
 {                 
14
  application();  
15
 }
16
}

1
static void MX_I2C1_Init(void)
2
{
3
4
  hi2c1.Instance = I2C1;
5
  hi2c1.Init.Timing = 0x00101D2D;
6
  hi2c1.Init.OwnAddress1 = 10;
7
  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
8
  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
9
  hi2c1.Init.OwnAddress2 = 0;
10
  hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
11
  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
12
  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
13
  if (HAL_I2C_Init(&hi2c1) != HAL_OK)
14
  {
15
    _Error_Handler(__FILE__, __LINE__);
16
  }
17
18
    /**Configure Analogue filter 
19
    */
20
  if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_DISABLE) != HAL_OK)
21
  {
22
    _Error_Handler(__FILE__, __LINE__);
23
  }
24
25
    /**Configure Digital filter 
26
    */
27
  if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK)
28
  {
29
    _Error_Handler(__FILE__, __LINE__);
30
  }
31
32
}


Funktioniert soweit gut. Allerdings bin ich mir nicht sicher ob das 
wirklich so richtig programmiert ist und entsprechend stabil läuft.

Sobald ich z.B "HAL_I2C_Slave_Receive_IT" (Interrupt) verwende, ich kann 
ich einmalig die 5 bytes übertragen. Danach ist die Slave Adresse nicht 
mehr verfügbar?

von Harry L. (mysth)


Lesenswert?

Warum nutzt du nicht CubeMX?

von PaSi (Gast)


Lesenswert?

Moin,

sieht soweit erstmal ganz okay aus.

Wenn du HAL_I2C_Slave_Receive_IT muss natürlich auch der entsprechende 
Interrupt konfiguriert sein. Hast du das gemacht? Hilfreich sind hier 
die Callback-Funktionen der Interrupts.

Gruß

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.