18-I2C_Slave-Library (STM32F429)

Mit dieser Library kann der STM32F429 als I2C-Slave eingesetzt werden.

Der Slave simuliert ein 256-Byte großes I2C-RAM. Die I2C-Funktionen laufen per Interrupt ab. Es gibt zwei Funktionen für read/write vom internen RAM.

Ein I2C-Master kann per I2C-Write ein Byte in das interne RAM vom Slave speichern und per I2C-Read ein Byte aus dem RAM vom Slave auslesen.

Im Beispiel wartet der Slave solange, bis ein Master per I2C in die RAM-Adresse 0×00 den Wert 0×12 geschrieben hat, dann wird die grüne LED eingeschaltet.

die I2C-Pins die benutzt werden sollen, müssen im C-File eingetragen werden
(im H-File kann die I2C-Clock-Frq und die Größe vom RAM eingestellt werden)

auf der Hardware dürfen die zwei externen Pull-Up Widerstände (je 4k7) an SCL und SDA nicht vergessen werden, sonst funktioniert das ganze nicht.

es gibt 3 identische Librarys, getrennt für I2C1, I2C2 und I2C3

im Beispiel wurde I2C3 benutzt mit dieser Pinbelegung :

1
2
SCL an PA8
SDA an PC9

Funktionen (für I2C1) :

1
2
3
void UB_I2C1_Slave_Init(uint8_t slave_adr);              // zum init als I2C-Slave
uint8_t UB_I2C1_Slave_ReadByte(uint8_t adr);             // zum lesen vom RAM
void UB_I2C1_Slave_WriteByte(uint8_t adr, uint8_t wert); // zum schreiben in das RAM

Beispiel :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//--------------------------------------------------------------
// File     : main.c
// Datum    : 05.11.2013
// Version  : 1.0
// Autor    : UB
// EMail    : mc-4u(@)t-online.de
// Web      : www.mikrocontroller-4u.de
// CPU      : STM32F429
// IDE      : CooCox CoIDE 1.7.4
// GCC      : 4.7 2012q4
// Module   : CMSIS_BOOT, M4_CMSIS_CORE
// Funktion : Demo der I2C-Slave-Library
// Hinweis  : Diese zwei Files muessen auf 8MHz stehen
//              "cmsis_boot/stm32f4xx.h"
//              "cmsis_boot/system_stm32f4xx.c"
// In Configuration diese Define hinzufügen :
// "STM32F429_439xx" , "__ASSEMBLY__" , "USE_STDPERIPH_DRIVER"
//--------------------------------------------------------------
 
#include "main.h"
#include "stm32_ub_led.h"
#include "stm32_ub_i2c3_slave.h"
 
int main(void)
{
  uint8_t wert;
 
  SystemInit(); // Quarz Einstellungen aktivieren
 
  // Init der LEDs
  UB_Led_Init();
 
  // Init vom I2C-3 als Slave mit Adresse 0x70
  UB_I2C3_Slave_Init(0x70);
 
  while(1)
  {
    // Wert vom RAM an Adresse 0x00 auslesen
    wert=UB_I2C3_Slave_ReadByte(0x00);
    // LEDs je nach Inhalt schalten
    if(wert==0x12) {
      UB_Led_On(LED_GREEN);
      UB_Led_Off(LED_RED);
    }
    else {
      UB_Led_On(LED_RED);
      UB_Led_Off(LED_GREEN);
    }
  }
}

Hier die Library zum Download :

i2c_slave_f429_v100

Hier der komplette CooCox-Projektordner zum Download :

Demo_F429_18


16 Antworten auf 18-I2C_Slave-Library (STM32F429)

  1. Joerg sagt:

    Auf dem Discovery Board sind die Pullups schon vorhanden!!!!! Also keine extra Pullups benutzen

  2. Lohmann sagt:

    Hallo ich habe gerade das stm32f429i-Dico mit tft lcd und 3-axsen Sensor.
    Laut Belegung gibt es für I2C PB10 PB11(LCD Touch) & PA8 PC9(LCD Touch) & PF0 PF1(SRAM)
    Die sind aber vom LCD Touch und SRAM belegt welchen I2C ist da
    am gefahrenlosesten zu verwenden ?
    Vom SRAM oder vom LCD Touch ?

    • admin_ub sagt:

      ich würde I2C-3 nehmen (also PA8+PC9). Da an den I2C-BUS mehrere Slaves angeschlossen werden können, bleiben damit alle restlichen Funktionen (Touch/SDRAM/Display) erhalten. Einfach meine I2C3-Master Library benutzen die kümmert sich auch gleich darum, das sie nur einmal initialisiert wird.

  3. Lohmann sagt:

    Danke schön denn ich habe bis heute nur ATMegas und ATXMegas programmiert.
    Mit Bascom ist das eigentlich sehr leicht da sich alles (mit ausnahmen) wie z.B. I2C
    sofort einbinden lassen möchte aber nun mal wissen was es anders gibt.
    Mein erstes Projekt soll nun den BMA180 über i2C sein. Dieser Sensor ist das
    beste was ich kenne der bekommt schon die kleinsten Erschütterungen mit.
    Der hat nur 14 Bit Auflösung (0.00025g/2g) der 3-Achsen soll ja 16-Bit haben
    davon merke ich aber nichts.Kann ein Beschleunigungssensor mit einem Gyroskop
    verglichen werden?

    • admin_ub sagt:

      Ein Gyroskop (Drehratensensor) ist was anderes wie ein Beschleunigungssensor (daher gibt es auch zwei Namen) auf dem STM32F429iDisco ist ein Drehratensensor verbaut. Die Funktionsweise bei WIKI nachlesen.

  4. Lohmann sagt:

    Ja da ist mir klar aber was ist mit der Auflösung ?
    Kann ich mit dem Drehratensensor auch kleinste
    Erschütterungen messen ?
    z.B 0.00025g

    • admin_ub sagt:

      ganz klar scheint das aber noch nicht zu sein. Mit einem Drehratensensor kannst du keine “g” messen. Sondern nur die “Drehrate” also die Geschwindigkeit der Drehung in Grad pro Sekunde. Wenn du eine Beschleunigung in der Einheit “g” messen willst, brauchst du einen (wie der Name schon sagt) Beschleunigungs-Sensor. Egal für welchen Sensor du dich entscheidest, die Genauigkeit und Auflösung steht im Datenblatt vom jeweiligen Sensor…lesen musst du selber.

  5. Lohmann sagt:

    Danke aber nun mein eigentliches Problem:
    Habe mit das STM32F429I-Disco zugelegt möchte mir gerne
    die stm32 Programmierung aneignen.
    Habe die Entwickelungsumgebung CooCox Coide installiert und das Funktioniert
    alles schon auch die Beispiele funktionieren.
    Nun erstelle ich ein Projekt gehe auf ->Bord wähle -> Stm32f4-discovery
    sonst aber nichts wähle also und Driver component nichts.

    Nun bekomme ich meine main.h die verändere ich dann so:
    #include “main.h”
    #include “stm32_ub_lcd_ili9341.h”
    #include “stm32_ub_font.h”
    #include “stm32_ub_touch_stmpe811.h”
    #include
    int main(void)
    {

    while(1)
    {
    }
    }

    Die ganzen files die zum Download bereit stehen wie z.B.
    stm32_ub_lcd_ili9341.h
    stm32_ub_font.h
    .
    .
    stm32_ub_sdram.c
    usw. kopiere ich dann auch in das Verzeichnis ub_lib.
    Dann gehe ich auf Add file und wähle alle aus.
    Dann gehe ich auf Build(F7) und dann kommen
    nur Fehle wie:
    [cc] c:\stm32f4\vorlage_f429_168mhz_v100\ub_lib\
    stm32_ub_font.h:12:23: fatal error: stm32f4xx.h: No such file or directory

    Aber warum ist doch alles da ???

    • admin_ub sagt:

      1. Du kannst CoIDE nicht zum anlegen für ein STM32F429 Projekt benutzen
      (nimm eine leere Vorlage von mir, da sind alle Files dabei)
      2. du brauchst natürlich alle “Standard Peripherals” von ST für den STM32F429. Diese werden von CoIDE nicht automatisch dazukopiert, weil der STM32F429 noch nicht unterstüzt wird. Du musst also alle notwendigen Files manuell in die beiden Ordner “cmsis_lib/include” und “cmsis_lib/source” kopieren. Du findest die Files alle in meinen Projektfiles in den gleichen Ordnern.

  6. Lohmann sagt:

    Eine kleine Frage wofür steht bei STM das ST ich meine auch bei der ST.com
    was ist mit ST gemeint?

    • Joerg B. sagt:

      Die Anfangsbuchstaben aus den Firmen aus den ST entstand.

      SGS Microelettronica und Thomson

  7. Michael sagt:

    Alles funktioniert prima auf Anhieb. I2C Master ist ein anderer STM32. Slave klappt nun auch.
    Allerdings bleibt nach dem Lesen von einem Block bei diesem Slave die SCL Leitung auf 0V. Ich debugge schon wie wild. Was kann das sein?

  8. Michael sagt:

    I2C3 SR1=0×180
    I2C3 SR2=6 in dem Fall wenn SCL vom Slave auf Low gezogen wird…

    • admin_ub sagt:

      nochmal etwas ausführlicher bitte :
      1. was für ein IC ist der Master
      2. was für ein IC ist der Slave
      3. Welche Seite willst du programmieren (Master oder Slave)
      4. Welche Seite funktioniert nicht (Master oder Slave)
      5. Welche Libarys benutzt du und was läuft sonst noch “parallel”

  9. Michael sagt:

    Damit funktioniert es nun: BERR und TXE Flags müssen gelöscht werden.
    //————————————————————–
    // ISR (Error Handler vom I2C)
    //————————————————————–
    void I2C3_ER_IRQHandler(void)
    {
    if (I2C_GetITStatus(I2C3, I2C_IT_AF)) {
    I2C_ClearITPendingBit(I2C3, I2C_IT_AF);
    }

    //mh
    if (I2C_GetITStatus(I2C3, I2C_IT_BERR)) {
    I2C_ClearITPendingBit(I2C3, I2C_IT_BERR);
    }
    //mh
    if (I2C_GetITStatus(I2C3, I2C_IT_TXE)) {
    I2C_ClearITPendingBit(I2C3, I2C_IT_TXE);
    }
    }

  10. Michael sagt:

    Das hast Du schön gekapselt: ich brauchte nur die C+H Datei und konnte den I2C Slave nun mein Projekt (STM32F100 LV Discovery mit I2C2) einbauen. Interrupt Handler sind auch gleich mit dabei. Ein paar Anpassungen wg. der Unterschiede zwischen F4xx und F10x waren noch nötig. Dann Compliliert und Flashen – Funktionierte sofort! Gut gemacht.


Wie hat Dir dieser Artikel gefallen?

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (Noch keine Bewertungen)
Loading...

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.