@@ -35,7 +35,54 @@ SPIClass SPI;
3535 * another CS pin and don't pass a CS pin as parameter to any functions
3636 * of the class.
3737 */
38- SPIClass::SPIClass (uint32_t mosi, uint32_t miso, uint32_t sclk, uint32_t ssel)
38+
39+ void SPIClass::applySettings (const SPISettings &settings)
40+ {
41+ _spiSettings = settings;
42+
43+ uint32_t clock = settings.getClockFreq ();
44+ SPIMode dataMode = settings.getDataMode ();
45+ BitOrder order = settings.getBitOrder ();
46+ SPIBusMode busMode = settings.getBusMode ();
47+
48+ // Mapping API dataMode → spi_mode_e C
49+ spi_mode_e cspimode;
50+ switch (dataMode) {
51+ case SPI_MODE0:
52+ cspimode = SPI_MODE0_C;
53+ break ;
54+ case SPI_MODE1:
55+ cspimode = SPI_MODE1_C;
56+ break ;
57+ case SPI_MODE2:
58+ cspimode = SPI_MODE2_C;
59+ break ;
60+ case SPI_MODE3:
61+ cspimode = SPI_MODE3_C;
62+ break ;
63+ default :
64+ cspimode = SPI_MODE0_C;
65+ break ;
66+ }
67+
68+ // Mapping API busMode → spi_busmode_e C
69+ spi_busmode_e cbusmode;
70+ switch (busMode) {
71+ case SPI_CONTROLLER:
72+ cbusmode = SPI_CONTROLLER_C;
73+ break ;
74+ case SPI_PERIPHERAL:
75+ cbusmode = SPI_PERIPHERAL_C;
76+ break ;
77+ default :
78+ cbusmode = SPI_CONTROLLER_C;
79+ break ;
80+ }
81+
82+ spi_init (&_spi, clock, cspimode, (uint8_t )order, cbusmode);
83+ }
84+
85+ SPIClass::SPIClass (pin_size_t mosi, pin_size_t miso, pin_size_t sclk, pin_size_t ssel)
3986{
4087 memset ((void *)&_spi, 0 , sizeof (_spi));
4188 _spi.pin_miso = digitalPinToPinName (miso);
@@ -46,29 +93,33 @@ SPIClass::SPIClass(uint32_t mosi, uint32_t miso, uint32_t sclk, uint32_t ssel)
4693
4794/* *
4895 * @brief Initialize the SPI instance.
49- * @param device: device mode (optional), SPI_MASTER or SPI_SLAVE . Default is master.
96+ * @param busMode: bus mode (optional), controller or peripheral . Default is master.
5097 */
51- void SPIClass::begin (SPIDeviceMode device )
98+ void SPIClass::begin (SPIBusMode busMode )
5299{
53100 _spi.handle .State = HAL_SPI_STATE_RESET;
54- _spiSettings = SPISettings ();
55- _spiSettings.deviceMode = device;
56- spi_init (&_spi, _spiSettings.clockFreq , _spiSettings.dataMode ,
57- _spiSettings.bitOrder , _spiSettings.deviceMode );
101+
102+ SPISettings defaultSettings (
103+ SPI_SPEED_CLOCK_DEFAULT, // 4 MHz
104+ MSBFIRST,
105+ SPI_MODE0,
106+ busMode
107+ );
108+
109+ applySettings (defaultSettings);
58110}
59111
60112/* *
61113 * @brief This function should be used to configure the SPI instance in case you
62114 * don't use the default parameters set by the begin() function.
63- * @param settings: SPI settings(clock speed, bit order, data mode, device mode).
115+ * @param settings: SPI settings(clock speed, bit order, data mode, bus mode).
64116 */
65117void SPIClass::beginTransaction (SPISettings settings)
66118{
67- if (_spiSettings != settings) {
68- _spiSettings = settings;
69- spi_init (&_spi, _spiSettings.clockFreq , _spiSettings.dataMode ,
70- _spiSettings.bitOrder , _spiSettings.deviceMode );
119+ if (_spiSettings == settings) {
120+ return ;
71121 }
122+ applySettings (settings);
72123}
73124
74125/* *
@@ -94,33 +145,40 @@ void SPIClass::end(void)
94145 */
95146void SPIClass::setBitOrder (BitOrder bitOrder)
96147{
97- _spiSettings.bitOrder = bitOrder;
98-
99- spi_init (&_spi, _spiSettings.clockFreq , _spiSettings.dataMode ,
100- _spiSettings.bitOrder , _spiSettings.deviceMode );
148+ SPISettings s (
149+ _spiSettings.getClockFreq (),
150+ bitOrder,
151+ _spiSettings.getDataMode (),
152+ _spiSettings.getBusMode ()
153+ );
154+ applySettings (s);
101155}
102156
103157/* *
104158 * @brief Deprecated function.
105159 * Configure the data mode (clock polarity and clock phase)
106- * @param mode : SPI_MODE0, SPI_MODE1, SPI_MODE2 or SPI_MODE3
160+ * @param dataMode : SPI_MODE0, SPI_MODE1, SPI_MODE2 or SPI_MODE3
107161 * @note
108162 * Mode Clock Polarity (CPOL) Clock Phase (CPHA)
109163 * SPI_MODE0 0 0
110164 * SPI_MODE1 0 1
111165 * SPI_MODE2 1 0
112166 * SPI_MODE3 1 1
113167 */
114- void SPIClass::setDataMode (uint8_t mode )
168+ void SPIClass::setDataMode (uint8_t dataMode )
115169{
116- setDataMode ((SPIMode)mode );
170+ setDataMode ((SPIMode)dataMode );
117171}
118172
119- void SPIClass::setDataMode (SPIMode mode )
173+ void SPIClass::setDataMode (SPIMode dataMode )
120174{
121- _spiSettings.dataMode = mode;
122- spi_init (&_spi, _spiSettings.clockFreq , _spiSettings.dataMode ,
123- _spiSettings.bitOrder , _spiSettings.deviceMode );
175+ SPISettings s (
176+ _spiSettings.getClockFreq (),
177+ _spiSettings.getBitOrder (),
178+ dataMode,
179+ _spiSettings.getBusMode ()
180+ );
181+ applySettings (s);
124182}
125183
126184/* *
@@ -131,15 +189,20 @@ void SPIClass::setDataMode(SPIMode mode)
131189 */
132190void SPIClass::setClockDivider (uint8_t divider)
133191{
192+ uint32_t clk;
134193 if (divider == 0 ) {
135- _spiSettings. clockFreq = SPI_SPEED_CLOCK_DEFAULT;
194+ clk = SPI_SPEED_CLOCK_DEFAULT;
136195 } else {
137- /* Get clk freq of the SPI instance and compute it */
138- _spiSettings.clockFreq = spi_getClkFreq (&_spi) / divider;
196+ clk = spi_getClkFreq (&_spi) / divider;
139197 }
140198
141- spi_init (&_spi, _spiSettings.clockFreq , _spiSettings.dataMode ,
142- _spiSettings.bitOrder , _spiSettings.deviceMode );
199+ SPISettings s (
200+ clk,
201+ _spiSettings.getBitOrder (),
202+ _spiSettings.getDataMode (),
203+ _spiSettings.getBusMode ()
204+ );
205+ applySettings (s);
143206}
144207
145208/* *
@@ -170,13 +233,13 @@ uint16_t SPIClass::transfer16(uint16_t data, bool skipReceive)
170233{
171234 uint16_t tmp;
172235
173- if (_spiSettings.bitOrder ) {
236+ if (_spiSettings.getBitOrder () ) {
174237 tmp = ((data & 0xff00 ) >> 8 ) | ((data & 0xff ) << 8 );
175238 data = tmp;
176239 }
177240 spi_transfer (&_spi, (uint8_t *)&data, (!skipReceive) ? (uint8_t *)&data : NULL , sizeof (uint16_t ));
178241
179- if (_spiSettings.bitOrder ) {
242+ if (_spiSettings.getBitOrder () ) {
180243 tmp = ((data & 0xff00 ) >> 8 ) | ((data & 0xff ) << 8 );
181244 data = tmp;
182245 }
@@ -250,7 +313,7 @@ void SPIClass::detachInterrupt(void)
250313}
251314
252315#if defined(SUBGHZSPI_BASE)
253- void SUBGHZSPIClass::enableDebugPins (uint32_t mosi, uint32_t miso, uint32_t sclk, uint32_t ssel)
316+ void SUBGHZSPIClass::enableDebugPins (pin_size_t mosi, pin_size_t miso, pin_size_t sclk, pin_size_t ssel)
254317{
255318 /* Configure SPI GPIO pins */
256319 pinmap_pinout (digitalPinToPinName (mosi), PinMap_SPI_MOSI);
0 commit comments