Skip to content

Commit 754bc29

Browse files
Merge branch 'stevstrong-master'
2 parents 6bbb5dc + ffea958 commit 754bc29

File tree

18 files changed

+94
-64
lines changed

18 files changed

+94
-64
lines changed

STM32F1/cores/maple/HardwareTimer.cpp

100755100644
File mode changed.

STM32F1/cores/maple/HardwareTimer.h

100755100644
File mode changed.

STM32F1/cores/maple/libmaple/adc.c

100755100644
File mode changed.

STM32F1/cores/maple/libmaple/adc_f1.c

100755100644
File mode changed.

STM32F1/cores/maple/libmaple/spi.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ void spi_master_enable(spi_dev *dev,
6868
spi_reconfigure(dev, baud | flags | SPI_CR1_MSTR | mode);
6969
}
7070

71+
7172
/**
7273
* @brief Configure and enable a SPI device as a bus slave.
7374
*
@@ -157,8 +158,9 @@ void spi_rx_dma_disable(spi_dev *dev) {
157158
*/
158159

159160
static void spi_reconfigure(spi_dev *dev, uint32 cr1_config) {
160-
spi_irq_disable(dev, SPI_INTERRUPTS_ALL);
161-
spi_peripheral_disable(dev);
162-
dev->regs->CR1 = cr1_config;
163-
spi_peripheral_enable(dev);
161+
#define MASK (SPI_CR1_CRCEN|SPI_CR1_DFF)
162+
spi_irq_disable(dev, SPI_INTERRUPTS_ALL);
163+
if ( (dev->regs->CR1&MASK)!=(cr1_config&MASK) ) spi_peripheral_disable(dev);
164+
dev->regs->CR1 = cr1_config;
165+
spi_peripheral_enable(dev);
164166
}

STM32F1/cores/maple/libmaple/timer.c

100755100644
File mode changed.

STM32F1/cores/maple/libmaple/usb/stm32f1/usb_cdcacm.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -393,15 +393,13 @@ void usb_cdcacm_putc(char ch) {
393393
;
394394
}
395395

396-
/* This function is non-blocking.
396+
/* This function is blocking.
397397
*
398398
* It copies data from a usercode buffer into the USB peripheral TX
399399
* buffer, and returns the number of bytes copied. */
400400
uint32 usb_cdcacm_tx(const uint8* buf, uint32 len) {
401401
/* Last transmission hasn't finished, so abort. */
402-
if (usb_cdcacm_is_transmitting()) {
403-
return 0;
404-
}
402+
while ( usb_cdcacm_is_transmitting()>0 ) ; // wait for end of transmission
405403

406404
/* We can only put USB_CDCACM_TX_EPSIZE bytes in the buffer. */
407405
if (len > USB_CDCACM_TX_EPSIZE) {
@@ -567,7 +565,7 @@ static void vcomDataRxCb(void) {
567565

568566
n_unread_bytes += ep_rx_size;
569567

570-
if (n_unread_bytes == 0) {
568+
if ( n_unread_bytes == 0 ) {
571569
usb_set_ep_rx_count(USB_CDCACM_RX_ENDP, USB_CDCACM_RX_EPSIZE);
572570
usb_set_ep_rx_stat(USB_CDCACM_RX_ENDP, USB_EP_STAT_RX_VALID);
573571
}

STM32F1/cores/maple/wirish_analog.cpp

100755100644
File mode changed.

STM32F1/cores/maple/wirish_types.h

100755100644
File mode changed.

STM32F1/libraries/SPI/src/SPI.cpp

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -142,28 +142,23 @@ SPIClass::SPIClass(uint32 spi_num) {
142142
* Set up/tear down
143143
*/
144144
void SPIClass::updateSettings(void) {
145-
uint32 flags = ((_currentSetting->bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | SPI_DFF_8_BIT | SPI_SW_SLAVE | SPI_SOFT_SS);
145+
uint32 flags = ((_currentSetting->bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | _currentSetting->dataSize | SPI_SW_SLAVE | SPI_SOFT_SS);
146146
#ifdef SPI_DEBUG
147147
Serial.print("spi_master_enable("); Serial.print(_currentSetting->clockDivider); Serial.print(","); Serial.print(_currentSetting->dataMode); Serial.print(","); Serial.print(flags); Serial.println(")");
148148
#endif
149149
spi_master_enable(_currentSetting->spi_d, (spi_baud_rate)_currentSetting->clockDivider, (spi_mode)_currentSetting->dataMode, flags);
150150
}
151151

152152
void SPIClass::begin(void) {
153-
154153
spi_init(_currentSetting->spi_d);
155154
configure_gpios(_currentSetting->spi_d, 1);
156155
updateSettings();
157156
}
158157

159158
void SPIClass::beginSlave(void) {
160-
if (_currentSetting->dataMode >= 4) {
161-
ASSERT(0);
162-
return;
163-
}
164-
uint32 flags = ((_currentSetting->bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | SPI_DFF_8_BIT | SPI_SW_SLAVE);
165159
spi_init(_currentSetting->spi_d);
166160
configure_gpios(_currentSetting->spi_d, 0);
161+
uint32 flags = ((_currentSetting->bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | _currentSetting->dataSize | SPI_SW_SLAVE);
167162
#ifdef SPI_DEBUG
168163
Serial.print("spi_slave_enable("); Serial.print(_currentSetting->dataMode); Serial.print(","); Serial.print(flags); Serial.println(")");
169164
#endif
@@ -195,7 +190,8 @@ void SPIClass::setClockDivider(uint32_t clockDivider)
195190
Serial.print("Clock divider set to "); Serial.println(clockDivider);
196191
#endif
197192
_currentSetting->clockDivider = clockDivider;
198-
updateSettings();
193+
uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_BR);
194+
_currentSetting->spi_d->regs->CR1 = cr1 | (clockDivider & SPI_CR1_BR);
199195
}
200196

201197
void SPIClass::setBitOrder(BitOrder bitOrder)
@@ -204,7 +200,9 @@ void SPIClass::setBitOrder(BitOrder bitOrder)
204200
Serial.print("Bit order set to "); Serial.println(bitOrder);
205201
#endif
206202
_currentSetting->bitOrder = bitOrder;
207-
updateSettings();
203+
uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_LSBFIRST);
204+
if ( bitOrder==LSBFIRST ) cr1 |= SPI_CR1_LSBFIRST;
205+
_currentSetting->spi_d->regs->CR1 = cr1;
208206
}
209207

210208
/* Victor Perez. Added to test changing datasize from 8 to 16 bit modes on the fly.
@@ -213,11 +211,9 @@ void SPIClass::setBitOrder(BitOrder bitOrder)
213211
*/
214212
void SPIClass::setDataSize(uint32 datasize)
215213
{
216-
uint32 cr1 = _currentSetting->spi_d->regs->CR1;
217-
datasize &= SPI_CR1_DFF;
218-
cr1 &= ~(SPI_CR1_DFF);
219-
cr1 |= datasize;
220-
_currentSetting->spi_d->regs->CR1 = cr1;
214+
_currentSetting->dataSize = datasize;
215+
uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_DFF);
216+
_currentSetting->spi_d->regs->CR1 = cr1 | (datasize & SPI_CR1_DFF);
221217
}
222218

223219
void SPIClass::setDataMode(uint8_t dataMode)
@@ -236,13 +232,11 @@ SPI Mode CPOL CPHA Shift SCK-edge Capture SCK-edge
236232
On the STM32 it appears to be
237233
238234
bit 1 - CPOL : Clock polarity
239-
240235
(This bit should not be changed when communication is ongoing)
241236
0 : CLK to 0 when idle
242237
1 : CLK to 1 when idle
243238
244239
bit 0 - CPHA : Clock phase
245-
246240
(This bit should not be changed when communication is ongoing)
247241
0 : The first clock transition is the first data capture edge
248242
1 : The second clock transition is the first data capture edge
@@ -253,10 +247,10 @@ If someone finds this is not the case or sees a logic error with this let me kno
253247
Serial.print("Data mode set to "); Serial.println(dataMode);
254248
#endif
255249
_currentSetting->dataMode = dataMode;
256-
updateSettings();
250+
uint32 cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_CPOL|SPI_CR1_CPHA);
251+
_currentSetting->spi_d->regs->CR1 = cr1 | (dataMode & (SPI_CR1_CPOL|SPI_CR1_CPHA));
257252
}
258253

259-
260254
void SPIClass::beginTransaction(uint8_t pin, SPISettings settings)
261255
{
262256
#ifdef SPI_DEBUG
@@ -267,10 +261,22 @@ void SPIClass::beginTransaction(uint8_t pin, SPISettings settings)
267261
//digitalWrite(_SSPin,LOW);
268262
setBitOrder(settings.bitOrder);
269263
setDataMode(settings.dataMode);
264+
setDataSize(settings.dataSize);
270265
setClockDivider(determine_baud_rate(_currentSetting->spi_d, settings.clock));
271266
begin();
272267
}
273268

269+
void SPIClass::beginTransactionSlave(SPISettings settings)
270+
{
271+
#ifdef SPI_DEBUG
272+
Serial.println(F("SPIClass::beginTransactionSlave"));
273+
#endif
274+
setBitOrder(settings.bitOrder);
275+
setDataMode(settings.dataMode);
276+
setDataSize(settings.dataSize);
277+
beginSlave();
278+
}
279+
274280
void SPIClass::endTransaction(void)
275281
{
276282
#ifdef SPI_DEBUG
@@ -354,6 +360,15 @@ void SPIClass::write(const uint8 *data, uint32 length) {
354360
}
355361
}
356362

363+
uint16_t SPIClass::transfer16(uint16_t wr_data) const {
364+
spi_tx_reg(_currentSetting->spi_d, wr_data); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)."
365+
while (spi_is_rx_nonempty(_currentSetting->spi_d) == 0); // "4. Wait until RXNE=1 ..."
366+
uint16_t rd_data = spi_rx_reg(_currentSetting->spi_d); // "... and read the last received data."
367+
// while (spi_is_tx_empty(_currentSetting->spi_d) == 0); // "5. Wait until TXE=1 ..."
368+
// while (spi_is_busy(_currentSetting->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI."
369+
return rd_data;
370+
}
371+
357372
uint8 SPIClass::transfer(uint8 byte) const {
358373
spi_tx_reg(_currentSetting->spi_d, byte); // "2. Write the first data item to be transmitted into the SPI_DR register (this clears the TXE flag)."
359374
while (spi_is_rx_nonempty(_currentSetting->spi_d) == 0); // "4. Wait until RXNE=1 ..."

0 commit comments

Comments
 (0)