Hallo,
Ik ben redelijk nieuw in het STM32 gebeuren en zou graag een IIC slave willen implementeren.
Een beknopte omschrijving omtrent de opstelling:
Ik maak gebruik van een Nucelo bordje type: L432KC. Dit bordje bezit 2x IIC en uart. Ideaal voor mijn test.
De SCL en SDA van I2C1 => komen buiten op PA9 en PA10 deze zijn voorzien van externe pull-up's naar 3V3. De SCL en SDA zijn doorverbonden naar pin PB4 en PA7 I2C3.
De code van mijn zender:
c code:
error = HAL_I2C_Master_Transmit(&hi2c1,0x04,data, 2, 1000);
if(error != HAL_OK){
printf("Error");
}
HAL_Delay(1000);
HAL_GPIO_TogglePin(LD3_GPIO_Port,LD3_Pin);
Deze data komt mooi buiten de pinnen...
De Slave:
Init van de slave:
c code:
static void MX_I2C3_Init(void)
{
hi2c3.Instance = I2C3;
hi2c3.Init.Timing = 0x10909CEC;
hi2c3.Init.OwnAddress1 = 4;
hi2c3.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c3.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c3.Init.OwnAddress2 = 0;
hi2c3.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
hi2c3.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c3.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c3) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
/**Configure Analogue filter
*/
if (HAL_I2CEx_ConfigAnalogFilter(&hi2c3, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
/**Configure Digital filter
*/
if (HAL_I2CEx_ConfigDigitalFilter(&hi2c3, 0) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
}
Interrupt routine:
c code:
void I2C3_EV_IRQHandler(void)
{
/* USER CODE BEGIN I2C3_EV_IRQn 0 */
HAL_GPIO_TogglePin(DBG_GPIO_Port,DBG_Pin);
/* USER CODE END I2C3_EV_IRQn 0 */
HAL_I2C_EV_IRQHandler(&hi2c3);
/* USER CODE BEGIN I2C3_EV_IRQn 1 */
/* USER CODE END I2C3_EV_IRQn 1 */
}
/**
* @brief This function handles I2C3 error interrupt.
*/
void I2C3_ER_IRQHandler(void)
{
/* USER CODE BEGIN I2C3_ER_IRQn 0 */
HAL_GPIO_TogglePin(DBG_GPIO_Port,DBG_Pin);
/* USER CODE END I2C3_ER_IRQn 0 */
HAL_I2C_ER_IRQHandler(&hi2c3);
/* USER CODE BEGIN I2C3_ER_IRQn 1 */
/* USER CODE END I2C3_ER_IRQn 1 */
}
De controller komt nooit in de interrupt routine.
Wat zie ik over het hoofd?
Bedankt!