PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] STM32 F103 - I2C Probleme



robonooby
01.02.2018, 13:21
Hallo alle Miteinander,
ich bin zur Zeit dabei, mich in die 32Bit Welt einzuarbeiten. Hierzu habe ich mir ein Nucleo Board gekauft. Nun möchte ich damit ein I2C Display zu laufen bringen.
Allerdings habe ich hierbei kein Erfolg. Warum auch immer kommt absolut kein I2C Signal raus (Oszi hängt an SDA und SCL).

Programmieren tu ich mit Atollic TrueStudio und STM32 CubeMX.

Verwendet habe ich schon folgende Befehle Foren:

HAL_I2C_Master_Transmit(&hi2c1, 0x3C, outbuffer, sizeof(outbuffer), 1);
HAL_I2C_Mem_Write(&hi2c1, 0xA0, 0x1AAA, I2C_MEMADD_SIZE_16BIT, (uint8_t*)wmsg,strlen(wmsg)+1, HAL_MAX_DELAY);

I2C Port ist in CubeMX auf Standard und auf Pin PB6 und PB7 eingestellt.

Ich hoffe es kann mir jemand weiterhelfen. Ich bin mit meinem Latein am Ende.

Siro
01.02.2018, 15:30
Hallo robonooby,
hast Du denn auch die beiden Pullups an den Leitungen dran ? Ohne geht es nicht....

robonooby
01.02.2018, 15:55
Hallo robonooby,
hast Du denn auch die beiden Pullups an den Leitungen dran ? Ohne geht es nicht....

ja klar. hab 4,7kOhm und 10kOhm mal probiert. mit beiden gehts aber nicht. warum auch immer

askazo
01.02.2018, 18:30
Hi,

- Hast Du das Clock-Gate für den I2C eingeschaltet?
- Hast Du die GPIOs richtig konfiguriert?

Gruß,
Georg

robonooby
02.02.2018, 05:46
Ja ich denke schon:

Main.c

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f1xx_hal.h"

/* USER CODE BEGIN Includes */
#include "string.h"
#include <stdio.h>

#include <stdarg.h>
#include <u8g_arm.h>

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint8_t outbuffer[2]={0x40,0xff};

//Display
static u8g_t u8g;

....

int main(void)
{

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

/* MCU Configuration----------------------------------------------------------*/

/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();

/* USER CODE BEGIN Init */

/* USER CODE END Init */

/* Configure the system clock */
SystemClock_Config();

/* USER CODE BEGIN SysInit */

/* USER CODE END SysInit */

/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_ADC1_Init();
MX_I2C1_Init();

/* USER CODE BEGIN 2 */
DisplayInit();
/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
//SSD1307
//Slave Adress vom Display = 3C
//Display Ansteuerung:

HAL_I2C_Master_Transmit(&hi2c1, 0x3C, outbuffer, sizeof(outbuffer), 1);

// u8g_SetFont(&u8g,u8g_font_04b_03b);//set current font
// u8g_DrawStr(&u8g, 2, 12, "Hallo!");//write string - you set coordinates and string
// u8g_DrawBox(&u8g, 30, 30, 35, 35);//draw some box


/* while(HAL_I2C_Master_Transmit(&hi2c1, 0x3C,(uint8_t*) outbuffer, sizeof(outbuffer), (uint32_t)1000)!= HAL_OK)
{
if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
{
// HAL_printf("i2C Error\n\r");
GPIOA -> ODR ^= LD2_Pin;
}
}

while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY)
{

}
*/


GPIOA -> ODR ^= LD2_Pin;
HAL_Delay(2000);
}
/* USER CODE END 3 */

}

/* I2C1 init function */
static void MX_I2C1_Init(void)
{

hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000;
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c1) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}

}

stm32f1xx_hal_msp.c

void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
{

GPIO_InitTypeDef GPIO_InitStruct;
if(hi2c->Instance==I2C1)
{
/* USER CODE BEGIN I2C1_MspInit 0 */

/* USER CODE END I2C1_MspInit 0 */

/**I2C1 GPIO Configuration
PB6 ------> I2C1_SCL
PB7 ------> I2C1_SDA
*/
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

/* Peripheral clock enable */
__HAL_RCC_I2C1_CLK_ENABLE();

/* USER CODE BEGIN I2C1_MspInit 1 */

/* USER CODE END I2C1_MspInit 1 */
}

}

askazo
02.02.2018, 08:04
Was mir hier gerade noch auffällt:
In MX_I2C1_Init() rufst Du die Funktion HAL_I2C_Init() auf.
In Deinem zweiten Code-Schnippsel heißt die Funktion HAL_I2C_MspInit().
Soll das so sein?

robonooby
02.02.2018, 08:56
Was mir hier gerade noch auffällt:
In MX_I2C1_Init() rufst Du die Funktion HAL_I2C_Init() auf.
In Deinem zweiten Code-Schnippsel heißt die Funktion HAL_I2C_MspInit().
Soll das so sein?

Nein das ist nicht ganz Richtig. Die HAL_I2C_MSPInit() wird in der Main in der Funktion HAL_Init() aufgerufen.

HaWe
02.02.2018, 11:04
hi,
falls es immer noch nicht geht und bevor alle Stränge reißen:
Versuchs doch mal mit der Arduino-IDE...:
https://www.youtube.com/watch?v=MLEQk73zJoU

(I2C lässt sich mit der Wire class extrem einfach nutzen und testen.)

robonooby
08.02.2018, 09:53
Hab es nun hin bekommen.
Lag einerseits daran dass die I2C Adresse um 1 geschiftet werden muss (wegen R/W byte), und anderer seits funktioniert bei mir nur der

hal_status = HAL_I2C_Mem_Write(&hi2c1, DEVICE_ADDRESS<<1, control, 1, &arg_val, 1, I2C_TIMEOUT); Befehl.

mit

HAL_I2C_Master_Transmit(&I2C_HANDLER, DEVICE_ADDRESS<<1, (uint8_t*) buffer, 2, I2C_TIMEOUT); geht es bei mir nicht.
Warum das so ist weiß ich nicht, aber nun funktioniert alles.

Vielen Dank schonmal !

Klebwax
08.02.2018, 10:14
Da ich weder die Funktion

HAL_I2C_Mem_Write()

noch die Funktion

HAL_I2C_Master_Transmit()

kenne, kann ich dir da nicht helfen. Poste doch einfach mal die Doku zu diesen Funktionen, dann kann man ja mal die Unterschiede herausarbeiten.

MfG Klebwax