diff --git a/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/device.h b/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/device.h index d9fad1fedf..fd151e3566 100644 --- a/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/device.h +++ b/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/device.h @@ -42,10 +42,10 @@ #define DEVICE_SERIAL 1 #define DEVICE_I2C 1 -#define DEVICE_I2CSLAVE 0 // Not yet supported +#define DEVICE_I2CSLAVE 1 #define DEVICE_SPI 1 -#define DEVICE_SPISLAVE 0 // Not yet supported +#define DEVICE_SPISLAVE 1 #define DEVICE_RTC 1 diff --git a/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/i2c_api.c b/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/i2c_api.c index aef949f047..b2320b909a 100644 --- a/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/i2c_api.c +++ b/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/i2c_api.c @@ -313,7 +313,44 @@ void i2c_slave_mode(i2c_t *obj, int enable_slave) { #define WriteAddressed 3 // the master is writing to this slave (slave = receiver) int i2c_slave_receive(i2c_t *obj) { - return (0); + int retValue = NoData; + uint32_t event; + I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c); + + event = I2C_GetLastEvent( i2c ); + if(event != 0) + { + switch(event){ + case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED: + retValue = WriteAddressed; + break; + case I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED: + retValue = ReadAddressed; + break; + case I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED: + retValue = WriteGeneral; + break; + default: + retValue = NoData; + break; + } + + // clear ADDR + if((retValue == WriteAddressed) || (retValue == ReadAddressed)){ + i2c->SR1;// read status register 1 + i2c->SR2;// read status register 2 + } + // clear stopf + if(I2C_GetFlagStatus(i2c, I2C_FLAG_STOPF) == SET) { + i2c->SR1;// read status register 1 + I2C_Cmd(i2c, ENABLE); + } + // clear AF + if(I2C_GetFlagStatus(i2c, I2C_FLAG_AF) == SET) { + I2C_ClearFlag(i2c, I2C_FLAG_AF); + } + } + return(retValue); } int i2c_slave_read(i2c_t *obj, char *data, int length) { diff --git a/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/spi_api.c b/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/spi_api.c index 560447b0b6..3bde288813 100644 --- a/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/spi_api.c +++ b/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/spi_api.c @@ -138,7 +138,7 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel } else { // Slave pinmap_pinout(ssel, PinMap_SPI_SSEL); obj->mode = SPI_Mode_Slave; - obj->nss = SPI_NSS_Soft; + obj->nss = SPI_NSS_Hard; } init_spi(obj); @@ -270,7 +270,8 @@ int spi_master_write(spi_t *obj, int value) { } int spi_slave_receive(spi_t *obj) { - return (ssp_readable(obj) && !ssp_busy(obj)) ? (1) : (0); + //return (ssp_readable(obj) && !ssp_busy(obj)) ? (1) : (0); // initial code + return (ssp_readable(obj)) ? (1) : (0); // works better like this }; int spi_slave_read(spi_t *obj) {