SPI STM32 Hal zwischen 8 und 16 Bit Data Size umschalten

Gast #5822216
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
Gast #5822457
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.
Gast #5822516
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
Gast #5822536
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
}
Gast #5822537
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
}
Gast #5822569
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

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