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?