Forum: Mikrocontroller und Digitale Elektronik STM32 SPI - 8Bit senden - 16Bit empfangen


von Markus M. (mmax)


Lesenswert?

Hallo,

Der Titel sagt eigentlich schon alles. Ist es mit einem STM32F103 
mögliche via SPI ein Byte zu senden und zwei zu empfangen? Im Datenblatt 
steht nämlich entweder oder (wenn ich das richtig interpretiere)

Wenn ja, wäre ich für Hinweise wie man den STM32 konfigurieren kann 
dankbar. Codebeispiel wäre natürlich optimal.

Ich möchte einen Sensor ansprechen (MS5611), der genau das verlangt. 
Bzw. es muss immer 8 Bit geschickt und 16 oder 24 Bit empfangen werden.

Danke,
Max

von hp-freund (Gast)


Lesenswert?

Siehe: Dummy Byte

von Markus M. (mmax)


Lesenswert?

Also immer auf die Größe der zu erwartenden Daten aufblasen? Sprich wenn 
ich 16/24Bit erwarte, dann auch so viel verschicken?

von hp-freund (Gast)


Lesenswert?

Ja. Die Takte musst Du so oder so liefern.

von Markus M. (mmax)


Lesenswert?

Bei den Codebeispielen von ST wird immer gesendet und direkt danach 
gleich empfangen ... schätze mal weil alles über das selbe Register (SPI 
Data Register) läuft.
1
uint16_t MS5611_Transfer( uint16_t data ) {
2
    // Write data to be transmitted to the SPI data register
3
    SPIx->DR = data;
4
    // Wait until transmit complete
5
    while (!(SPIx->SR & (SPI_I2S_FLAG_TXE)));
6
    // Wait until receive complete
7
    while (!(SPIx->SR & (SPI_I2S_FLAG_RXNE)));
8
    // Wait until SPI is not busy anymore
9
    while (SPIx->SR & (SPI_I2S_FLAG_BSY));
10
    // Return received data from SPI data register
11
    return SPIx->DR;
12
}

Hmmm ... vielleicht ein Byte senden, nichts auslesen und dann nochmal 
zwei oder drei mal ein Byte versenden und diese Werte einlesen?

von hp-freund (Gast)


Lesenswert?

Ist zwar AVR, aber im Prinzip das Gleiche. Seite 3 in:

http://www.amsys.info/sheets/amsys.en.an520_e.pdf

von Markus M. (mmax)


Angehängte Dateien:

Lesenswert?

Danke ... jetzt ist es mir soweit klar.
1
void MS5611_ReadPROM(uint16_t prom[8]) {
2
    uint8_t i;
3
    
4
    MS5611_EnableSlave();
5
    
6
    for (i = 0; i < 1; i++) {
7
        MS5611_Transfer(CMD_MS5611_PROM + (i << 1));
8
        prom[i] = 256 * MS5611_Transfer(0x00);
9
        prom[i] += MS5611_Transfer(0x00);
10
    }
11
    
12
    MS5611_DisableSlave();
13
}

Aber wenn ich mir die Oszi screenshots anschaue scheint mir nur das CS 
(Chip Select, ROT) und das Clock-Signal (1.Bild) zu passen ... MOSI 
(2.Bild) und MISO (3.Bild) ist doch totaler Mist!

Jemand eine Idee?

Hier noch meine Initialisierung:
1
void MS5611_init(void) {
2
    SPI_InitTypeDef SPI_InitStruct;
3
    GPIO_InitTypeDef GPIO_InitStruct;
4
5
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
6
    SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
7
    SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;
8
    SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;
9
    SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
10
    SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
11
    SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
12
    SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
13
    SPI_InitStruct.SPI_NSS = SPI_NSS_Soft | SPI_NSSInternalSoft_Set;
14
    SPI_Init(SPI1, &SPI_InitStruct); 
15
16
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
17
    // GPIO pins for MOSI (PA7), MISO (PA6), and SCL (PA5)
18
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_6 | GPIO_Pin_5;
19
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
20
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
21
    GPIO_Init(GPIOA, &GPIO_InitStruct);
22
    // GPIO pin for CS (PA4)
23
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;
24
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
25
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
26
    GPIO_Init(GPIOA, &GPIO_InitStruct);
27
28
    SPI_Cmd(SPI1, ENABLE);
29
    
30
    // Disable SPI slave device
31
    MS5611_DisableSlave();
32
}

Fällt jemanden was im Code auf?

Danke,
Max

von hp-freund (Gast)


Lesenswert?

Da ich den Sensor nicht habe, will ich auch nicht weiter forschen.

Aber ich finde das im Datenblatt eigentlich der Ablauf gut beschrieben 
ist.

http://www.amsys.info/sheets/amsys.en.ms5611_01ba03.pdf

von here (Gast)


Lesenswert?

Auf Deinen Screenshots sieht es so aus, als wenn MOSI und MISO 
vertauscht sind: In Bild 2 treiben offensichtlich zwei Signale 
gegeneinander (drei Zustände auf der Leitung) und in Bild 3 lauschen 
zwei Eingänge und fangen sich die Flanken vom SCK ein.

Prüf das mal.

von Markus M. (mmax)


Lesenswert?

Stimmt ... leider hatte ich MISO und MOSI am Sensor vertauscht. Obwohl 
ichs einige male überprüft hatte.

Danke!

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.