- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 10

Thema: STM32 F103 - I2C Probleme

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    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

  2. #2
    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

  3. #3
    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

  4. #4
    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?

  5. #5
    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

  6. #6
    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 18:26 Uhr)

  7. #7
    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

Ähnliche Themen

  1. STM32 als Arduino
    Von stochri im Forum Arduino -Plattform
    Antworten: 5
    Letzter Beitrag: 20.08.2017, 10:21
  2. STM32 - Interrupts
    Von White_Fox im Forum ARM - 32-bit-Mikrocontroller-Architektur
    Antworten: 7
    Letzter Beitrag: 05.11.2016, 20:43
  3. STM32 + Kamera
    Von Wsk8 im Forum ARM - 32-bit-Mikrocontroller-Architektur
    Antworten: 15
    Letzter Beitrag: 11.03.2014, 20:26
  4. stm32 discovery
    Von drew im Forum ARM - 32-bit-Mikrocontroller-Architektur
    Antworten: 17
    Letzter Beitrag: 07.04.2011, 16: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, 14:48

Berechtigungen

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

12V Akku bauen