Forum: Mikrocontroller und Digitale Elektronik STM32 HAL_SPI_Transmit, wofür Size?


von Rudii (Gast)


Lesenswert?

Moin,
ich arbeite mit der HAL-Firmware und einem STM32F411RE.

Benutzen tue ich gerade das SPI Modul und habe mich gefragt wofür der 
Size Parameter ist?

Size: amount of data to be sent.

Ich meine....
1. Lege ich bei der Initialisierung des SPIs fest das es 8bit sind.
2. Ist der Datenpuffer (pData: pointer to data buffer) angegeben und auf 
uint8 beschränkt. Wozu dann bei Size uint16? ...oder ist nur der Pointer 
uint8 groß aber die Variable dahinter kann größer sein?

Als Beispiel, sende ich in einer For-Schleife insgesamt 192bit in 8bit 
Paketen(ist für einen TLC5940):
1
int16_t for_gsCounter = 0;
2
for(for_gsCounter = 0; for_gsCounter < tlcs_in_series*192-1; for_gsCounter+=8)
3
{
4
 HAL_SPI_Transmit_IT(&hspi2, &gsData[spi_tx_counter], 7);//Hier die 7!!!
5
 while(HAL_SPI_GetState(&hspi2) != HAL_SPI_STATE_READY){}
6
 spi_tx_counter++;
7
}

Ich habe hier 7 (8-1) gewählt. Habe aber Probleme, sprich die Bits 
werden irgendwie völlig falsch gesendet. Liegts vll an Size?

MfG.

von Rudii (Gast)


Lesenswert?

Hier wäre noch gsData[] zur Vollständigkeit.
1
uint8_t gsData[24] = {
2
  0b11111111,
3
  0b11111111,
4
  0b11111111,
5
  0b11111111,
6
  0b11111111,
7
  0b11111111,
8
  0b11111111,
9
  0b11111111,
10
  0b11111111,
11
  0b11111111,
12
  0b11111111,
13
  0b11111111,
14
  0b11111111,
15
  0b11111111,
16
  0b11111111,
17
  0b11111111,
18
  0b11111111,
19
  0b11111111,
20
  0b11111111,
21
  0b11111111,
22
  0b11111111,
23
  0b11111111,
24
  0b11110000,
25
  0b00000000
26
};

von Little B. (lil-b)


Lesenswert?

Size ist nicht die Anzahl der Bits, die du senden willst.
Das hast du ja schon bemerkt, dass du das bereits bei der 
Initialisierung eingestellt hast.

Size gibt statt dessen an, wieviele Bytes/Wörter in dem Buffer stehen 
und verschickt werden sollen. Du brauchst also nicht jedes Byte einzeln 
schicken, sondern die Funktion übernimmt das alles für dich.

von Rudii (Gast)


Lesenswert?

Also könnte ich jetzt als pdata(was oben &gsData[spi_tx_counter] ist) 
einen uint32_t nehmen. Und würde dann bei Size 4(32/8) reinschreiben?

Also:
1
uint32_t gsData = ...;
2
HAL_SPI_Transmit_IT(&hspi2, &gsData, 4);

Und er würde mir automatisch alle 32bits senden?
MfG.

von Rudii (Gast)


Lesenswert?

Auf jeden Fall funktioniert jetzt alles, also denke ich habs verstanden 
:)

DANKE!!!
MfG.

von Andy L. (Gast)


Lesenswert?

Müsste es nicht lauten:
1
HAL_SPI_Transmit_IT(&hspi2, &gsData, 24);

da Du ja 24 Byte versenden willst.

von Rudii (Gast)


Lesenswert?

@Andy L.

Ja, Entschuldigung wenn ich euch jetzt durcheinander bringe. Wenn man 
das obige Beispiel nimmt im 1. Post von mir, ja.

Funktioniert auf jeden Fall alles :)
MfG.

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.