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
Also immer auf die Größe der zu erwartenden Daten aufblasen? Sprich wenn ich 16/24Bit erwarte, dann auch so viel verschicken?
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?
Ist zwar AVR, aber im Prinzip das Gleiche. Seite 3 in: http://www.amsys.info/sheets/amsys.en.an520_e.pdf
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.


