6°A PIO IX TP1. Ejercicio 1. ALMADA, Santiago MAVER, Francisco

Dependencies:   LinkedList

Dependents:   temp_prueba

Revision:
14:c591209285e9
Parent:
12:196e9e54b033
Child:
15:236eb8f8e73a
--- a/DS1820.cpp	Mon Mar 09 20:41:08 2015 +0000
+++ b/DS1820.cpp	Sun Jan 08 17:26:21 2017 +0000
@@ -1,5 +1,56 @@
 #include "DS1820.h"
 
+#ifdef TARGET_STM
+//STM targets use opendrain mode since their GPIO code is too bad to be used like the others
+    #define ONEWIRE_INPUT(pin)  pin->write(1)
+    #define ONEWIRE_OUTPUT(pin) 
+    #define ONEWIRE_INIT(pin)   pin->output(); pin->mode(OpenDrain)
+    
+    // TEMP, remove once STM fixed their stuff
+// Enable GPIO clock and return GPIO base address 
+static uint32_t Set_GPIO_Clock(uint32_t port_idx) { 
+    uint32_t gpio_add = 0; 
+    switch (port_idx) { 
+        case PortA: 
+           gpio_add = GPIOA_BASE; 
+           __GPIOA_CLK_ENABLE(); 
+           break; 
+        case PortB: 
+            gpio_add = GPIOB_BASE; 
+            __GPIOB_CLK_ENABLE(); 
+            break; 
+#if defined(GPIOC_BASE) 
+        case PortC: 
+            gpio_add = GPIOC_BASE; 
+            __GPIOC_CLK_ENABLE(); 
+            break; 
+#endif 
+#if defined(GPIOD_BASE) 
+       case PortD: 
+           gpio_add = GPIOD_BASE; 
+            __GPIOD_CLK_ENABLE(); 
+            break; 
+#endif 
+#if defined(GPIOF_BASE) 
+        case PortF: 
+            gpio_add = GPIOF_BASE; 
+            __GPIOF_CLK_ENABLE(); 
+            break; 
+#endif 
+      default: 
+           error("Pinmap error: wrong port number."); 
+           break; 
+   } 
+   return gpio_add; 
+} 
+
+
+#else
+    #define ONEWIRE_INPUT(pin)  pin->input()
+    #define ONEWIRE_OUTPUT(pin) pin->output()
+    #define ONEWIRE_INIT(pin)
+#endif
+
 LinkedList<node> DS1820::probes;
  
  
@@ -12,6 +63,20 @@
     for(byte_counter=0;byte_counter<9;byte_counter++)
         RAM[byte_counter] = 0x00;
     
+    ONEWIRE_INIT((&_datapin));
+    // Temp code since the above doesn't actually do anything in mbed revisions up to 133
+    #ifdef TARGET_STM
+    
+    uint32_t port_index = STM_PORT(data_pin); 
+    uint32_t pin_index  = STM_PIN(data_pin); 
+    
+    // Enable GPIO clock 
+    uint32_t gpio_add = Set_GPIO_Clock(port_index); 
+    GPIO_TypeDef *gpio = (GPIO_TypeDef *)gpio_add; 
+
+    gpio->OTYPER |= (uint32_t)(1 << pin_index); 
+    #endif
+    
     if (!unassignedProbe(&_datapin, _ROM))
         error("No unassigned DS1820 found!\n");
     else {
@@ -35,10 +100,10 @@
 bool DS1820::onewire_reset(DigitalInOut *pin) {
 // This will return false if no devices are present on the data bus
     bool presence=false;
-    pin->output();
+    ONEWIRE_OUTPUT(pin);
     pin->write(0);          // bring low for 500 us
     wait_us(500);
-    pin->input();       // let the data line float high
+    ONEWIRE_INPUT(pin);       // let the data line float high
     wait_us(90);            // wait 90us
     if (pin->read()==0) // see if any devices are pulling the data line low
         presence=true;
@@ -47,7 +112,7 @@
 }
  
 void DS1820::onewire_bit_out (DigitalInOut *pin, bool bit_data) {
-    pin->output();
+    ONEWIRE_OUTPUT(pin);
     pin->write(0);
     wait_us(3);                 // DXP modified from 5
     if (bit_data) {
@@ -70,10 +135,10 @@
  
 bool DS1820::onewire_bit_in(DigitalInOut *pin) {
     bool answer;
-    pin->output();
+    ONEWIRE_OUTPUT(pin);
     pin->write(0);
     wait_us(3);                 // DXP modofied from 5
-    pin->input();
+    ONEWIRE_INPUT(pin);
     wait_us(10);                // DXP modified from 5
     answer = pin->read();
     wait_us(45);                // DXP modified from 50
@@ -93,6 +158,19 @@
 
 bool DS1820::unassignedProbe(PinName pin) {
     DigitalInOut _pin(pin);
+    ONEWIRE_INIT((&_pin));
+    // Temp code since the above doesn't actually do anything in mbed revisions up to 133
+    #ifdef TARGET_STM
+    
+    uint32_t port_index = STM_PORT(pin); 
+    uint32_t pin_index  = STM_PIN(pin); 
+    
+    // Enable GPIO clock 
+    uint32_t gpio_add = Set_GPIO_Clock(port_index); 
+    GPIO_TypeDef *gpio = (GPIO_TypeDef *)gpio_add; 
+
+    gpio->OTYPER |= (uint32_t)(1 << pin_index); 
+    #endif
     char ROM_address[8];
     return search_ROM_routine(&_pin, 0xF0, ROM_address);
 }