Skip to content

Commit 6d37d18

Browse files
committed
Merge pull request #525 from bcostm/fix_F072RB_spi_slave
[NUCLEO_F072RB] Fix 8-bit data access issue with SPI slave
2 parents c285cc8 + 91958f7 commit 6d37d18

File tree

1 file changed

+21
-9
lines changed
  • libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F072RB

1 file changed

+21
-9
lines changed

libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F072RB/spi_api.c

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -241,23 +241,21 @@ static inline int ssp_writeable(spi_t *obj) {
241241
static inline void ssp_write(spi_t *obj, int value) {
242242
SPI_TypeDef *spi = (SPI_TypeDef *)(obj->spi);
243243
while (!ssp_writeable(obj));
244-
245-
if (obj->bits <= SPI_DATASIZE_8BIT) {
246-
// force 8-bit access the data register due to SPI data buffer in this device
244+
if (obj->bits == SPI_DATASIZE_8BIT) {
245+
// Force 8-bit access to the data register
247246
uint8_t *p_spi_dr = 0;
248247
p_spi_dr = (uint8_t *) & (spi->DR);
249248
*p_spi_dr = (uint8_t)value;
250-
} else {
249+
} else { // SPI_DATASIZE_16BIT
251250
spi->DR = (uint16_t)value;
252251
}
253252
}
254253

255254
static inline int ssp_read(spi_t *obj) {
256255
SPI_TypeDef *spi = (SPI_TypeDef *)(obj->spi);
257256
while (!ssp_readable(obj));
258-
259-
if (obj->bits <= SPI_DATASIZE_8BIT) {
260-
// force 8-bit access the data register due to SPI data buffer in this device
257+
if (obj->bits == SPI_DATASIZE_8BIT) {
258+
// Force 8-bit access to the data register
261259
uint8_t *p_spi_dr = 0;
262260
p_spi_dr = (uint8_t *) & (spi->DR);
263261
return (int)(*p_spi_dr);
@@ -285,13 +283,27 @@ int spi_slave_receive(spi_t *obj) {
285283
int spi_slave_read(spi_t *obj) {
286284
SPI_TypeDef *spi = (SPI_TypeDef *)(obj->spi);
287285
while (!ssp_readable(obj));
288-
return (int)spi->DR;
286+
if (obj->bits == SPI_DATASIZE_8BIT) {
287+
// Force 8-bit access to the data register
288+
uint8_t *p_spi_dr = 0;
289+
p_spi_dr = (uint8_t *) & (spi->DR);
290+
return (int)(*p_spi_dr);
291+
} else {
292+
return (int)spi->DR;
293+
}
289294
}
290295

291296
void spi_slave_write(spi_t *obj, int value) {
292297
SPI_TypeDef *spi = (SPI_TypeDef *)(obj->spi);
293298
while (!ssp_writeable(obj));
294-
spi->DR = (uint16_t)value;
299+
if (obj->bits == SPI_DATASIZE_8BIT) {
300+
// Force 8-bit access to the data register
301+
uint8_t *p_spi_dr = 0;
302+
p_spi_dr = (uint8_t *) & (spi->DR);
303+
*p_spi_dr = (uint8_t)value;
304+
} else { // SPI_DATASIZE_16BIT
305+
spi->DR = (uint16_t)value;
306+
}
295307
}
296308

297309
int spi_busy(spi_t *obj) {

0 commit comments

Comments
 (0)