@@ -145,67 +145,77 @@ void sipeed_spi_deinit(spi_device_num_t spi_num)
145145 sysctl_clock_disable ( sysctl_clock_t (SYSCTL_CLOCK_SPI0 + spi_num));
146146}
147147
148+ // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
149+ // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
148150
149151
150152typedef struct {
151153 int8_t pin;
152154 bool used;
153155} spi_ss_t ;
154156
155- static spi_ss_t g_ss_table[4 ]={
156- {.pin = -1 , .used = false },
157- {.pin = -1 , .used = false },
158- {.pin = -1 , .used = false },
159- {.pin = -1 , .used = false }
157+ static spi_ss_t g_ss_table[2 ][4 ]={
158+ {// SPI0
159+ {.pin = -1 , .used = false },
160+ {.pin = -1 , .used = false },
161+ {.pin = -1 , .used = false },
162+ {.pin = -1 , .used = false }
163+ },
164+ {// SPI1
165+ {.pin = -1 , .used = false },
166+ {.pin = -1 , .used = false },
167+ {.pin = -1 , .used = false },
168+ {.pin = -1 , .used = false }
169+ }
160170};
161171
162- int8_t getSsByPin (int8_t pin)
172+ int8_t getSsByPin (uint8_t spi, int8_t pin)
163173{
164174 uint8_t i;
165175
166176 if (pin<0 )
167177 return -1 ;
168178 for (i=0 ; i<4 ; ++i)
169179 {
170- if (g_ss_table[i].used && g_ss_table[i].pin == pin)
180+ if (g_ss_table[spi][ i].used && g_ss_table[spi] [i].pin == pin)
171181 return i;
172182 }
173183 return -1 ;
174184}
175185
176- int8_t getSsNumLast ()
186+ int8_t getSsNumLast (uint8_t spi )
177187{
178188 uint8_t i=0 , count=0 ;
179189 for (i=0 ; i<4 ; ++i)
180190 {
181- if (!g_ss_table[i].used )
191+ if (!g_ss_table[spi][ i].used )
182192 ++count;
183193 }
184194 return count;
185195}
186196
187- bool checkSs (int8_t ss)
197+ bool checkSs (uint8_t spi, int8_t ss)
188198{
189199 int8_t ssPeriph;
190200 if ( ss < 0 ) // not use ss
191201 return true ;
192- ssPeriph = getSsByPin (ss);
202+ ssPeriph = getSsByPin (spi, ss);
193203 if (ssPeriph >= 0 )
194204 return true ;
195- if (getSsNumLast () > 0 )
205+ if (getSsNumLast (spi ) > 0 )
196206 return true ;
197207 return false ;
198208}
199209
200- int8_t setSs (int8_t pin)
210+ int8_t setSs (uint8_t spi, int8_t pin)
201211{
202212 uint8_t i=0 ;
203213 for (i=0 ; i<4 ; ++i)
204214 {
205- if (!g_ss_table[i].used )
215+ if (!g_ss_table[spi][ i].used )
206216 {
207- g_ss_table[i].used = true ;
208- g_ss_table[i].pin = pin;
217+ g_ss_table[spi][ i].used = true ;
218+ g_ss_table[spi][ i].pin = pin;
209219 return i;
210220 }
211221 }
@@ -217,9 +227,9 @@ int8_t setSs(int8_t pin)
217227 * @param mosi must >= 0
218228 * @param ss -1: not use hardware ss
219229 */
220- bool checkPinParam (int8_t sck, int8_t miso, int8_t mosi, int8_t ss)
230+ bool checkPinParam (uint8_t spi, int8_t sck, int8_t miso, int8_t mosi, int8_t ss)
221231{
222- if (!checkSs (ss))
232+ if (!checkSs (spi, ss))
223233 return false ;
224234 // TODO:
225235 return true ;
@@ -275,7 +285,7 @@ void SPIClass::begin(int8_t sck, int8_t miso, int8_t mosi, int8_t ss)
275285 mosi = _mosi;
276286 ss = _ss;
277287 }
278- configASSERT (checkPinParam (sck, miso, mosi, ss));
288+ configASSERT (checkPinParam (_spiNum, sck, miso, mosi, ss));
279289
280290 if (_spiNum == SPI_SOFT)
281291 {
@@ -288,7 +298,7 @@ void SPIClass::begin(int8_t sck, int8_t miso, int8_t mosi, int8_t ss)
288298 fpioa_set_function (sck, FUNC_SPI0_SCLK);
289299 if ( ss >= 0 )
290300 {
291- fpioa_function_t a = (fpioa_function_t )(FUNC_SPI0_SS0+setSs (ss));
301+ fpioa_function_t a = (fpioa_function_t )(FUNC_SPI0_SS0+setSs (_spiNum, ss));
292302 fpioa_set_function (ss, a);
293303 }
294304 fpioa_set_function (mosi, FUNC_SPI0_D0);
@@ -300,7 +310,7 @@ void SPIClass::begin(int8_t sck, int8_t miso, int8_t mosi, int8_t ss)
300310 fpioa_set_function (sck, FUNC_SPI1_SCLK);
301311 if ( ss >= 0 )
302312 {
303- fpioa_set_function (ss, (fpioa_function_t )(FUNC_SPI1_SS0+setSs (ss)));
313+ fpioa_set_function (ss, (fpioa_function_t )(FUNC_SPI1_SS0+setSs (_spiNum, ss)));
304314 }
305315 fpioa_set_function (mosi, FUNC_SPI1_D0);
306316 if (miso>=0 )
@@ -310,7 +320,7 @@ void SPIClass::begin(int8_t sck, int8_t miso, int8_t mosi, int8_t ss)
310320 _miso = miso;
311321 _sck = sck;
312322 _ss = ss;
313- _ssPeriph = getSsByPin (ss);
323+ _ssPeriph = getSsByPin (_spiNum, ss);
314324 if (_ssPeriph<0 )
315325 _ssPeriph = 0 ; // default to cs0 TODO: optimize?
316326 spi_init (spi_device_num_t (_spiNum), spi_work_mode_t (_dataMode), SPI_FF_STANDARD, 8 , 0 );
0 commit comments