Skip to content

Commit cb4763f

Browse files
authored
Merge pull request #161 from fprwi6labs/add_comments_spi
Improve SPI library code understanding
2 parents d09167f + 185488f commit cb4763f

File tree

3 files changed

+281
-106
lines changed

3 files changed

+281
-106
lines changed

libraries/SPI/README.md

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
## SPI
2+
3+
STM32 SPI library has been modified with the possibility to manage several CS pins without to stop the SPI interface.
4+
_We do not describe here the [SPI Arduino API](https://www.arduino.cc/en/Reference/SPI) but the functionalities added._
5+
6+
We give to the user 3 possiblities about the management of the CS pin:
7+
1. the CS pin is managed directly by the user code before to transfer the data (like the Arduino SPI library)
8+
2. the user gives the CS pin number to the library API and the library manages itself the CS pin (see example below)
9+
3. the user uses a hardware CS pin linked to the SPI peripheral
10+
11+
### New API functions
12+
13+
* **`SPIClass::SPIClass(uint8_t mosi, uint8_t miso, uint8_t sclk, uint8_t ssel)`**: alternative class constructor
14+
_Params_ SPI mosi pin
15+
_Params_ SPI miso pin
16+
_Params_ SPI sclk pin
17+
_Params_ (optional) SPI ssel pin. This pin must be an hardware CS pin. If you configure this pin, the chip select will be managed by the SPI peripheral. Do not use API functions with CS pin in parameter.
18+
19+
* **`void SPIClass::begin(uint8_t _pin)`**: initialize the SPI interface and add a CS pin
20+
_Params_ spi CS pin to be managed by the SPI library
21+
22+
* **`void beginTransaction(uint8_t pin, SPISettings settings)`**: allows to configure the SPI with other parameter. These new parameter are saved this an associated CS pin.
23+
_Params_ SPI CS pin to be managed by the SPI library
24+
_Params_ SPI settings
25+
26+
* **`void endTransaction(uint8_t pin)`**: removes a CS pin and the SPI settings associated
27+
_Params_ SPI CS pin managed by the SPI library
28+
29+
**_Note 1_** The following functions must be called after initialization of the SPI instance with `begin()` or `beginTransaction()`.
30+
If you have several device to manage, you can call `beginTransaction()` several time with different CS pin in parameter.
31+
Then you can call the following functions with different CS pin without call again `beginTransaction()` (until you call `end()` or `endTransaction()`).
32+
33+
**_Note 2_** If the mode is set to `SPI_CONTINUE`, the CS pin is kept enabled. Be careful in case you use several CS pin.
34+
35+
* **`byte transfer(uint8_t pin, uint8_t _data, SPITransferMode _mode = SPI_LAST)`**: write/read one byte
36+
_Params_ SPI CS pin managed by the SPI library
37+
_Params_ data to write
38+
_Params_ (optional) if `SPI_LAST` CS pin is reset, `SPI_CONTINUE` the CS pin is kept enabled.
39+
_Return_ byte received
40+
41+
* **`uint16_t transfer16(uint8_t pin, uint16_t _data, SPITransferMode _mode = SPI_LAST)`**: write/read half-word
42+
_Params_ SPI CS pin managed by the SPI library
43+
_Params_ 16bits data to write
44+
_Params_ (optional) if `SPI_LAST` CS pin is reset, `SPI_CONTINUE` the CS pin is kept enabled.
45+
_Return_ 16bits data received
46+
47+
* **`void transfer(uint8_t pin, void *_buf, size_t _count, SPITransferMode _mode = SPI_LAST)`**: write/read several bytes. Only one buffer used to write and read the data
48+
_Params_ SPI CS pin managed by the SPI library
49+
_Params_ pointer to data to write. The data will be replaced by the data read.
50+
_Params_ number of data to write/read.
51+
_Params_ (optional) if `SPI_LAST` CS pin is reset, `SPI_CONTINUE` the CS pin is kept enabled.
52+
53+
* **`void transfer(byte _pin, void *_bufout, void *_bufin, size_t _count, SPITransferMode _mode = SPI_LAST)`**: write/read several bytes. One buffer for the output data and one for the input data
54+
_Params_ SPI CS pin managed by the SPI library
55+
_Params_ pointer to data to write.
56+
_Params_ pointer where to store the data read.
57+
_Params_ number of data to write/read.
58+
_Params_ (optional) if `SPI_LAST` CS pin is reset, `SPI_CONTINUE` the CS pin is kept enabled.
59+
60+
### Example
61+
62+
This is an example of the use of the CS pin management:
63+
64+
```C++
65+
SPI.begin(2); //Enables the SPI instance with default settings and attachs the CS pin
66+
SPI.beginTransaction(1, settings); //Attachs another CS pin and configure the SPI instance with other settings
67+
SPI.transfer(1, 0x52); //Transfers data to the first device
68+
SPI.transfer(2, 0xA4); //Transfers data to the second device. The SPI instance is configured with the right settings
69+
SPI.end() //SPI instance is disabled
70+
```

0 commit comments

Comments
 (0)