I2C: HAL Lib + NodeRed

OP #5514128
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?
Gast #5514691
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ß

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