MSP430 und MS5534 - Kommunikationsproblem

OP #765720
Lesenswert?

Hallo Leute,

ich bin mit meiner Kommunikation jetzt schon was weiter gekommen, und 
zwar scheint das Senden zu klappen, allerdings liegt beim MS5534 der 
DOUT durchgehend auf High, was ja nicht ganz Sinn der Sache ist. An MCLK 
liegen die geforderten 32,768 KHz an. Über DIN läuft ein Signal (mit 
Oszilloskop kontrolliert). Auf SCLK gibt es auch Signale.

Nur leider bekomme ich wie gesagt keine vernünftige Antwort.
Kann mir jemand helfen und hat nen Tipp wodran das liegen könnte?

Quelltext hängt an, gesteuert wird es über die letzte Methode 
read_absdruck().
MSP430 läuft mit 8MHz, WaitOnePulse() sollte ca. 200ns warten ( siehe 
Datenblatt http://www.intersema.ch/site/technical/files/ms5534.pdf )

Habs nach dem Beispiel hier aufgebaut: 
http://www.intersema.ch/site/technical/files/an502.pdf

Hoffe jemand kann mir helfen, stehe aufm Schlauch ;)
Gast #765746
Lesenswert?

Ich hab mir das Datenblatt und Deinen Code mal überflogen...
Ich denke, Du hast da was missverstanden!
Die 200ns sind die Anstiegs- und Abfallzeiten der Taktflanken, keine 
Wartezeiten!
Dein MCLK muss im Bereich 30kHz - 35kHz liegen und das Tastverhältnis 
muss um die 50% betragen.
Bei 32,768kHz wären das also jeweils rund 15µs für High-/Low-Pegel 
Deines Taktsignals. Wenn Du also Deinen Takt generierst, musst Du 
zwischen den Flankenwechseln von Low nach High (und umgekehrt) jeweils 
15µs warten und nicht 200ns!
OP #765755
Lesenswert?

Danke für die Hilfe, MCLK liegt auf 32,768KHz, passt also.
Da der MSP ja mit 8MHz läuft lasse ich ihn jetzt 8 Takte warten, was der 
1us entsprechen sollte oder?
Leider ändert das jedoch nichts, die Frage ist auch warum das SCLK 
Signal so anders aussieht als die Daten auf DIN...
Gast #765772
Lesenswert?

>warum das SCLK Signal so anders aussieht als die Daten auf DIN
Wie sieht's denn aus?
Kannst ein Bild oder 'ne Skizze posten?

Deine Wait-Funktion:
1
void WaitOnePulse(void)
2
{
3
    for (int i = 0; i < 2; i++);
4
}
schreit förmlich danach, dass der Compiler die wegen Nutzlosigkeit 
komplett weg-optimiert. Ich vermute mal, Du hast null Delay!

Wenn Du genau 8 Taktzyklen Delay brauchst, versuch's mal mit 8 NOP's.
Nicht schön, aber effektiv!
Gast #765788
Lesenswert?

Also noch mal so als Anregung:

1.)
SCLK darf maximal 500kHz betragen (und das auch nur bei 3,6V) !!!
Es steht Dir frei für SCLK auch eine wesentlich kleinere Frequenz zu 
wählen, was ich Dir -zumindest zum Testen- auch dringend empfehlen 
würde, um Fehler wegen zu hohem SCLK auszuschließen.

2.)
1
for (int i = 0; i < 9; i++)
2
{
3
  _NOP();
4
}
macht keine 8TZ Delay, sondern mehr, wegen Overhead der Schleife ;-)
Aber bei größeren Delay-Zeiten wird das vernachlässigbar(er)
OP #765833
Lesenswert?

In der main rufe ich nur read_absdruck(); auf, vorher werden die Ports 
nat. gesetzt als Ausgang etc.

Der Sensor ist so angeschlossen 
http://zmwr3hoj.multipic.de/unbenannt.bmp.jpg

In der Main mache ich vorher folgendes:
1
P2DIR = 0x0B;               // P2.0, P2.1, P2.3 als Ausgang (AbsDruckSens)
2
P2SEL = 0x01;               // P2.0 als ACLK

Dann kommt der Funktionsaufruf read_absdruck();

Das ist eigentlich alles, läuft in nem größeren Programm, das funzt 
auch, nur das Auslesen klappt nicht so ;)

Außerdem hier nochma die #defines
1
// Absolutdrucksensor Datenuebertragung
2
#define SDI BIT1
3
#define SDO BIT2
4
#define SCK BIT3
5
#define PRESSURE 1
6
#define TEMPERATURE 0
7

8
#define HIGH 1
9
#define LOW 0
Gast #765835
Lesenswert?

DIN und SCLK-Leitung vertauscht?
Deine Daten an DIN (Bild2) sind mit 22,22kHz fast doppelt so schnell, 
wie SCLK (Bild4) mit 10,8kHz. Das kann so nicht sein!

Ausserdem läuft Dein MSP niemals mit 8MHz, denn Dein SCLK (vermutlich 
DIN ;-))
läuft mit 22,22kHz, was einer Wartezeit in WaitOnePulse() von etwa 22µs 
entspricht, was wiederum 180TZ @ 8MHz wären!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren