64-I2C_Slave-Library (STM32F4)

Mit dieser Library kann der STM32F4 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 I2C1 benutzt mit dieser Pinbelegung :

1
2
SCL an PB6
SDA an PB7

Voraussetzungen :

1
2
Benutzte Module der CooCox-IDE : GPIO, I2C, MISC
Benutzte Librarys : keine

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
//--------------------------------------------------------------
// File     : main.c
// Datum    : 03.10.2013
// Version  : 1.0
// Autor    : UB
// EMail    : mc-4u(@)t-online.de
// Web      : www.mikrocontroller-4u.de
// CPU      : STM32F4
// 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"
//--------------------------------------------------------------
 
#include "main.h"
#include "stm32_ub_led.h"
#include "stm32_ub_i2c1_slave.h"
 
int main(void)
{
  uint8_t wert;
 
  SystemInit(); // Quarz Einstellungen aktivieren
 
  // Init der LEDs
  UB_Led_Init();
 
  // Init vom I2C-1 als Slave mit Adresse 0x70
  UB_I2C1_Slave_Init(0x70);
 
  while(1)
  {
    // Wert vom RAM an Adresse 0x00 auslesen
    wert=UB_I2C1_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 :

ub_stm32f4_i2c_slave_v100

Hier der komplette CooCox-Projektordner zum Download :

Demo_64_I2C_Slave


2 Antworten auf 64-I2C_Slave-Library (STM32F4)

  1. Christian sagt:

    Hallo,
    vielen Dank für das gute Beispiel!
    Mir ist es gelungen mit einem I2C_Master Bytes in das RAM des I2C_Slaves zu schreiben aber nicht wieder auszulesen.
    Wäre es möglich den passenden I2C_MasterCode zum auslesen des RAMs zu posten?

    Danke im Voraus.
    Mfg
    Christian

    • admin_ub sagt:

      es gibt schon eine I2C-Master-Library hier : http://mikrocontroller.bplaced.net/wordpress/?page_id=720
      versuch es mal mit der, zum lesen von einem Byte aus dem RAM vom Slave :

      1
      
      wert=UB_I2C1_ReadByte(0x70,0x0); // auslesen von Adresse-0


Wie hat Dir dieser Artikel gefallen?

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (1 Bewertungen, Durchschnitt: 4,00 von 5)
Loading...

1 Antwort zu 64-I2C_Slave-Library (STM32F4)

  1. Mischa Binder sagt:

    Hey 🙂
    Ich bin nun bereits über eine Woche am Fehler suchen. Auch mit dieser Library (ich habe den Code aus der Library so übernommen). Sendet mein uC einfach kein ACK bit nachdem die Adresse empfangen wurde.

    Ich mir fällt leider auch keine Idee mehr ein woran das liegen könnte.

    Kann mir jemand helfen?

Schreibe einen Kommentar

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