www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MS5534A Kommunikation Beispiel MSP430


Autor: Tobias W. (wib)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

hat jemand ein Beispiel in C für eine Kommunikation vom MSP430 mit einem 
MS5534A Sensor?
Hab mich schon etwas damit beschäftigt, bräuchte aber ein Beispiel ohne 
SPI.
Das kann ich auf der vorhandenen Platine nicht nutzen.

Bis jetzt habe ich das hier, etwas angepasst aus einem Beispiel mit SPI 
hier aus dem Board.
//******************************************************************************
//* wait (Warteschleife, Zyklen)
//******************************************************************************
void wait(unsigned int i)
{
    unsigned int j;
    for (j = 0; j < i; j++);
}

//******************************************************************************
//* SerialSendLsbFirst (Sendet Daten zum MS5534A)
//******************************************************************************
void SerialSendLsbFirst(int pattern, int nbr_clock)
{
    int i;
    P2OUT &= ~SCK;
    wait(10);

    for (i = 0; i < nbr_clock; i++) {
        if (pattern & 0x01)
            P2OUT |= SDO;
        else
            P2OUT &= ~SDO;
        wait(10);
        P2OUT |= SCK;
        wait(10);
        P2OUT &= ~SCK;
        pattern = pattern >> 1;
    }
}

//******************************************************************************
//* reset_MS5534A (Sendet Resetsignal zum MS5534A)
//******************************************************************************
void reset_MS5534A(void)
{
    SerialSendLsbFirst(0x55, 8);        //  21-bit reset sequence 0x55 0x55 0x00
    SerialSendLsbFirst(0x55, 8);
    SerialSendLsbFirst(0x00, 5);
}

//******************************************************************************
//* SerialGet16 (MS5534A auslesen)
//******************************************************************************
long SerialGet16(void)
{
    int j;
    long v;
    v = 0;
    P2OUT &= ~SCK;
    wait(20);

    for (j = 0; j < 16; j++) {
        P2OUT |= SCK;
        wait(20);
        P2OUT &= ~SCK;
        v = v << 1;
        if (P2IN & SDI)
            v = v | 1;
        wait(20);
    }

    return (v);
}

//******************************************************************************
//* getW (MS5534A CalibrationWords auslesen)
//******************************************************************************
long getW(int index)
{
    int cmd1 = 0, cmd2 = 0;
    long wdata;
    wdata = 0;

    switch (index) {
    case 0:
        cmd1 = 0x57;
        cmd2 = 0x01;
        break;
    case 1:
        cmd1 = 0xD7;
        break;
    case 2:
        cmd1 = 0x37;
        cmd2 = 0x01;
        break;
    case 3:
        cmd1 = 0xB7;
        break;
    }
    SerialSendLsbFirst(cmd1, 8);
    SerialSendLsbFirst(cmd2, 5);
    wdata = SerialGet16();
    SerialSendLsbFirst(0x00, 1);

    return (wdata);
}

//******************************************************************************
//* WaitOnDoutFall (auf MS5534A ADC warten)
//******************************************************************************
long waitOnDoutFall(void)
{
    int cnt = 0;
    short working = 1;
    long error = 0;

    while (working) {
        working = (P2IN & SDI);
        cnt++;
        wait(10);
        if (cnt >= 50) {
            working = 0;
            error = 1;
        }
    }

    return (error);
}

//******************************************************************************
//* getData (Druck und Temperatur auslesen (MS5534A))
//******************************************************************************
long get_data(int reg_sel)
{
    long d1;
    int error, pulse = 2;

    if (reg_sel == PRESSURE) {
        SerialSendLsbFirst(0x2F, 8);
        SerialSendLsbFirst(0x00, 2);
    } else {
        SerialSendLsbFirst(0x4F, 8);
        SerialSendLsbFirst(0x00, 3);
        pulse = 1;
    }

    error = 0;
    if (!(P2IN & SDI))
        error = 1;

    SerialSendLsbFirst(0x00, pulse);

    if (!error)
        error = waitOnDoutFall();

    if (!error)
        d1 = SerialGet16();
    else
        d1 = 0;

    if (reg_sel == PRESSURE)
        SerialSendLsbFirst(0x00, 1);

    //if (error_pt != 0)
    //  *error_pt = error;

    return (d1);
}

//******************************************************************************
//* ConvertWtoC (4 Words => 6 CalibrationParams)
//******************************************************************************
long ConvertWtoC5534(int ix, long W1, long W2, long W3, long W4)
{
    long c = 0;
    long x, y;

    switch (ix) {
    case 0:
        c = (W1 >> 1) & 0x7FFF;
        break;
    case 1:
        x = (W3 << 6) & 0x0FC0;
        y = W4 & 0x003F;
        c = x | y;
        break;
    case 2:
        c = (W4 >> 6) & 0x03FF;
        break;
    case 3:
        c = (W3 >> 6) & 0x03FF;
        break;
    case 4:
        x = (W1 << 10) & 0x0400;
        y = (W2 >> 6) & 0x03FF;
        c = x | y;
        break;
    case 5:
        c = W2 & 0x003F;
        break;
    }

    return (c);
}

//******************************************************************************
//* read_absdruck (Liest Sensor aus)
//******************************************************************************
void read_absdruck()
{
    int i;

    reset_MS5534A();            // Initialize MS5534A

    for (i = 0; i < 4; i++)     // Get MS5534 calibration words
        cw[i] = getW(i);


    for (i = 0; i < 6; i++)     // Extract cal coefficients
    {
        fc[i] = ConvertWtoC5534(i, cw[0], cw[1], cw[2], cw[3]);
        // printf("%lu ", fc[i]);
    }

    if ((cw[0] != 0) & (cw[0] != 0xFFFF))       // Check for valid sensor
    {                           // otherwise return error defaults
        d1 = get_data(PRESSURE);        // read pressure value
        d2 = get_data(TEMPERATURE);     // read temperature value
    }

}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.