Forum: Mikrocontroller und Digitale Elektronik SPI STM32 Hal zwischen 8 und 16 Bit Data Size umschalten


von lego (Gast)


Lesenswert?

Guten Tag,
ich verwende zur Zeit den STM32F103 mit Spi mit 16Bit Data Size.
Ich muss jetzt noch ein Serielles Eeprom 25LC1024 am selben SPI 
betreiben.
Das EEprom mag aber 8Bit Data Size.
Ist es möglich die Data Size im Betrieb um zu schalten?
reicht es das ich
1
HAL_SPI_DeInit(&hspi2);
2
hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
3
if (HAL_SPI_Init(&hspi1) != HAL_OK)
4
  {
5
    Error_Handler();
6
  }

oder ist das nicht genug?

Danke
Kurt

von Rath Geber (Gast)


Lesenswert?

lego schrieb:
> Ist es möglich die Data Size im Betrieb um zu schalten?

Ist es möglich diesen einfachen Sachverhalt einfach auszuprobieren?

Eine Sache von maximal 15 Minuten. Und du wartest lieber
hier zwei Stunden bis eine Antwort kommt?

von Bernd (Gast)


Lesenswert?

Auch mit HAL kann man auf die Register direkt zugreifen:
1
#define WAIT_SPI_READY      while((( SPI_Handle.Instance->SR) & SPI_FLAG_TXE) != SPI_FLAG_TXE);
2
#define WAIT_SPIRX_READY    while((( SPI_Handle.Instance->SR) & SPI_FLAG_RXNE) != SPI_FLAG_RXNE);
3
#define SPI_16BIT_MODE      SPI_Handle.Instance->CR1 |= SPI_CR1_DFF
4
#define SPI_8BIT_MODE       SPI_Handle.Instance->CR1 &= ~(SPI_CR1_DFF)
5
#define SPI_SEND(x)         SPI_Handle.Instance->DR = x
6
#define SPI_READ            SPI_Handle.Instance->DR
7
#define SPI_CLEAR_RX        SPI_Handle.Instance->SR &= ~(SPI_FLAG_OVR)
8
9
...
10
11
void spi_data( uint8_t data)
12
{
13
        WAIT_SPI_READY;
14
        SPI_8BIT_MODE;
15
        SPI_SEND( data);
16
        SPI_CLEAR_RX;
17
}
18
19
void spi_data16( uint16_t data)
20
{
21
        WAIT_SPI_READY;
22
        SPI_16BIT_MODE;
23
        SPI_SEND( data);
24
        SPI_CLEAR_RX;
25
}
Der Code ist dann nicht mehr unbedingt portabel, aber man kann sich die 
Suche nach der HAL-Dokumentation sparen und direkt mit dem jeweiligen 
Reference Manual arbeiten.

von lego (Gast)


Lesenswert?

Bernd schrieb:
> Auch mit HAL kann man auf die Register direkt zugreifen:#define
> WAIT_SPI_READY      while((( SPI_Handle.Instance->SR) & SPI_FLAG_TXE) !=
> SPI_FLAG_TXE);

> void spi_data( uint8_t data)
> {
>         WAIT_SPI_READY;
>         SPI_8BIT_MODE;
>         SPI_SEND( data);
>         SPI_CLEAR_RX;
> }
>
> void spi_data16( uint16_t data)
> {
>         WAIT_SPI_READY;
>         SPI_16BIT_MODE;
>         SPI_SEND( data);
>         SPI_CLEAR_RX;
> }
> Der Code ist dann nicht mehr unbedingt portabel, aber man kann sich die
> Suche nach der HAL-Dokumentation sparen und direkt mit dem jeweiligen
> Reference Manual arbeiten.

Ok sieht gut aus! Ich habe kein Ozi da zu probieren werde es aber 
testen:)
Danke

von Bimbo. (Gast)


Lesenswert?

Wäre es nicht wesentlich einfach, es immer bei 8 bit zu belassen und die 
16 bit in jeeils zwei 8bit Paketen zu versenden..?

Pseudocode:
1
uint8_t SPI_8bit(uint8_t u8Data){
2
....
3
  return data;
4
}
5
6
void SPI_16bit(uint8_t u8Data){
7
  uint16_t u16Data;
8
9
  u16Data = SPI_8bit(u8Data >> 8);
10
  u16Data <<= 8;
11
  u16Data |= SPI_8bit(u8Data & 0xff);
12
13
  return u16Data;
14
}

von Bimbo. (Gast)


Lesenswert?

1
uint8_t SPI_8bit(uint8_t u8Data){
2
....
3
  return u8Result;
4
}
5
6
uint16_t SPI_16bit(uint16_t u16Data){
7
  uint16_t u16Result;
8
9
  u16Result= SPI_8bit(u8Data >> 8);
10
  u16Result<<= 8;
11
  u16Result|= SPI_8bit(u8Data & 0xff);
12
13
  return u16Result;
14
}

von Boahh Eyy (Gast)


Lesenswert?

Bimbo. schrieb:
> Wäre es nicht wesentlich einfach, es immer bei 8 bit zu belassen und die
> 16 bit in jeeils zwei 8bit Paketen zu versenden..?

Und was machst du Schlaumeier wenn die SPI-Mschine den
Chip Select bedient?

von lego (Gast)


Lesenswert?

Boahh Eyy schrieb:
> Und was machst du Schlaumeier wenn die SPI-Mschine den
> Chip Select bedient?

im meinen Fall bediene ich den CS per Hand.
Also könnte das auch funktionieren

von Bimbo. (Gast)


Lesenswert?

Boahh Eyy schrieb:
> Und was machst du Schlaumeier wenn die SPI-Mschine den
> Chip Select bedient?

Korrigiere mich Herr Schlaumeier, aber soweit ich weiß kann der SPI vom 
STM32F103 kein CS in Hardware steuern. Wenn ich mich da irre bitte 
korrigieren.
Ansonsten ist cas sowieso Ausnahme und habe ich bei der Frage des TOs 
auch nicht erwartet, siehe:

lego schrieb:
> im meinen Fall bediene ich den CS per Hand.
> Also könnte das auch funktionieren

von Bimbo. (Gast)


Lesenswert?

Bimbo. schrieb:
> Korrigiere mich Herr Schlaumeier, aber soweit ich weiß kann der SPI vom
> STM32F103 kein CS in Hardware steuern. Wenn ich mich da irre bitte
> korrigieren.

Kann man, gerade nachgelesen. Ändert nichts an meiner Erwartung.

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.