-diese Library dient zum ansteuern eines M24C02 (256Byte EEprom) von einem externen Modul das per I2C an den STM32F4 angeschlossen ist.
(das IC ist kompatibel mit dem PCF8582)
-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 können bis zu 8 M24C02 gleichzeitig an die I2C angeschlossen werden, dazu muss aber bei allen eine eindeutige Hardwareadresse eingestellt werden (mit den 3 Adresspins).
-es wird die I2C-LoLevel-Library benutzt (mit I2C1)
Beispielbild :
Benutzte Pins :
1 2 | SCL an PB6 SDA an PB7 |
Voraussetzungen :
1 2 | Benutzte Module der CooCox-IDE : keine Benutzte Librarys : STM32_UB_I2C1 |
Enumerationen :
1 2 3 4 5 6 7 8 9 10 | typedef enum { M24C02_0 = 0xA0, // A2=0, A1=0, A0=0 M24C02_1 = 0xA2, // A2=0, A1=0, A0=1 M24C02_2 = 0xA4, // A2=0, A1=1, A0=0 M24C02_3 = 0xA6, // A2=0, A1=1, A0=1 M24C02_4 = 0xA8, // A2=1, A1=0, A0=0 M24C02_5 = 0xAA, // A2=1, A1=0, A0=1 M24C02_6 = 0xAC, // A2=1, A1=1, A0=0 M24C02_7 = 0xAE // A2=1, A1=1, A0=1 }I2C_ADR_M24C02_t; |
Funktionen :
1 2 3 | ErrorStatus UB_M24C02_Init(I2C_ADR_M24C02_t slave); // um das EEProm zu initialisieren int16_t UB_M24C02_ReadByte(I2C_ADR_M24C02_t slave, uint8_t adr); // um ein Byte aus dem EEprom zu lesen int16_t UB_M24C02_WriteByte(I2C_ADR_M24C02_t slave, uint8_t adr, uint8_t wert); // um ein Byte ins EEprom zu schreiben |
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 51 52 53 54 55 | //-------------------------------------------------------------- // File : main.c // Datum : 07.03.2013 // Version : 1.0 // Autor : UB // EMail : mc-4u(@)t-online.de // Web : www.mikrocontroller-4u.de // CPU : STM32F4 // IDE : CooCox CoIDE 1.7.0 // Module : CMSIS_BOOT, M4_CMSIS_CORE // Funktion : Demo der M24C02 Library // Hinweis : Diese zwei Files muessen auf 8MHz stehen // "cmsis_boot/stm32f4xx.h" // "cmsis_boot/system_stm32f4xx.c" //-------------------------------------------------------------- #include "main.h" #include "stm32_ub_m24c02.h" #include "stm32_ub_led.h" int main(void) { ErrorStatus check; int16_t wert; SystemInit(); // Quarz Einstellungen aktivieren UB_Led_Init(); // Init aller LEDs // init vom EEprom an I2C-1 mit Adr. 0xA2 check=UB_M24C02_Init(M24C02_1); if(check==SUCCESS) { UB_Led_On(LED_GREEN); // Wert 0x12 in Adr 0x03 schreiben UB_M24C02_WriteByte(M24C02_1,0x03,0x12); // Wert wieder auslesen wert=UB_M24C02_ReadByte(M24C02_1,0x03); // auswerten ob alles OK if(wert==0x12) { UB_Led_On(LED_BLUE); } else { UB_Led_On(LED_ORANGE); } } else { UB_Led_On(LED_RED); } while(1) { } } |
Hier die Library zum Download :
Hier der komplette CooCox-Projektordner zum Download :
Hallo!
Danke für diese Anleitung! Du solltest jedoch dringend ergänzen, dass man ca. 10k Pull-up Widerstände zwischen SDA -> Vcc und SCL-> Vcc anbringen muss! Ich habe das nur auf dem Bild gesehen sonst würde es immer noch nicht laufen.
Gruß
Danke für den Hinweis, hab es ergänzt.
Hallo Sefco,
PB6 auf dem STMF4Discovery hat schon einen Pullup von 4,7k (siehe Schemantics)
es reicht also ein 4,7k Pullup am PB9.
PB6 und PB7 (beide mit Pullups) werden für den Audio Chip dort benutzt.
Im übrigen sollte allgemein bekannt sein, dass I2C Pullups benötigt.
Jörg
Good afternoon!
Can I use this library to EEPROM at24c64?
Thank You!
no. at24c64 needs a two byte address command
instead of one byte.
Hi,
würde das ganze auch mit einem 24C512 funktionieren?
vg
nein, aber ich habe schon eine Library für den 24C512 geschrieben
http://mikrocontroller.bplaced.net/wordpress/?page_id=4908
ist zwar für den F429 kannst du aber per Copy&Paste
in die Version vom F407 reinkopieren
die I2C-LoLovel funktionen für den 16bit zugriff musst du auch kopieren.