mbed w/ spi bug fig

Dependents:   display-puck

Fork of mbed-src by mbed official

Files at this revision

API Documentation at this revision

Comitter:
mbed_official
Date:
Fri May 23 10:30:07 2014 +0100
Parent:
207:05668db47a72
Child:
209:137057ef9d1e
Commit message:
Synchronized with git revision bf99806838a107a0a72f7824356e720c46afdc63

Full URL: https://github.com/mbedmicro/mbed/commit/bf99806838a107a0a72f7824356e720c46afdc63/

[NUCLEO_F103RB] Update xxx_free() function + typo corrections

Changed in this revision

targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/i2c_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/objects.h Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/pwmout_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/serial_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/spi_api.c Show annotated file Show diff for this revision Revisions of this file
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/i2c_api.c	Fri May 23 08:45:06 2014 +0100
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/i2c_api.c	Fri May 23 10:30:07 2014 +0100
@@ -181,7 +181,7 @@
     I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c);
     int timeout;
     int count;
-  
+
     i2c_start(obj);
 
     // Send slave address for write
@@ -245,7 +245,7 @@
     I2C_SendData(i2c, (uint8_t)data);
 
     // Wait until the byte is transmitted
-    timeout = FLAG_TIMEOUT;  
+    timeout = FLAG_TIMEOUT;
     while ((I2C_GetFlagStatus(i2c, I2C_FLAG_TXE) == RESET) &&
             (I2C_GetFlagStatus(i2c, I2C_FLAG_BTF) == RESET)) {
         timeout--;
@@ -299,10 +299,9 @@
     uint32_t event;
     I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c);
 
-    event = I2C_GetLastEvent( i2c );
-    if(event != 0)
-    {
-        switch(event){
+    event = I2C_GetLastEvent(i2c);
+    if (event != 0) {
+        switch (event) {
             case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED:
                 retValue = WriteAddressed;
                 break;
@@ -317,24 +316,24 @@
                 break;
         }
 
-        // clear ADDR 
-        if((retValue == WriteAddressed) || (retValue == ReadAddressed)){
+        // clear ADDR
+        if ((retValue == WriteAddressed) || (retValue == ReadAddressed)) {
             // read SR to clear ADDR flag
             i2c->SR1;
             i2c->SR2;
         }
         // clear stopf
-        if(I2C_GetFlagStatus(i2c, I2C_FLAG_STOPF) == SET) {
+        if (I2C_GetFlagStatus(i2c, I2C_FLAG_STOPF) == SET) {
             // read SR1 and write CR1 to clear STOP flag
             i2c->SR1;
-            I2C_Cmd(i2c,  ENABLE);    
+            I2C_Cmd(i2c,  ENABLE);
         }
         // clear AF
-        if(I2C_GetFlagStatus(i2c, I2C_FLAG_AF) == SET) {
+        if (I2C_GetFlagStatus(i2c, I2C_FLAG_AF) == SET) {
             I2C_ClearFlag(i2c, I2C_FLAG_AF);
-        }        
+        }
     }
-    return(retValue);
+    return (retValue);
 }
 
 int i2c_slave_read(i2c_t *obj, char *data, int length) {
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/objects.h	Fri May 23 08:45:06 2014 +0100
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/objects.h	Fri May 23 10:30:07 2014 +0100
@@ -65,6 +65,8 @@
     uint32_t databits;
     uint32_t stopbits;
     uint32_t parity;
+    PinName pin_tx;
+    PinName pin_rx;
 };
 
 struct spi_s {
@@ -75,6 +77,10 @@
     uint32_t mode;
     uint32_t nss;
     uint32_t br_presc;
+    PinName pin_miso;
+    PinName pin_mosi;
+    PinName pin_sclk;
+    PinName pin_ssel;
 };
 
 struct i2c_s {
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/pwmout_api.c	Fri May 23 08:45:06 2014 +0100
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/pwmout_api.c	Fri May 23 10:30:07 2014 +0100
@@ -98,8 +98,8 @@
 }
 
 void pwmout_free(pwmout_t* obj) {
-    TIM_TypeDef *tim = (TIM_TypeDef *)(obj->pwm);
-    TIM_DeInit(tim);
+    // Configure GPIO
+    pin_function(obj->pin, STM_PIN_DATA(GPIO_Mode_IN_FLOATING, 0));
 }
 
 void pwmout_write(pwmout_t* obj, float value) {
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/serial_api.c	Fri May 23 08:45:06 2014 +0100
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/serial_api.c	Fri May 23 10:30:07 2014 +0100
@@ -113,6 +113,9 @@
     obj->stopbits = USART_StopBits_1;
     obj->parity = USART_Parity_No;
 
+    obj->pin_tx = tx;
+    obj->pin_rx = rx;
+
     init_usart(obj);
 
     // The index is used by irq
@@ -128,6 +131,27 @@
 }
 
 void serial_free(serial_t *obj) {
+    // Reset UART and disable clock
+    if (obj->uart == UART_1) {
+        RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE);
+        RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, DISABLE);
+        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, DISABLE);
+    }
+    if (obj->uart == UART_2) {
+        RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, ENABLE);
+        RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, DISABLE);
+        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, DISABLE);
+    }
+    if (obj->uart == UART_3) {
+        RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, ENABLE);
+        RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, DISABLE);
+        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, DISABLE);
+    }
+
+    // Configure GPIOs
+    pin_function(obj->pin_tx, STM_PIN_DATA(GPIO_Mode_IN_FLOATING, 0));
+    pin_function(obj->pin_rx, STM_PIN_DATA(GPIO_Mode_IN_FLOATING, 0));
+
     serial_irq_ids[obj->index] = 0;
 }
 
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/spi_api.c	Fri May 23 08:45:06 2014 +0100
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/spi_api.c	Fri May 23 10:30:07 2014 +0100
@@ -119,6 +119,11 @@
     obj->cpha = SPI_CPHA_1Edge;
     obj->br_presc = SPI_BaudRatePrescaler_256;
 
+    obj->pin_miso = miso;
+    obj->pin_mosi = mosi;
+    obj->pin_sclk = sclk;
+    obj->pin_ssel = ssel;
+
     if (ssel == NC) { // Master
         obj->mode = SPI_Mode_Master;
         obj->nss = SPI_NSS_Soft;
@@ -132,8 +137,24 @@
 }
 
 void spi_free(spi_t *obj) {
-    SPI_TypeDef *spi = (SPI_TypeDef *)(obj->spi);
-    SPI_I2S_DeInit(spi);
+    // Reset SPI and disable clock
+    if (obj->spi == SPI_1) {
+        RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, ENABLE);
+        RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, DISABLE);
+        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, DISABLE);
+    }
+
+    if (obj->spi == SPI_2) {
+        RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, ENABLE);
+        RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, DISABLE);
+        RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, DISABLE);
+    }
+
+    // Configure GPIOs
+    pin_function(obj->pin_miso, STM_PIN_DATA(GPIO_Mode_IN_FLOATING, 0));
+    pin_function(obj->pin_mosi, STM_PIN_DATA(GPIO_Mode_IN_FLOATING, 0));
+    pin_function(obj->pin_sclk, STM_PIN_DATA(GPIO_Mode_IN_FLOATING, 0));
+    pin_function(obj->pin_ssel, STM_PIN_DATA(GPIO_Mode_IN_FLOATING, 0));
 }
 
 void spi_format(spi_t *obj, int bits, int mode, int slave) {