Hallo! Ich möchte gerne den MCP3302 ADC mittels SPI mit meinem STM32F429 Discovery Board auslesen. Anbei habe ich den geforderten Ablauf aus dem Datenblatt angehängt Leider habe ich noch nichts mit SPI gemacht wo auch empfangen wird und möchte wissen ob die Überlegung grundsätzlich richtig ist. Für mein Programm verwende ich die SPI Library von hier: http://mikrocontroller.bplaced.net/wordpress/?page_id=2751 Ich würde das Diagramm jz mal mit diesem "Pseudocode" interpretieren: (Die Library sendet ein Bit und empfängt auch wieder eines) uint8_t spi_send() { uint8_t ret_wert1; uint8_t ret_wert2; uint8_t ret_wert3; uint8_t ret_wert; **ChipSelect-Pin auf LO legen** ret_wert1=UB_SPI5_SendByte(0b00001100); //Single Ended CH0 ret_wert2=UB_SPI5_SendByte(0b00000000); //D0 ret_wert3=UB_SPI5_SendByte(0b00000000); //Alles Don't Cares ret_wert = ret_wert2 + ret_wert3; **ChipSelect-Pin auf HI legen** return(ret_wert); } int main(void) { uint8_t adc_wert; SystemInit(); UB_SPI5_Init(SPI_MODE_0_MSB); while(1) { adc_wert=spi_send(); } } Wäre nett wenn jemand der so etwas schon gemacht hat schnell drüberschaut! Bin mir leider echt nicht über das vorgehen bei sowas im klaren. lg.
Hallo Thomas, schaut erstmal recht vernüftig aus. Stell einfach sicher, das du genau das machst was dir das Bild sagt. 1. Chipselect auf LOW 2. Takt an 3. 2 Bytes senden (so wie du es machen willst) 4. kein 3. Byte senden (der ADC kümmert sich nicht mehr um den Eingang "dont care") 5. nach dem senden des 2. Bytes Lauschangriff starten ;) hier genau wie beim Senden 2 Bytes empfangen! fertig! Wieso benutzt du nicht den ADC des STM32? Willst du einen einzelnen Wert samplen? beste grüße public
Vielen Dank! Dann werde ich mal versuchen das ganze zum Laufen zu bekommen =) Grund ist, dass damit ein EKG Signal aufgezeichnet werden soll und ich die Daten isoliert zum uC-Board übertragen will mit einem SPI-Isolator. Wollte zuerst die analogen Signale isoliert Übertragen aber dieser Weg scheint mir flexibler und vor allem günstiger. Außerdem soll auch ein Lerneffekt dabei rausschauen =) lg.
Hallo, Hab es jz laufen und glaube,dass es sogar halbwegs funktioniert! Leider klappt das Zusammenfügen der 2 8-bit Ergebnisse zur 13-Bit Zahl nicht. Meine Überlegung war die MSBs in einem 16-bit int zu speichern und diese dann um 8 hochzushiften, anschließend noch die 8-bits LBSs dazuaddieren. Wenn ich den Poti drehe kommt aber leider immer nur innerhalb von einer Drehung ca. 0-255-0-255-.. heraus. Also gehe ich davon aus dass das zusammenfügen nicht klappt! ret_wert1 und ret_wert2 verhalten sich ca. einzeln genauso! Hat jemand eine Ahnung was ich falch gemacht habe? Vielen Dank und liebe Grüße! Anbei der Code: *********************************************************************** #include "main.h" #include "stm32_ub_lcd_ili9341.h" #include "stm32_ub_font.h" #include "stm32_ub_spi5.h" #include "stm32_ub_dig_out.h" #include <stdio.h> uint8_t spi_send() { UB_DigOut_Lo(DOUT_PE2); uint8_t ret_wert1=0; uint16_t ret_wert2=0; int i = 0; UB_SPI5_SendByte(0b00001100); //Single Ended for(i=0;i<100;i++); ret_wert1 = UB_SPI5_SendByte(0x00); //D0 for(i=0;i<100;i++); ret_wert2 = UB_SPI5_SendByte(0x00); //Alles Don't Cares UB_DigOut_Hi(DOUT_PE2); uint16_t wert = (ret_wert2<<8)+ret_wert1; return(wert); } int main(void) { SystemInit(); // Quarz Einstellungen aktivieren UB_DigOut_Init(); UB_DigOut_Hi(DOUT_PE2); char Text[16]; uint16_t x = 0; int i = 0; uint16_t y= 0; UB_SPI5_Init(SPI_MODE_0_MSB); // Init vom LCD UB_LCD_Init(); // Init der Layer UB_LCD_LayerInit_Fullscreen(); // auf Hintergrund schalten UB_LCD_SetLayer_1(); // Hintergrund komplett mit einer Farbe füllen UB_LCD_FillLayer(RGB_COL_WHITE); // auf Vordergrund schalten UB_LCD_SetLayer_2(); // Vordergrund komplett mit einer Farbe füllen UB_LCD_FillLayer(RGB_COL_GREEN); UB_Font_DrawString32(10,10,"ADC-Wert:",&Arial_18x27,RGB_COL_BLACK,RGB_CO L_WHITE); while(1==1) { for(i=0;i<10;i++) { x=spi_send(); y=y+x; } y= y/10; sprintf(Text, "%d", y); UB_Font_DrawString(10,100,Text,&Arial_10x15,RGB_COL_BLACK,RGB_COL_WHITE) ; for(i=0;i<10000000;i++); UB_LCD_FillLayer(RGB_COL_WHITE); } } ***********************************************************************
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.