- Labornetzteil AliExpress         
Ergebnis 1 bis 10 von 10

Thema: STM32 F103 - I2C Probleme

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.06.2010
    Ort
    Darmstadt
    Beiträge
    136

    STM32 F103 - I2C Probleme

    Anzeige

    Praxistest und DIY Projekte
    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:

    Code:
    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.
    Es gibt keine Probleme, es gibt nur Lösungen

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Hallo robonooby,
    hast Du denn auch die beiden Pullups an den Leitungen dran ? Ohne geht es nicht....

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.06.2010
    Ort
    Darmstadt
    Beiträge
    136
    Zitat Zitat von Siro Beitrag anzeigen
    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
    Es gibt keine Probleme, es gibt nur Lösungen

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    49
    Beiträge
    1.146
    Hi,

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

    Gruß,
    Georg

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.06.2010
    Ort
    Darmstadt
    Beiträge
    136
    Ja ich denke schon:

    Main.c
    Code:
    /* 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 */
    }

    }
    Es gibt keine Probleme, es gibt nur Lösungen

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    49
    Beiträge
    1.146
    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?

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.06.2010
    Ort
    Darmstadt
    Beiträge
    136
    Zitat Zitat von askazo Beitrag anzeigen
    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.
    Es gibt keine Probleme, es gibt nur Lösungen

  8. #8
    HaWe
    Gast
    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.)
    Geändert von HaWe (02.02.2018 um 19:26 Uhr)

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.06.2010
    Ort
    Darmstadt
    Beiträge
    136
    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
    Code:
    hal_status = HAL_I2C_Mem_Write(&hi2c1, DEVICE_ADDRESS<<1, control, 1, &arg_val, 1, I2C_TIMEOUT);
    Befehl.

    mit
    Code:
    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 !
    Es gibt keine Probleme, es gibt nur Lösungen

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    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
    Strom fließt auch durch krumme Drähte !

Ähnliche Themen

  1. STM32 als Arduino
    Von stochri im Forum Arduino -Plattform
    Antworten: 5
    Letzter Beitrag: 20.08.2017, 11:21
  2. STM32 - Interrupts
    Von White_Fox im Forum ARM - 32-bit-Mikrocontroller-Architektur
    Antworten: 7
    Letzter Beitrag: 05.11.2016, 21:43
  3. STM32 + Kamera
    Von Wsk8 im Forum ARM - 32-bit-Mikrocontroller-Architektur
    Antworten: 15
    Letzter Beitrag: 11.03.2014, 21:26
  4. stm32 discovery
    Von drew im Forum ARM - 32-bit-Mikrocontroller-Architektur
    Antworten: 17
    Letzter Beitrag: 07.04.2011, 17:55
  5. STM32 + blinkende LED
    Von Mountainking im Forum Konstruktion/CAD/3D-Druck/Sketchup und Platinenlayout Eagle & Fritzing u.a.
    Antworten: 41
    Letzter Beitrag: 11.11.2009, 15:48

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen