mbed library sources

Dependents:   Freedman_v2 Nucleo_i2c_OLED_BME280_copy

Fork of mbed-src by mbed official

Revision:
576:99a3d3d9c43f
Parent:
558:0880f51c4036
Child:
601:248b0d2dd755
--- a/targets/cmsis/TARGET_WIZNET/TARGET_W7500x/W7500x_i2c.c	Wed Jun 24 09:45:13 2015 +0100
+++ b/targets/cmsis/TARGET_WIZNET/TARGET_W7500x/W7500x_i2c.c	Tue Jun 30 09:45:08 2015 +0100
@@ -4,6 +4,13 @@
   * @{
   */
 
+GPIO_InitTypeDef GPIO_InitDef;
+void i2c_loop_us(int us);
+
+#define SCL GPIO_Pin_9
+#define SDA GPIO_Pin_10
+uint16_t buf[] ={0x00,0x01};
+
 /**
   * @brief  Initializes the I2Cx peripheral according to the specified 
   *   parameters in the I2C_InitStruct.
@@ -12,10 +19,6 @@
   *   contains the configuration information for the specified I2C peripheral.
   * @retval None
   */
-void I2C_Delay(uint32_t nCount)
-{
-    for(; nCount != 0; nCount--);
-}
 
 uint32_t I2C_Init(I2C_TypeDef* I2Cx, I2C_ConfigStruct conf)
 {
@@ -67,7 +70,7 @@
 ErrorStatus I2C_Start(I2C_TypeDef* I2Cx, uint16_t slave_address, I2C_CTR ctr)
 {
     ErrorStatus ret;
-
+          
     I2C_GenerateSTART(I2Cx,ENABLE);
     I2C_SendSlaveAddress(I2Cx,slave_address,(I2C_CTR)ctr);
     I2C_GenerateSTART(I2Cx,DISABLE);
@@ -81,6 +84,10 @@
 {
     I2C_GenerateSTOP(I2Cx,ENABLE);
     I2C_GenerateSTOP(I2Cx,DISABLE);
+    GPIO_InitDef.GPIO_Pin = GPIO_Pin_9; // Set to Pin_9 (SCL0))
+    GPIO_InitDef.GPIO_Mode = GPIO_Mode_OUT; // Set to Mode Output
+    HAL_GPIO_Init(GPIOA, &GPIO_InitDef);
+    HAL_PAD_AFConfig(PAD_PA,GPIO_Pin_9, PAD_AF0); // PAD Config - LED used 2nd Function
 }
 
 void I2C_Reset(I2C_TypeDef* I2Cx)
@@ -97,28 +104,38 @@
 
 int8_t I2C_SendDataAck(I2C_TypeDef* I2Cx,uint16_t Data)
 {
-    I2Cx -> TXR = (uint16_t)Data;
-    if(I2C_CheckEvent(I2Cx,I2C_ACKR) == ERROR)
+    buf[0] = Data;
+    if(buf[0] == buf[1])
     {
-        return ERROR;
-    }           
+        I2C_GPIO();
+        WriteByte(Data);     
+        i2c_loop_us(1);
+        GPIO_I2C();
+    }
+    else
+    {
+        I2Cx -> TXR = (uint16_t)Data;
+        if(I2C_CheckEvent(I2Cx,I2C_ACKR) == ERROR)
+        {
+            return ERROR;
+        }           
+    }
+    buf[1] = buf[0];
     return SUCCESS;
 }
 
 int I2C_ReceiveData(I2C_TypeDef* I2Cx, int last)    
 {
-    if( I2C_CheckEvent(I2Cx,I2C_ACKT) == ERROR )
-        return -1;    
-     
     if(last)
     {   
         I2C_AcknowledgeConfig(I2Cx,DISABLE);
-        if( I2C_CheckEvent(I2Cx,I2C_ACKT) == ERROR )
+        if( I2C_CheckEvent(I2Cx,I2C_ACKT) == ERROR ) {
             return -1; 
-
-        I2C_Stop(I2Cx);
-    }   
-
+        }
+    }
+    else if( I2C_CheckEvent(I2Cx,I2C_ACKT) == ERROR ) {
+            return -1;    
+    }
      
     return (uint8_t)I2Cx -> RXR;    
 }
@@ -177,8 +194,14 @@
   */
 void I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState)
 {
-    if(NewState != DISABLE)     I2Cx->CMDR = I2C_CMDR_STA;
-    else                        I2Cx->CMDR = I2C_CMDR_STA;
+    if(NewState != DISABLE)     
+    {    
+        I2Cx->CMDR = I2C_CMDR_STA;  
+    }
+    else                        
+    {
+        I2Cx->CMDR = I2C_CMDR_STA;
+    }
  }
 /**
   * @brief  Generates I2Cx communication STOP condition.
@@ -189,8 +212,16 @@
   */
 void I2C_GenerateSTOP(I2C_TypeDef* I2Cx, FunctionalState NewState)
 {
-    if(NewState != DISABLE)     I2Cx->CMDR = I2C_CMDR_STO;
-    else                        I2Cx->CMDR = I2C_CMDR_STO;
+    if(NewState != DISABLE)     
+    {   
+
+        I2Cx->CMDR = I2C_CMDR_STO;
+
+    }
+    else               
+    {
+        I2Cx->CMDR = I2C_CMDR_STO;
+    }
 }
 
 /**
@@ -408,81 +439,6 @@
 }
 
 
-/*
-void I2C_MasterInit(I2C_TypeDef *  I2Cx,uint8_t Prescale,uint16_t Timeout,I2C_CTR Ctr)       
-{
-    switch(Ctr)
-    {
-        case(I2C_WRITE_SA7):     //000
-        case(I2C_READ_SA7):      //001
-            I2C_CoreEn(I2Cx,ENABLE);
-        break;
-        
-        case(I2C_WRITE_SA10):     //010
-        case(I2C_READ_SA10):      //011
-            I2C_CoreEn(I2Cx,ENABLE);
-            I2C_SlaveAddressLength(I2Cx,ENABLE);
-        break;
-        
-        case(I2C_CTRWRITE_SA7):     //100
-            I2C_CoreEn(I2Cx,ENABLE);
-            I2C_ControlEn(I2Cx,ENABLE);
-        break;
-    
-        case(I2C_CTRREAD_SA7):      //101
-            I2C_CoreEn(I2Cx,ENABLE);
-            I2C_ControlRW(I2Cx,ENABLE);
-            I2C_ControlEn(I2Cx,ENABLE);
-        break;
-
-        case(I2C_CTRWRITE_SA10):    //110
-            I2C_CoreEn(I2Cx,ENABLE);
-            I2C_ControlRW(I2Cx,DISABLE);
-            I2C_ControlEn(I2Cx,ENABLE);
-            I2C_SlaveAddressLength(I2Cx,ENABLE);
-        break;
-        case(I2C_CTRREAD_SA10):     //111
-            I2C_CoreEn(I2Cx,ENABLE);
-            I2C_ControlRW(I2Cx,ENABLE);
-            I2C_ControlEn(I2Cx,ENABLE);
-            I2C_SlaveAddressLength(I2Cx,ENABLE);
-        break;
-        
-        default:
-            return;
-        
-     }     
-
-    I2C_MasterSlave(I2Cx,ENABLE);
-    I2C_MasterSlave(I2Cx,DISABLE);
-    I2C_MasterSlave(I2Cx,ENABLE);
-    
-    I2C_Prescale(I2Cx,Prescale);            // 0x61         //When PLL clk is 20MHz and Prescale value set 0x61, SCL is 100KHz
-  	I2C_TimeoutSet(I2Cx,Timeout);          // 0xFFFF        
-  	 
-#if defined(I2C_INT)
-    I2C_CoreEn(I2Cx,DISABLE);
-    I2C_InterEn(I2Cx,ENABLE);
-#else
-    I2C_CoreEn(I2Cx,DISABLE);
-  
-#endif
-
-}	
- 
-void I2C_SlaveInit(I2C_TypeDef * I2Cx, FunctionalState NewState,uint16_t data)
-{
-    if(NewState != DISABLE)
-    {
-        I2C_SlaveAddressLength(I2Cx,ENABLE);
-    }   
-    else
-        I2C_AcknowledgeConfig(I2Cx,ENABLE);
-
-    I2C_SetSlavAddress(I2Cx,data);
-}
-*/	
- 
 void I2C_SendSlaveAddress(I2C_TypeDef* I2Cx, uint8_t SlaveAddress,I2C_CTR Ctr)
 {
     switch(Ctr)
@@ -495,19 +451,9 @@
         case(I2C_WRITE_SA7):
             I2C_SendData(I2Cx,SlaveAddress|I2C_WRITE);
         break;
-        
-//        case(I2C_READ_SA10):
-//            I2C_SendData(I2Cx,SlaveAddress|I2C_READ);
-//        break;
-//
-//        case(I2C_WRITE_SA10):
-//            I2C_SendData(I2Cx,SlaveAddress|I2C_WRITE);
-//        break;
-        
+ 
         case(I2C_CTRWRITE_SA7):
         case(I2C_CTRREAD_SA7):
-//        case(I2C_CTRWRITE_SA10):
-//        case(I2C_CTRREAD_SA10):
              I2C_SendData(I2Cx,SlaveAddress);
         break;
         
@@ -561,3 +507,83 @@
   return (*(__IO uint16_t *) tmp);
 }
 
+    
+void I2C_GPIO(void )
+{
+        GPIO_InitDef.GPIO_Pin = GPIO_Pin_9; // Set to Pin_9 (SCL0))
+        GPIO_InitDef.GPIO_Mode = GPIO_Mode_OUT; // Set to Mode Output
+        HAL_GPIO_Init(GPIOA, &GPIO_InitDef);
+        HAL_PAD_AFConfig(PAD_PA,GPIO_Pin_9, PAD_AF1); // PAD Config - LED used 2nd Function
+        
+        GPIO_InitDef.GPIO_Pin = GPIO_Pin_10; // Set to Pin_9 (SCL0))
+        GPIO_InitDef.GPIO_Mode = GPIO_Mode_OUT; // Set to Mode Output
+        HAL_GPIO_Init(GPIOA, &GPIO_InitDef);
+        HAL_PAD_AFConfig(PAD_PA,GPIO_Pin_10, PAD_AF1); // PAD Config - LED used 2nd Function
+ 
+}
+void GPIO_I2C(void )
+{
+       GPIO_InitDef.GPIO_Pin = GPIO_Pin_9; // Set to Pin_9 (SCL0))
+       GPIO_InitDef.GPIO_Mode = GPIO_Mode_OUT; // Set to Mode Output
+       HAL_GPIO_Init(GPIOA, &GPIO_InitDef);
+       HAL_PAD_AFConfig(PAD_PA,GPIO_Pin_9, PAD_AF0); // PAD Config - LED used 2nd Function
+        
+       GPIO_InitDef.GPIO_Pin = GPIO_Pin_10; // Set to Pin_10 (SDA0))
+       GPIO_InitDef.GPIO_Mode = GPIO_Mode_IN; // Set to Mode Output
+       HAL_GPIO_Init(GPIOA, &GPIO_InitDef);
+       HAL_PAD_AFConfig(PAD_PA,GPIO_Pin_10, PAD_AF0); // PAD Config - LED used 2nd Functio
+
+}
+
+
+void WriteByte(uint8_t val)
+{
+    int  i;
+    GPIO_TypeDef* GPIOx;
+    GPIOx = GPIOA;
+
+	for(i=0;i<8;i++)
+	{
+		if((val << i) & 0x80){
+			digitalWrite(GPIOx,SDA, Bit_SET);
+		}else{
+			digitalWrite(GPIOx,SDA, Bit_RESET);
+		}
+        i2c_loop_us(1);
+		digitalWrite(GPIOx,SCL, Bit_SET);
+        i2c_loop_us(2);
+		digitalWrite(GPIOx,SCL, Bit_RESET);
+	}
+	digitalWrite(GPIOx,SDA, Bit_SET);
+    i2c_loop_us(1);
+	digitalWrite(GPIOx,SCL, Bit_SET);
+	i2c_loop_us(2);
+    digitalWrite(GPIOx,SCL, Bit_RESET);
+}
+
+
+void digitalWrite(GPIO_TypeDef* GPIOx,uint16_t pin, uint16_t val)
+{
+    
+    if(val == Bit_SET)
+    {
+        GPIOx -> OUTENCLR = pin;
+    }
+    else
+    {
+        GPIOx -> OUTENSET |= pin;
+        
+    }
+}
+
+
+void i2c_loop_us(int us)
+{
+    volatile uint32_t delay = us; // approximate loops per ms at 24 MHz, Debug config
+    for(; delay != 0; delay--)
+        __NOP();
+}
+void i2c_loop_ms(int count) {
+    i2c_loop_us(count*1000);
+}
+