STM32 SPI - 8Bit senden - 16Bit empfangen

OP #4841978
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
OP #4841994
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?
OP #4842029
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
Angehängte Dateien:
Gast #4842045
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.

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