diff --git a/include/libopencm3/stm32/spi.h b/include/libopencm3/stm32/spi.h
index 3cadaf8c..30366579 100644
--- a/include/libopencm3/stm32/spi.h
+++ b/include/libopencm3/stm32/spi.h
@@ -290,6 +290,7 @@ void spi_disable(u32 spi);
void spi_write(u32 spi, u16 data);
void spi_send(u32 spi, u16 data);
u16 spi_read(u32 spi);
+u16 spi_xfer(u32 spi, u16 data);
void spi_set_bidirectional_mode(u32 spi);
void spi_set_unidirectional_mode(u32 spi);
void spi_set_bidirectional_receive_only_mode(u32 spi);
diff --git a/lib/stm32_common/spi.c b/lib/stm32_common/spi.c
index 7fb87115..71bb846c 100644
--- a/lib/stm32_common/spi.c
+++ b/lib/stm32_common/spi.c
@@ -77,7 +77,7 @@ void spi_write(u32 spi, u16 data)
void spi_send(u32 spi, u16 data)
{
/* wait for transfer finished */
- while (SPI_SR(spi) & SPI_SR_BSY );
+ while (!(SPI_SR(spi) & SPI_SR_TXE ));
/* Write data (8 or 16 bits, depending on DFF) into DR. */
SPI_DR(spi) = data;
@@ -85,6 +85,20 @@ void spi_send(u32 spi, u16 data)
u16 spi_read(u32 spi)
{
+ /* wait for transfer finished */
+ while (!(SPI_SR(spi) & SPI_SR_RXNE ));
+
+ /* Read the data (8 or 16 bits, depending on DFF bit) from DR. */
+ return SPI_DR(spi);
+}
+
+u16 spi_xfer(u32 spi, u16 data)
+{
+ spi_write(spi, data);
+
+ /* wait for transfer finished */
+ while (!(SPI_SR(spi) & SPI_SR_RXNE ));
+
/* Read the data (8 or 16 bits, depending on DFF bit) from DR. */
return SPI_DR(spi);
}
diff --git a/lib/stm32f1/scb.c b/lib/stm32f1/scb.c
index dfee6c37..54c57764 100644
--- a/lib/stm32f1/scb.c
+++ b/lib/stm32f1/scb.c
@@ -17,7 +17,7 @@
* along with this program. If not, see .
*/
-#include
+#include
void scb_reset_core(void)
{
diff --git a/lib/usb/usb_f103.c b/lib/usb/usb_f103.c
index 594d3c6b..ea173d78 100644
--- a/lib/usb/usb_f103.c
+++ b/lib/usb/usb_f103.c
@@ -17,10 +17,10 @@
* along with this program. If not, see .
*/
-#include
+#include
#include
#include
-#include
+#include
#include
#include "usb_private.h"
diff --git a/lib/usb/usb_f107.c b/lib/usb/usb_f107.c
index 134b728b..65c76b49 100644
--- a/lib/usb/usb_f107.c
+++ b/lib/usb/usb_f107.c
@@ -17,7 +17,7 @@
* along with this program. If not, see .
*/
-#include
+#include
#include
#include
#include