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 :
Hier der komplette CooCox-Projektordner zum Download :
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
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 :