STM32 macht 17 Takte auf SPI

Gast #5799982
Lesenswert?

Moin,

mit folgenden Zeilen initialisiere ich meine SPI:
1
  oSPI->CR1 = 0;
2
  oSPI->CR2 = 0;
3
  oSPI->CR2 |= (0b0111ul << 8); //8Bit
4
  oSPI->CR2 |= SPI_CR2_SSOE;
5
  oSPI->CR1 |= SPI_CR1_SSM;
6
  oSPI->CR1 |= SPI_CR1_SSI;
7
  //oSPI->CR1 |= SPI_CR1_LSBFIRST;
8
  //oSPI->CR1 |= SPI_CR1_CPHA;
9
  //oSPI->CR1 |= SPI_CR1_CPOL;
10
  oSPI->CR1 |= SPI_CR1_MSTR;
11
  oSPI->CR1 |= (6ul<<3);  //Takt durch 128 (prescaler)
12
  oSPI->CR1 |= SPI_CR1_SPE;

Wenn ich nun probeweise im Sekundentakt ein Byte raussenden möchte, sehe 
ich 17 Takte auf der SPI Leitung - egal welche Bitbreite ich in CR2 
eintrage? Warum ist das so?

Ist der Prozessor buggy? Es ist ein STM32F070.
Angehängte Dateien:
Gast #5800023
Lesenswert?

DR ist ein 16-Bit breites Register! Daher werden mit
  oSPI->DR = cVal;
ZWEI Bytes in den TX-FIFO geschrieben. Dass cVal ein uint8_t ist, 
spielt dabei keine Rolle. Entsprechend werden mit
  u8Result = oSPI->DR;
ZWEI Bytes aus dem RX-FIFO gelesen (und das "obere" gleich wieder 
weggeworfen).

Wenn die Datenbreite beim SPI auf höchstens 8 Bit eingestellt ist, wird 
immer automatisch "gepackt", s. Fig. 254 im RM0360.

Wenn man das nicht will, muss oSPI->DR auf (uint8_t *) gecasted werden.
Gast #5800127
Lesenswert?

Hier mein aktueller Code, der nach wie vor 2 bytes schickt. Das mit dem 
"Data Packing" habe ich soweit verstanden, aber es werden trotzdem zwei 
Bytes verschickt:
1
void SPI_Init(SPI_TypeDef * oSPI, uint8_t ucPrescaler){
2
  oSPI->CR1 = 0;
3
  oSPI->CR2 = 0;
4
  oSPI->CR1 |= SPI_CR1_SSM;
5
  //oSPI->CR1 |= SPI_CR1_SSI;
6
  //oSPI->CR1 |= SPI_CR1_LSBFIRST;
7
  //oSPI->CR1 |= SPI_CR1_CPHA;
8
  //oSPI->CR1 |= SPI_CR1_CPOL;
9
  oSPI->CR1 |= SPI_CR1_MSTR;
10
  oSPI->CR1 |= ((uint16_t)ucPrescaler<<3);
11
  oSPI->CR2 |= (0b0111ul << 8);
12
  oSPI->CR2 |= SPI_CR2_SSOE;
13
  oSPI->CR2 |= SPI_CR2_FRXTH;
14
  //oSPI->CR2 |= SPI_CR2_FRF;
15
  oSPI->CR1 |= SPI_CR1_SPE;
16
}
17

18
uint8_t SPI_Send(SPI_TypeDef * oSPI, uint8_t cVal){
19
  uint8_t u8Result;
20

21
  *(uint8_t *)&oSPI->DR = cVal;
22
  while(!(oSPI->SR & SPI_SR_RXNE));
23
  //u8Result = oSPI->DR;
24

25
  return u8Result;
26
}

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