Forum: Mikrocontroller und Digitale Elektronik ADS8344 funktioniert nur mit langsamen SPI


von Fritz (Gast)


Lesenswert?

Hallo zusammen,

Ich versuche derzeit einen ADS8344 auszulesen. Dies funktioniert soweit 
eigentlich. Jedoch habe ich das Problem, dass es nur funktioniert wenn 
ich einen sehr langsamen SPI Takt verwende. Das heisst, mit 130kHz Takt 
funktioniert alles ohne Probleme. Sobald ich aber auf beispielsweise 
1MHz erhöhe, funktioniert es nicht mehr. Laut Datenblatt sollten bis zu 
2.3MHz möglich sein.

Funktioniert nicht mehr bedeutet, dass immer der Wert 0 ausgelesen wird.

Ich verwende folgenden Code:
1
uint16_t ads8344_read(void)
2
{
3
    uint8_t temp = 0;
4
    uint32_t result = 0;
5
6
    ADS8344_ENABLE = 0;
7
8
    spi3_read_send(ADS8344_CONFIG | 1 << ADS8344_STARTBIT ); //CONFIG = 0x04 Startbit = 7
9
10
    // MSB from ADC
11
    temp = spi3_read_send(0);
12
    result = temp << 9;
13
14
    // LSB from ADC
15
    temp = spi3_read_send(0);
16
    result |= temp << 1;
17
18
    // last bit from adc
19
    temp = spi3_read_send(0);
20
    result |= temp >> 7;
21
22
    ADS8344_ENABLE = 1;
23
24
    return result;
25
}

Übersehe ich irgendwo etwas im Datenblatt?

Grüsse

von Klaus (Gast)


Lesenswert?

Fritz schrieb:
> Jedoch habe ich das Problem, dass es nur funktioniert wenn
> ich einen sehr langsamen SPI Takt verwende. Das heisst, mit 130kHz Takt
> funktioniert alles ohne Probleme.

Da geht bei mir als erstes die Signallampe: "auslesen mit der falschen 
Clockflanke?" an, als zweites: "Crosstalk zwischen Clock und Daten"

MfG Klaus

von Fritz (Gast)


Angehängte Dateien:

Lesenswert?

Der SPI Mode sollte soweit eigentlich stimmen. Das SPI Modul habe ich 
auf Mode 0 konfiguriert. Also CLK Idle Zustand ist low und Datenwechsel 
auf fallender Flanke.

Crosstalk habe ich soeben gemessen. Scheint nicht vorhanden zu sein. Ich 
habe ein Bild von der Übertragung der ersten 8 Bit angehängt.

von Fritz (Gast)


Lesenswert?

Okay ich hab es nun hinbekommen. Es läuft mit 2MHz. Die einzige Änderung 
die ich gemacht habe, ist ein Delay nach dem Senden des ersten Bytes 
eingefügt. Ich habe ein Minimum Delay von cirka 5.5us empirisch 
ermittelt.
Laut Datenblatt sollte dieses Delay jedoch nicht nötig sein.

Der Code mit dem Delay:
1
uint16_t ads8344_read(void)
2
{
3
    uint8_t temp = 0;
4
    uint32_t result = 0;
5
6
    ADS8344_ENABLE = 0;
7
    spi3_read_send(ADS8344_CONFIG | 1 << ADS8344_STARTBIT); //CONFIG = 0x04 Startbit = 7
8
9
    __delay32(400); //Delay 400 Cycles = 5.8us
10
11
    // MSB from ADC
12
    temp = spi3_read_send(0);
13
    result = temp << 9;
14
15
    // LSB from ADC
16
    temp = spi3_read_send(0);
17
    result |= temp << 1;
18
19
    // last bit from adc
20
    temp = spi3_read_send(0);
21
    result |= temp >> 7;
22
23
    ADS8344_ENABLE = 1;
24
    
25
    return result;
26
}

von spess53 (Gast)


Lesenswert?

Hi

>Laut Datenblatt sollte dieses Delay jedoch nicht nötig sein.

Wie fragst du BUSY ab?

MfG Spess

von Fritz (Gast)


Lesenswert?

spess53 schrieb:
> Wie fragst du BUSY ab?
>
> MfG Spess

Ich dachte das müsste ich im external clock Mode nicht abfragen. Im 
Datenblatt steht folgendes:
1
"BUSY will go HIGH for one clock period after the last bit of the control byte is shifted in"
oder auch:
1
"Since one clock cycle of the serial clock is consumed with BUSY going HIGH"

Deshalb dachte ich ich müsste das Busy nichtabfragen und könnte direkt 
mit dem auslesen beginnen.
Liege ich da falsch?

von Fritz (Gast)


Lesenswert?

Hat sonst noch jemand eine Idee? Ich hätte das Ganze gerne ohne Delay 
erledigt, so dass ich die Daten per DMA übertragen kann.

Grüsse

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
Noch kein Account? Hier anmelden.