Mit dieser Library kann das MEMS-Micro (MP45DT02) vom Discovery-Board benutzt werden um Sound aufzunehmen und als WAV-File auf einer SD-Karte zu speichern.
Die Samplerate ist auf 16kHz und 16bit eingestellt. Wobei die Abtastrate vom Micro bei 64kHz liegt, die Werte aber noch gefiltert werden.
Der benutzte Software Filter ist von STM und liegt nur als compilierte Library vor. Dieses File muss aus dem Grund in der CoIDE im Linker hinzugefügt werden.
Hinweis : Der I2S-Clock und der notwendige PLL muss nicht im “system_stm32f4xx.c-File” eingestellt werden, das wird von der Library erledigt.
Bei meinen Test war die Aufnahmequalität sehr schlecht, ich hatte aber keine Lust da noch viel Zeit zu investieren.
Theoretisch können die Daten auch im RAM oder auf USB gespeichert, wer das will.
Wegen dem speichern auf SD-Karte wird die FATFS-Lib benutzt.
Benutzte Pins :
1 2 | PB10 = Clock PC3 = Data |
Voraussetzungen :
1 2 | Benutzte Module der CooCox-IDE : SPI, MISC Benutzte Librarys : STM32_UB_FATFS |
Enumerationen :
1 2 3 4 5 | typedef enum { MP45DT02_REC_OK = 0, MP45DT02_INIT_ERR, MP45DT02_FILE_ERR }MP45DT02_ERR_t; |
Funktionen :
1 2 3 4 | ErrorStatus UB_MP45DT02_Init(void); // zum initialisieren vom MP45DT02 MP45DT02_ERR_t UB_MP45DT02_RecordStart(const char* name); // zum starten der Aufnahme void UB_MP45DT02_RecordLoop(void); // muss zyklisch aufgerufen werden void UB_MP45DT02_RecordStop(void); // zum beenden der Aufnahme |
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 56 57 58 59 60 61 62 63 64 65 66 | //-------------------------------------------------------------- // File : main.c // Datum : 15.06.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 MP45DT02-Library // Hinweis : Diese zwei Files muessen auf 8MHz stehen // "cmsis_boot/stm32f4xx.h" // "cmsis_boot/system_stm32f4xx.c" //-------------------------------------------------------------- #include "main.h" #include "stm32_ub_mp45dt02.h" #include "stm32_ub_led.h" int main(void) { uint32_t n,m; SystemInit(); // Quarz Einstellungen aktivieren UB_Led_Init(); // Init der LEDs UB_MP45DT02_Init(); // Init vom MP45DT02 UB_Fatfs_Init(); // Init vom FATFS-System // Test ob SD-Karte eingelegt if(UB_Fatfs_CheckMedia(MMC_0)==FATFS_OK) { // Karte mounten if(UB_Fatfs_Mount(MMC_0)==FATFS_OK) { UB_Led_On(LED_GREEN); // File anlegen und Aufnahme starten UB_MP45DT02_RecordStart("test16k.wav"); // ein paar Sekunden aufnehmen for(n=0;n<10;n++) { UB_Led_Toggle(LED_BLUE); for(m=0;m<500000;m++) { // Loop-Funktion aufrufen !! WICHTIG !! UB_MP45DT02_RecordLoop(); } } // Aufnahme beenden UB_MP45DT02_RecordStop(); // Karte unmounten UB_Fatfs_UnMount(MMC_0); UB_Led_Off(LED_GREEN); } else UB_Led_On(LED_RED); } else UB_Led_On(LED_RED); while(1) { } } |
Hier die Library zum Download :
Hier der komplette CooCox-Projektordner zum Download :
Hi Uwe,
Um stereo von zwei MP45DT02 aufzunehmen, wie wird dann SPI2 configuriert? I2S_InitStructure.I2S_CPOL kann nur I2S_CPOL_High oder I2S_CPOL_Low annehmen. Wenn ich das MP45DT02 Datenblatt richtig lese muss man aber einen interrupt f”ur die aufsteigende UND abfallende Flanke des Taktes erzeugen, wenn man zwei MP45DT02 in Stereo mode an einer Datenleitung hat. Wie wird das erreicht?
Im voraus Danke f”ur Deine Antwort, und vielen Dank f”ur all die n”utzlichen Beispiele. Gruss, thomas
Hallo,
auch wenn das alles scho etwas her ist:
Wenn ich das richtig verstehe, geht das gar nicht. Bei meinem Testaufbau bekomme ich die Daten per DMA, aber immer nur vom rechten Kanal, egal wie ich I2S_CPOL einstelle. Der linke Kanal liefert bei mir nie Daten.
Ich verstehe CPOL auch so, das hier nur eingestellt wird, wo die Leitung hängen soll, wenn nichts übertragen wird (idle) und egal wie CPOL eingestellt ist, immer mit der steigenden Flanke von CLK übertragen wird.
Eigentlich würde ich auch gerne wissen, ob es nicht doch geht in Stereo mit der I2S Schnittstelle une zwei PDM Micros aufzunehmen.
Weiß da jemand was dazu?
Hallo,
die Qualität des Audiosignals ließ sich bei mir durch deaktivieren der Tiefpassfilterfrequenz (###.LP = 0) erheblich verbessern, dann wird jedoch hochfrequentes Rauschen hörbar. Vorher knackte bei mir das Signal in zeitlich konstanten Intervallen. Ich hab die Tonsignale direkt über UDP an meinen Rechner geschickt und “live” mitgehört. – funktionierte toll – Falls wer Probleme mit der vorkompilierten Datei hat (HW-FPU – #### uses VFP register arguments, lib… does not) kann man einfach die .s und .h-Datei von “https://github.com/piratfm/codec2_m4f/tree/master/lib/PDM_filter” einbinden (einfach einfügen).