Mampf F. schrieb:
> Poste mal die Initialisierung der GPIOs und der I2C Schnittstelle.
>
> Oft fehlen irgendwelche Alternate-Function-Mappings oder sowas ...
Hier meine I2C Init Funktion:
1 | void MX_I2C1_Init(void)
|
2 | {
|
3 |
|
4 | hi2c1.Instance = I2C1;
|
5 | hi2c1.Init.ClockSpeed = 40000;
|
6 | hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
|
7 | hi2c1.Init.OwnAddress1 = 0;
|
8 | hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
|
9 | hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
|
10 | hi2c1.Init.OwnAddress2 = 0;
|
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 | }
|
Und hier die GPIO Init Funktion:
1 | void MX_GPIO_Init(void)
|
2 | {
|
3 |
|
4 | GPIO_InitTypeDef GPIO_InitStruct;
|
5 |
|
6 | /* GPIO Ports Clock Enable */
|
7 | __HAL_RCC_GPIOA_CLK_ENABLE();
|
8 | __HAL_RCC_GPIOB_CLK_ENABLE();
|
9 |
|
10 | /*Configure GPIO pin : PA8 */
|
11 | GPIO_InitStruct.Pin = GPIO_PIN_8;
|
12 | GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
13 | GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
14 | HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
15 |
|
16 | }
|
Ich habe schon entdeckt, dass die Portkonfiguration von I2C in einer
anderen Funktion statt findet, und zwar in folgender:
1 | void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)
|
2 | {
|
3 |
|
4 | GPIO_InitTypeDef GPIO_InitStruct;
|
5 | if(i2cHandle->Instance==I2C1)
|
6 | {
|
7 | /* USER CODE BEGIN I2C1_MspInit 0 */
|
8 |
|
9 | /* USER CODE END I2C1_MspInit 0 */
|
10 |
|
11 | /**I2C1 GPIO Configuration
|
12 | PB8 ------> I2C1_SCL
|
13 | PB9 ------> I2C1_SDA
|
14 | */
|
15 | GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;
|
16 | GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
|
17 | GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
18 | HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
19 |
|
20 | __HAL_AFIO_REMAP_I2C1_ENABLE();
|
21 |
|
22 | /* I2C1 clock enable */
|
23 | __HAL_RCC_I2C1_CLK_ENABLE();
|
24 |
|
25 | /* I2C1 interrupt Init */
|
26 | HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0);
|
27 | HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);
|
28 | HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 0);
|
29 | HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);
|
30 | /* USER CODE BEGIN I2C1_MspInit 1 */
|
31 |
|
32 | /* USER CODE END I2C1_MspInit 1 */
|
33 | }
|
34 | }
|
Nur weiß ich nicht, ob diese Funktion anderweitig schon aufgerufen wird,
oder ob ich diese selber aufrufen muss. Deshalb hab ich eben versucht,
diese aufzurufen, eine Änderung ist aber nicht fest zu stellen.