C Energy Monitoring mit einem STPM32

Dieses Thema im Forum "Software" wurde erstellt von Janiiix3, 27. Juni 2017.

  1. Janiiix3

    Janiiix3 Aktives Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    1.278
    Zustimmungen:
    8
    Punkte für Erfolge:
    38
    Sprachen:
    C
    Moin Moin.

    Bin gerade mal wieder dabei einen SPI Baustein zum reden zu bringen.
    Das reden, hat er schon gelernt. Das schreiben mag er noch nicht.
    Im Datenblatt steht das ein Kommando oder Frame immer mindestens 4 Bytes lang ist..

    lese_adresse, schreib_adresse, data_byte_1, data_byte_2

    Also wie beschrieben, Funktioniert das lesen.

    Das ist meine schreib Funktion..


    CodeBox C und C++
    void stpm32x_write(uint8_t addr, uint32_t cmd){
    
    spi_select_low();
    spi_usartx_tx_rx(0xff); // Previously requested data byte LSB
    spi_usartx_tx_rx(addr); // Previously requested data byte 2 out of 4
    spi_usartx_tx_rx((cmd & 0x00FF0000)>>16); // Previously requested data byte 3 out of 4
    spi_usartx_tx_rx((cmd & 0xFF000000)>>24); // Previously requested data byte MSB
    spi_select_high();
    
    _delay_ms(50);
    
    spi_select_low();
    spi_usartx_tx_rx(0xff); // Previously requested data byte LSB
    spi_usartx_tx_rx(addr+1); // Previously requested data byte 2 out of 4
    spi_usartx_tx_rx((cmd & 0x0000FF00)>>8); // Previously requested data byte 3 out of 4
    spi_usartx_tx_rx((cmd & 0x000000FF) ); // Previously requested data byte MSB
    spi_select_high();
    }
    


    Achso..
    Arbeiten tu ich im SPI Mode 3!

    Hier das Datenblatt
    www.st.com/resource/en/datasheet/stpm34.pdf
     
    #1 Janiiix3, 27. Juni 2017
    Zuletzt bearbeitet: 27. Juni 2017
  2. Dirk

    Dirk Administrator
    Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.198
    Zustimmungen:
    119
    Punkte für Erfolge:
    63
    Sprachen:
    C, Assembler, Pascal, C++, PHP, Java
    Ich habe mir das Datenblatt angeschaut ...
    Mir ist aufgefallen, dass du beim zweiten Word (Bit 15..0) MSB und LSB vertauscht hast.
    LSB wird immer zuerst übertragen.

    Möglicherweise ist CRC aktiviert. Da du kein CRC sendest, wird der Slave das Write Kommando nicht ausführen ...
    Möglicherweise liegt es daran.
    CRC deaktivieren:
    upload_2017-6-27_9-3-21.png
     
  3. Janiiix3

    Janiiix3 Aktives Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    1.278
    Zustimmungen:
    8
    Punkte für Erfolge:
    38
    Sprachen:
    C
    Da stand doch..


    CodeBox C und C++
    5 (optional) Master CRC verification packet Slave CRC verification packet
    


    Das 5 Byte Optional ist?
     
  4. Dirk

    Dirk Administrator
    Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.198
    Zustimmungen:
    119
    Punkte für Erfolge:
    63
    Sprachen:
    C, Assembler, Pascal, C++, PHP, Java
    Optional, weil deaktivierbar?

    Ich gehe davon aus, wenn CRC aktiviert ist (default), dann muss es auch übertragen werden.

    Wenn du Registerinhalte liest und nach dem 4 Byte abbrichst und CRC ignorierst, merkt das ja der Slave nicht.

    Wenn du allerdings für eine Schreiboberation CRC nicht überträgst, wird der Slave diese nicht ausführen.
    Zumindest vermute ich das mal, ich habe das Datenblatt nun nicht komplett durchgearbeitet.
    Aber falls es nicht so wäre, würde die Sicherheitsmaßnahme nicht so gut greifen.
     
  5. Janiiix3

    Janiiix3 Aktives Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    1.278
    Zustimmungen:
    8
    Punkte für Erfolge:
    38
    Sprachen:
    C
    Muss ich auf das ausschalten Kommando des CRC´s Mode, auch eine CRC bilden?
    Wenn ich es so versuche und danach das Register wieder auslese, ist das Bit nach wie vor gesetzt,,



    CodeBox C und C++
    spi_select_low();
    spi_usartx_tx_rx(0x24); // Previously requested data byte LSB
    
    spi_usartx_tx_rx(0x24); // Previously requested data byte 2 out of 4
    
    spi_usartx_tx_rx(0x07); // Previously requested data byte 3 out of 4
    
    spi_usartx_tx_rx(0x00); // Previously requested data byte MSB
    
    spi_select_high();
    


    Hiermit sollte das CRC Feature aus sein.
     
  6. Dirk

    Dirk Administrator
    Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.198
    Zustimmungen:
    119
    Punkte für Erfolge:
    63
    Sprachen:
    C, Assembler, Pascal, C++, PHP, Java
    Ich vermute.

    Sende einmal folgendes.

    0x24 0x24 0x07 0x00 0x15

    CRC = 0x15 nach CRC8-CCITT mit Polynom 0x07 und Startwert 0
     
  7. Janiiix3

    Janiiix3 Aktives Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    1.278
    Zustimmungen:
    8
    Punkte für Erfolge:
    38
    Sprachen:
    C
    Das Funktioniert. Wieso gibt man so etwas im Datenblatt an? Jemand der so was noch nie gemacht hat bzw. mit dem Chip gearbeitet hat, wird doch verrückt.
     
  8. Dirk

    Dirk Administrator
    Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.198
    Zustimmungen:
    119
    Punkte für Erfolge:
    63
    Sprachen:
    C, Assembler, Pascal, C++, PHP, Java
  9. Janiiix3

    Janiiix3 Aktives Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    1.278
    Zustimmungen:
    8
    Punkte für Erfolge:
    38
    Sprachen:
    C
    Diese Funktionen habe ich schon mal gesehen. Was meint ihr? Sollte man mit CRC Checksummen arbeiten um die plausibilität der Daten zu gewährleisten?

    Gibt es eigentlich ein tolles Buch, wo solch Rechenwege wie eben diese "Polynom Division" schön erklärt wird?
     
  10. LotadaC

    LotadaC Sehr aktives Mitglied

    Registriert seit:
    22. Januar 2009
    Beiträge:
    2.982
    Zustimmungen:
    45
    Punkte für Erfolge:
    48
    Sprachen:
    BascomAVR, Assembler
    Mathebuch Sekundarstufe I oder II ?!?
     
  11. Dirk

    Dirk Administrator
    Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.198
    Zustimmungen:
    119
    Punkte für Erfolge:
    63
    Sprachen:
    C, Assembler, Pascal, C++, PHP, Java
    ... oder auch mal bei wikipedia schauen.
    Zyklische Redundanzprüfung

    Die Antwort steht eigentlich in deiner Frage ;)

    Probiere es doch einfach aus.
     
  12. TommyB

    TommyB Premium Benutzer

    Registriert seit:
    17. Mai 2010
    Beiträge:
    1.707
    Zustimmungen:
    57
    Punkte für Erfolge:
    48
    Sprachen:
    Assembler, LunaAVR, VB.Net, Python, C#
    Bei RS232 und Baudraten >115K ist das Pflicht. Da geht sonst alles durcheinander, primär wegen billiger China Ware was die Pegelwandler angeht. SPI hab ich auch schon ohne Probleme mit 1 oder 2 MHz befeuert.

    Und OPTIONAL heißt dass es vom Chip her optional ist, nicht aber zwangsweise auch für die Aktion die du durchführen möchtest. Blödes Beispiel:
    Function Login(User As Sring, Optional Password As String) As Boolean
    Du könntest das Passwort weg lassen wenn der Benutzer bereits angemeldet ist, oder die Passwortüberprüfung generell deaktiviert ist, also nur in 2 von 3 Möglichkeiten ;)
     
  13. Dirk

    Dirk Administrator
    Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.198
    Zustimmungen:
    119
    Punkte für Erfolge:
    63
    Sprachen:
    C, Assembler, Pascal, C++, PHP, Java
    Hallo Jan,

    hast du mal mit CRC probiert. Kommst du klar?

    Dirk :ciao:
     
  14. Janiiix3

    Janiiix3 Aktives Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    1.278
    Zustimmungen:
    8
    Punkte für Erfolge:
    38
    Sprachen:
    C
    Moin Dirk.

    Ja das klappt mit den fertigen Funktionen von Atmel. Ich muss mir das mal auf nen Zettel aufschreiben, damit ich die Rechnung auch nachvollziehen kann.
     
  15. Jonas94

    Jonas94 Neues Mitglied

    Registriert seit:
    18. Juni 2018
    Beiträge:
    1
    Zustimmungen:
    0
    Punkte für Erfolge:
    1
    Sprachen:
    C
    Hey Jan,

    ich entwerfe für meine Bachelorarbeit eine Metering-Platine mit dem STPM32, Mikrocontroller und einem Zigbee Funkmodul.

    Leider habe Probleme mit der SPI Verbindung zum STPM.

    Ich benutze einen MSP430FR2311 Mikrocontroller für die Weiterverarbeitung der Werte.

    Die SPI Verbindung funktioniert, die Pegel sehen auf dem Oszilloskop gut aus und es ist meines Erachtens nach auch alles korrekt eingestellt.

    Jedoch erhalte ich beim Lesen eines Registers nicht die erwarteten Antworten.

    Beispiel:

    Lesen der Daten aus Row 4 also Adresse 08 dsp_cr6

    Senden Anfrage:
    08_FF_FF_FF
    -->

    Dummy Werte zum Empfangen:
    FF_FF_FF_FF

    Empfang:
    93_81_93_87
    -->

    Default Werte aus der Registertabelle (Seite 87/120 im Datenblatt), welche ich auch durch auslesen via "STPM3x Evaluation Software" erhalten habe sind jedoch

    00_3F_F8_00

    Das gleiche Problem habe ich mit allen anderen Registern. LSB First ist nicht eingestellt und nach Endian Umwandlung ergeben die erhaltenen Werte auch keinen Sinn.

    Ich hoffe du kannst mir weiterhelfen und falls dir nicht direkt etwas einfällt mir deinen Code zum Register lesen als Beispiel zeigen.

    Ich wäre dir super dankbar, da dieses Problem mich unglaublich viel Zeit und Nerven kostet und die "hervorragende" Dokumentation von ST mir auch nicht weiterhilft.

    Danke im Voraus und beste Grüße

    Jonas
    _________________________________________________________________________

    Edit: Die Frage geht natürlich auch an alle anderen falls jemand eine Idee hat :)
     
    #15 Jonas94, 18. Juni 2018
    Zuletzt bearbeitet: 18. Juni 2018
  16. Janiiix3

    Janiiix3 Aktives Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    1.278
    Zustimmungen:
    8
    Punkte für Erfolge:
    38
    Sprachen:
    C
    Kann es sein das dass Protokoll total falsch ist, wie ich die Daten übertrage @Dirk? Muss das nicht anders herum?
     
  17. Janiiix3

    Janiiix3 Aktives Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    1.278
    Zustimmungen:
    8
    Punkte für Erfolge:
    38
    Sprachen:
    C
    Hat sich erledigt. Die Kommunikation funkioniert doch einwandfrei.
     
  18. Janiiix3

    Janiiix3 Aktives Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    1.278
    Zustimmungen:
    8
    Punkte für Erfolge:
    38
    Sprachen:
    C
    Ich komme nicht weiter...
    Versuche die ganze Zeit die AD Werte aus dem Register "0x48" zu lesen aber anscheind ohne Erfolg.
    Wenn ich die Spannung an den Messeingängen ändere ( Phase 1) ändert sich auch die Messspannung. Also Physikalisch ist dort alles takko.

    Ich werde das Gefühl nicht los das dass "Latchen" von dem Register nicht sauber / überhaupt nicht funktioniert..
    Andere Registerinhalte ( mit ihrem default Werten ) kann ich zurücklesen ( dort wo kein Latch gemacht werden muss..)

    Hier werden die Daten eingesammelt.. Jemand eine Idee??


    CodeBox C und C++
    static inline void       stpm32SpiRead   ( uint8_t *buff , uint8_t crcEn )           
    {   
       uint8_t reg = buff[0];
       
       uint8_t frame[5] = { reg , 0xFF , 0xFF , 0xFF , 0x00 }; // buff[0] = Register Adresse
           
    
         STPM32_SYNC_PORT.OUTCLR = ( 1 << STPM32_SYNC_bp );
         _delay_ms(50);
         STPM32_SYNC_PORT.OUTSET = ( 1 << STPM32_SYNC_bp );
         _delay_ms(150);       
       
       stpm32Select();
       for ( uint8_t i = 0 ; i < ( STPM32_FRAME_LENG - 1 ) + crcEn ; i++ )
       {
           spiMasterWriteRead( frame[i] );
       }       
    
       for ( uint8_t i = 0 ; i < ( STPM32_FRAME_LENG - 1 ) + crcEn ; i++ )
       {
           *buff++ = spiMasterWriteRead( 0xFF );
       }
       stpm32Deselect();   
    }
    
     
  19. Dirk

    Dirk Administrator
    Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.198
    Zustimmungen:
    119
    Punkte für Erfolge:
    63
    Sprachen:
    C, Assembler, Pascal, C++, PHP, Java
    Ich habe gesehen, es gibt mehrere Möglichkeiten zu latchen. Welche nutzt du denn gerade?
     
  20. Janiiix3

    Janiiix3 Aktives Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    1.278
    Zustimmungen:
    8
    Punkte für Erfolge:
    38
    Sprachen:
    C
    Ich benutze gerade die Hardware Methode. Sprich den SYNC Pin.
     
  • Über uns

    Unsere immer weiter wachsende Community beschäftigt sich mit Themenbereichen rund um Mikrocontroller- und Kleinstrechnersysteme. Neben den Themen Design von Schaltungen, Layout und Software, beschäftigen wir uns auch mit der herkömmlichen Elektrotechnik.

    Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  • Coffee Time

    Unser makerconnect-Team arbeitet hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und unser eigener makerconnekt-Server regelmäßig gewartet wird. Wir nehmen das Thema Datensicherung und Datenschutz sehr ernst und sind hier sehr aktiv, auch sorgen wir uns darum, dass alles Drumherum stimmt!

    Dir gefällt das Forum und die Arbeit unseres Teams und du möchtest es unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft, unser Team freut sich auch über eine Spende für die Kaffeekasse :-)
    Vielen Dank!
    Dein makerconnect-Team

    Spende uns! (Paypal)
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren und die Seite optimal für dich anzupassen. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden