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.