STM32 I2C Slave interrupt based

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!

nonkel dw
Arco

Special Member

Als je wilt reageren op een interrupt van de slave, zal dat met een extra pin moeten. I2C is standaard master-slave en heeft geen interrupts.
Je kunt wel multi-master toepassen.

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Dag Arco

Ik wil 1 hardwareblok als IIC slave instellen.
Daarvoor heb ik toch geen extra pin nodig?

nonkel dw

Precies. Arco heeft even niet goed gelezen.

Heb je de module aangezet? Dubbelcheck de Registers in de RCC module.

Heb je de interrupts aangezet? Dubbelcheck de registers die er voor zijn. (ik weet even niet uit m'n hoofd hoe dat heet).

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Arco

Special Member

Inderdaad verkeerd gezien. Ik nam aan dat die Nukelo een of andere slave chip was...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Hallo

Het probleem is verholpen.
De chip kwam niet in de interrupt routine doordat de NVIC niet correct was geconfigureerd, eens goed ingesteld werkte het vrijwel direct!

Bedankt.

nonkel dw