ADS8344 funktioniert nur mit langsamen SPI

Gast #3972889
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
Gast #3972928
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
}
Gast #3972978
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?

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