From e128390284971357b92c0bafae1484688ccc876f Mon Sep 17 00:00:00 2001 From: hjjeon0608 Date: Tue, 16 Jun 2015 08:13:27 +0900 Subject: [PATCH 1/7] Uncomment gpio_set function. --- .../hal/TARGET_WIZNET/TARGET_W7500x/gpio_api.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/libraries/mbed/targets/hal/TARGET_WIZNET/TARGET_W7500x/gpio_api.c b/libraries/mbed/targets/hal/TARGET_WIZNET/TARGET_W7500x/gpio_api.c index e19b5540b4..d40f2f01c7 100644 --- a/libraries/mbed/targets/hal/TARGET_WIZNET/TARGET_W7500x/gpio_api.c +++ b/libraries/mbed/targets/hal/TARGET_WIZNET/TARGET_W7500x/gpio_api.c @@ -34,14 +34,14 @@ extern uint32_t Get_GPIO_BaseAddress(uint32_t port_idx); -//uint32_t gpio_set(PinName pin) -//{ -// MBED_ASSERT(pin != (PinName)NC); +uint32_t gpio_set(PinName pin) +{ + MBED_ASSERT(pin != (PinName)NC); -// //pin_function(pin, WIZ_PIN_DATA(WIZ_MODE_INPUT, WIZ_GPIO_NOPULL, 1)); + pin_function(pin, WIZ_PIN_DATA(WIZ_MODE_INPUT, WIZ_GPIO_NOPULL, Px_AFSR_AF1)); -// return (uint32_t)(1 << ((uint32_t)pin & 0xF)); // Return the pin mask -//} + return (uint32_t)(1 << ((uint32_t)pin & 0xF)); // Return the pin mask +} void gpio_init(gpio_t *obj, PinName pin) { From bc8070d2a9d5195e2744de63e42a541f8372e306 Mon Sep 17 00:00:00 2001 From: hjjeon0608 Date: Wed, 17 Jun 2015 11:16:02 +0900 Subject: [PATCH 2/7] Update I2C driver and hal api. --- .../TARGET_WIZNET/TARGET_W7500x/W7500x_i2c.c | 237 ++++++++++-------- .../TARGET_WIZNET/TARGET_W7500x/W7500x_i2c.h | 73 +++--- .../hal/TARGET_WIZNET/TARGET_W7500x/i2c_api.c | 85 +++++-- 3 files changed, 237 insertions(+), 158 deletions(-) diff --git a/libraries/mbed/targets/cmsis/TARGET_WIZNET/TARGET_W7500x/W7500x_i2c.c b/libraries/mbed/targets/cmsis/TARGET_WIZNET/TARGET_W7500x/W7500x_i2c.c index 0d23d46774..7099c0ff92 100644 --- a/libraries/mbed/targets/cmsis/TARGET_WIZNET/TARGET_W7500x/W7500x_i2c.c +++ b/libraries/mbed/targets/cmsis/TARGET_WIZNET/TARGET_W7500x/W7500x_i2c.c @@ -4,6 +4,13 @@ * @{ */ +GPIO_InitTypeDef GPIO_InitDef; +void delay_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 @@ void I2C_DeInit(I2C_TypeDef* I2Cx) 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); @@ -97,11 +100,23 @@ void I2C_SendData(I2C_TypeDef* I2Cx,uint16_t Data) 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); + delay_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; } @@ -177,8 +192,14 @@ int I2C_Burst_Write(I2C_TypeDef* I2Cx, uint16_t address, uint8_t *data, int leng */ 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 +210,16 @@ void I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState) */ 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 +437,6 @@ ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx,I2C_SR sr) } -/* -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 +449,9 @@ void I2C_SendSlaveAddress(I2C_TypeDef* I2Cx, uint8_t SlaveAddress,I2C_CTR Ctr) 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 +505,98 @@ uint16_t I2C_ReadRegister(I2C_TypeDef* I2Cx, uint8_t I2C_Register) 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_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_AF0); // PAD Config - LED used 2nd Functio + +} + +void digitalWrite(GPIO_TypeDef* GPIOx,uint16_t pin, uint16_t val) +{ + + if(val == Bit_SET) + { + GPIOx -> OUTENCLR = pin; + } + else + { + GPIOx -> OUTENSET |= pin; + + } +} + +uint16_t digitalRead(GPIO_TypeDef* GPIOx,uint16_t pin) +{ + uint16_t bitstatus = 0x0000; + + if((GPIOx->DATA & pin) != (uint32_t)Bit_RESET) + { + bitstatus = (uint8_t)Bit_SET; + } + else + { + bitstatus = (uint8_t)Bit_RESET; + } + + return bitstatus; +} + +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); + } + delay_us(1); + digitalWrite(GPIOx,SCL, Bit_SET); + delay_us(2); + digitalWrite(GPIOx,SCL, Bit_RESET); + // IIC_Byte<<=1; + } + digitalWrite(GPIOx,SDA, Bit_SET); + delay_us(1); + digitalWrite(GPIOx,SCL, Bit_SET); + delay_us(2); + digitalWrite(GPIOx,SCL, Bit_RESET); +} + + +void delay_us(int us) +{ + volatile uint32_t delay = us; // approximate loops per ms at 24 MHz, Debug config + for(; delay != 0; delay--) + __NOP(); +} +void delay_ms(int count) { + delay_us(count*1000); +} + diff --git a/libraries/mbed/targets/cmsis/TARGET_WIZNET/TARGET_W7500x/W7500x_i2c.h b/libraries/mbed/targets/cmsis/TARGET_WIZNET/TARGET_W7500x/W7500x_i2c.h index 683dee9296..0767c6ca4c 100644 --- a/libraries/mbed/targets/cmsis/TARGET_WIZNET/TARGET_W7500x/W7500x_i2c.h +++ b/libraries/mbed/targets/cmsis/TARGET_WIZNET/TARGET_W7500x/W7500x_i2c.h @@ -1,18 +1,41 @@ +/* mbed Microcontroller Library + ******************************************************************************* + * Copyright (c) 2015 WIZnet Co.,Ltd. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of ARM Limited nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + */ + #include "W7500x.h" -/** -* @defgroup I2C_Public_Types I2X Public Types -*/ typedef enum { I2C_WRITE_SA7=0, I2C_READ_SA7, - //I2C_WRITE_SA10, - //I2C_READ_SA10, I2C_CTRWRITE_SA7, I2C_CTRREAD_SA7, - //I2C_CTRWRITE_SA10, - //I2C_CTRREAD_SA10, } I2C_CTR; typedef enum @@ -64,32 +87,6 @@ typedef enum ((REGISTER) == I2C_Register_ISR)|| \ ((REGISTER) == I2C_Register_ISCR)| \ ((REGISTER) == I2C_Register_ISMR)) -/** - * @} - */ -/** @addtogroup Peripheral_registers_structures - * @{ - */ - - - - - - -/** - * @} - */ - -/** - * @brief I2C Interrput Status Register Mask flags - */ -//------------------------------------------------ -// I2C_ISMR_BIT -//------------------------------------------------ - -/** - * @} - */ /** @defgroup I2C_Private_Defines * @{ @@ -225,6 +222,16 @@ void I2C_SendSlaveAddress (I2C_TypeDef* I2Cx, uint8_t SlaveAddress,I2C_CTR Ctr int8_t I2C_Restart_Structure(I2C_TypeDef * I2Cx,uint32_t SlaveAddress,I2C_CTR Ctr); uint16_t I2C_ReadRegister (I2C_TypeDef* I2Cx, uint8_t I2C_Register); +void I2C_GPIO(void); +void GPIO_I2C(void ); + +void WriteByte(uint8_t val); + +void digitalWrite(GPIO_TypeDef* GPIOx,uint16_t pin, uint16_t val); +uint16_t digitalRead(GPIO_TypeDef* GPIOx,uint16_t pin); +void delay_us(int us); +void delay_ms(int count) ; + /** * @} */ diff --git a/libraries/mbed/targets/hal/TARGET_WIZNET/TARGET_W7500x/i2c_api.c b/libraries/mbed/targets/hal/TARGET_WIZNET/TARGET_W7500x/i2c_api.c index f1d6ae5017..3a4adb8594 100644 --- a/libraries/mbed/targets/hal/TARGET_WIZNET/TARGET_W7500x/i2c_api.c +++ b/libraries/mbed/targets/hal/TARGET_WIZNET/TARGET_W7500x/i2c_api.c @@ -31,12 +31,16 @@ #include "mbed_assert.h" #include "i2c_api.h" + #if DEVICE_I2C #include "cmsis.h" #include "pinmap.h" #include "PeripheralPins.h" +#include "wait_api.h" +#include "us_ticker_api.h" + /* Timeout values for flags and events waiting loops. These timeouts are not based on accurate values, they just guarantee that the application will not remain stuck if the I2C communication is corrupted. */ @@ -87,7 +91,8 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl) void i2c_frequency(i2c_t *obj, int hz) { - MBED_ASSERT((hz == 100000) || (hz == 400000) || (hz == 1000000)); + //MBED_ASSERT((hz == 100000) || (hz == 400000) || (hz == 1000000)); + MBED_ASSERT((hz == 100000)); I2cHandle = (I2C_TypeDef *)(obj->i2c); // wait before init @@ -95,19 +100,20 @@ void i2c_frequency(i2c_t *obj, int hz) conf.mode = I2C_Master; conf.master.timeout = LONG_TIMEOUT; + conf.master.prescale = 0x61; // Standard mode with Rise Time = 400ns and Fall Time = 100ns // Common settings: I2C clock = 48 MHz, Analog filter = ON, Digital filter coefficient = 0 - switch (hz) { - case 100000: - conf.master.prescale = 0x61; // Standard mode with Rise Time = 400ns and Fall Time = 100ns - break; - case 400000: - break; - case 1000000: - break; - default: - break; - } +// switch (hz) { +// case 100000: +// conf.master.prescale = 0x61; // Standard mode with Rise Time = 400ns and Fall Time = 100ns +// break; +// case 400000: +// break; +// case 1000000: +// break; +// default: +// break; +// } // I2C configuration I2C_Init(I2cHandle, conf); @@ -127,8 +133,9 @@ inline int i2c_stop(i2c_t *obj) // Generate the STOP condition I2C_Stop(I2cHandle); I2C_Reset(I2cHandle); + obj->is_setAddress = 0; - + return 0; } @@ -137,12 +144,12 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) I2cHandle = (I2C_TypeDef *)(obj->i2c); int count; int value; - + if(!obj->is_setAddress) { if( I2C_Start(I2cHandle, address, I2C_READ_SA7) == ERROR ) { - return -1; + return -1; } obj->is_setAddress = 1; obj->ADDRESS = address; @@ -155,52 +162,78 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) // Read all bytes for (count = 0; count < (length-1); count++) { - if( (value = i2c_byte_read(obj, 0)) == -1) return value; + if( (value = i2c_byte_read(obj, 0)) == -1) { + return value; + } data[count] = (char)value; } if(stop){ - if( (value = i2c_byte_read(obj, 1)) == -1) return value; + if( (value = i2c_byte_read(obj, 1)) == -1) { + return value; + } data[count] = (char)value; - } + + i2c_stop(obj); + obj->is_setAddress =1; + count++; + } else{ - if( (value = i2c_byte_read(obj, 0)) == -1) return value; + if( (value = i2c_byte_read(obj, 0)) == -1) { + + return value; + } data[count] = (char)value; + count++; } - + return count; + } int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) { I2cHandle = (I2C_TypeDef *)(obj->i2c); - int count; - + int count =0; + if(!obj->is_setAddress) { if( I2C_Start(I2cHandle, address, I2C_WRITE_SA7) == ERROR ) { - return -1; + return -1; } obj->is_setAddress = 1; obj->ADDRESS = address; - } + } else { I2C_Restart_Structure(I2cHandle, address, I2C_WRITE_SA7); obj->ADDRESS = address; + } for (count = 0; count < length; count++) { i2c_byte_write(obj, data[count]); + wait_us(1); } + + if(length == 0x00) + { + I2C_GPIO(); + i2c_byte_write(obj, 0xff); + GPIO_I2C(); + } // If not repeated start, send stop if (stop) { i2c_stop(obj); + } + else + { + i2c_reset(obj); + } - - return count; + return count; } int i2c_byte_read(i2c_t *obj, int last) From 8683f36547384b75c91ecfd1819a03b58f3823d2 Mon Sep 17 00:00:00 2001 From: hjjeon0608 Date: Wed, 17 Jun 2015 11:16:35 +0900 Subject: [PATCH 3/7] Bug fix about PinMap --- .../cmsis/TARGET_WIZNET/TARGET_W7500x/W7500x_gpio.h | 2 +- .../TARGET_W7500x/TARGET_WIZwiki_W7500/PeripheralPins.c | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/libraries/mbed/targets/cmsis/TARGET_WIZNET/TARGET_W7500x/W7500x_gpio.h b/libraries/mbed/targets/cmsis/TARGET_WIZNET/TARGET_W7500x/W7500x_gpio.h index 31586c4a72..bb8ae38a09 100644 --- a/libraries/mbed/targets/cmsis/TARGET_WIZNET/TARGET_W7500x/W7500x_gpio.h +++ b/libraries/mbed/targets/cmsis/TARGET_WIZNET/TARGET_W7500x/W7500x_gpio.h @@ -67,7 +67,7 @@ typedef enum GPIO_NO_PUPD = 0x0ul, GPIO_PuPd_UP = Px_PCR_PUPD_UP, GPIO_PuPd_DOWN = Px_PCR_PUPD_DOWN, - GPIO_OD = Px_PCR_OD, + GPIO_PuPd_Default = 0x0ul, }GPIOPad_TypeDef; typedef struct diff --git a/libraries/mbed/targets/hal/TARGET_WIZNET/TARGET_W7500x/TARGET_WIZwiki_W7500/PeripheralPins.c b/libraries/mbed/targets/hal/TARGET_WIZNET/TARGET_W7500x/TARGET_WIZwiki_W7500/PeripheralPins.c index 56e9e8de66..d22fef99fe 100644 --- a/libraries/mbed/targets/hal/TARGET_WIZNET/TARGET_W7500x/TARGET_WIZwiki_W7500/PeripheralPins.c +++ b/libraries/mbed/targets/hal/TARGET_WIZNET/TARGET_W7500x/TARGET_WIZwiki_W7500/PeripheralPins.c @@ -60,12 +60,16 @@ const PinMap PinMap_UART_RX[] = { //*** I2C *** const PinMap PinMap_I2C_SDA[] = { - {PA_10, I2C_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF0)}, + {PA_6, I2C_1, WIZ_PIN_DATA(WIZ_MODE_OUTPUT, WIZ_GPIO_NOPULL, Px_AFSR_AF1)}, + {PC_5, I2C_1, WIZ_PIN_DATA(WIZ_MODE_OUTPUT, WIZ_GPIO_NOPULL, Px_AFSR_AF1)}, + {PA_10, I2C_0, WIZ_PIN_DATA(WIZ_MODE_OUTPUT, WIZ_GPIO_NOPULL, Px_AFSR_AF1)}, {NC, NC, 0} }; const PinMap PinMap_I2C_SCL[] = { - {PA_9, I2C_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF0)}, + {PC_4, I2C_1, WIZ_PIN_DATA(WIZ_MODE_OUTPUT, WIZ_GPIO_NOPULL, Px_AFSR_AF1)}, + {PA_5, I2C_1, WIZ_PIN_DATA(WIZ_MODE_OUTPUT, WIZ_GPIO_NOPULL, Px_AFSR_AF1)}, + {PA_9, I2C_0, WIZ_PIN_DATA(WIZ_MODE_OUTPUT, WIZ_GPIO_NOPULL, Px_AFSR_AF1)}, {NC, NC, 0} }; From 925b884f6c631004c03b88d20fcbfa1d48db54b7 Mon Sep 17 00:00:00 2001 From: hjjeon0608 Date: Wed, 17 Jun 2015 11:17:29 +0900 Subject: [PATCH 4/7] Change wait function. --- .../TARGET_WIZNET/TARGET_W7500x/us_ticker.c | 54 +++++++++---------- 1 file changed, 25 insertions(+), 29 deletions(-) diff --git a/libraries/mbed/targets/hal/TARGET_WIZNET/TARGET_W7500x/us_ticker.c b/libraries/mbed/targets/hal/TARGET_WIZNET/TARGET_W7500x/us_ticker.c index f427274c12..80911a4865 100644 --- a/libraries/mbed/targets/hal/TARGET_WIZNET/TARGET_W7500x/us_ticker.c +++ b/libraries/mbed/targets/hal/TARGET_WIZNET/TARGET_W7500x/us_ticker.c @@ -33,13 +33,9 @@ #include "PeripheralNames.h" #include "system_W7500x.h" -// 32-bit timer selection -#define TIM_MST7 PWM_CH7 -#define TIM_MST6 PWM_CH6 -#define IRQn_PWM6 PWM6_IRQn -static PWM_TimerModeInitTypeDef TimMasterHandle_CH7; -static PWM_TimerModeInitTypeDef TimMasterHandle_CH6; +static PWM_TimerModeInitTypeDef TimMasterHandle_CH3; +static PWM_TimerModeInitTypeDef TimMasterHandle_CH2; static int us_ticker_inited = 0; @@ -47,17 +43,17 @@ static int us_ticker_inited = 0; #ifdef __cplusplus extern "C"{ #endif -void PWM6_Handler(void) +void PWM2_Handler(void) { uint32_t IntFlag = 0; - IntFlag = PWM_CHn_GetIntFlagStatus(TIM_MST6); + IntFlag = PWM_CHn_GetIntFlagStatus(PWM_CH2); /* If overflow interrupt is occurred */ if( (IntFlag & PWM_CHn_IER_OI_Msk) != 0 ) { /* Clear overflow interrupt */ - PWM_CH6_ClearOverflowInt(); + PWM_CH2_ClearOverflowInt(); us_ticker_irq_handler(); } } @@ -72,12 +68,12 @@ void us_ticker_init(void) us_ticker_inited = 1; SystemCoreClockUpdate(); - TimMasterHandle_CH7.PWM_CHn_PR = (GetSystemClock() / 1000000) -1; - TimMasterHandle_CH7.PWM_CHn_LR = 0xFFFFFFFF; - TimMasterHandle_CH7.PWM_CHn_PDMR = 1; + TimMasterHandle_CH3.PWM_CHn_PR = (GetSystemClock() / 1000000) -1; + TimMasterHandle_CH3.PWM_CHn_LR = 0xFFFFFFFF; + TimMasterHandle_CH3.PWM_CHn_PDMR = 1; - PWM_TimerModeInit(TIM_MST7, &TimMasterHandle_CH7); - PWM_CHn_Start(TIM_MST7); + PWM_TimerModeInit(PWM_CH3, &TimMasterHandle_CH3); + PWM_CHn_Start(PWM_CH3); } @@ -85,7 +81,7 @@ uint32_t us_ticker_read() { if (!us_ticker_inited) us_ticker_init(); - return (TIM_MST7->TCR); + return (PWM_CH3->TCR); } @@ -105,33 +101,33 @@ void us_ticker_set_interrupt(timestamp_t timestamp) return; } - PWM_CHn_Stop(TIM_MST6); + PWM_CHn_Stop(PWM_CH2); SystemCoreClockUpdate(); - TimMasterHandle_CH6.PWM_CHn_PR = (GetSystemClock() / 1000000) -1; - TimMasterHandle_CH6.PWM_CHn_LR = dev; + TimMasterHandle_CH2.PWM_CHn_PR = (GetSystemClock() / 1000000) -1; + TimMasterHandle_CH2.PWM_CHn_LR = dev; - TimMasterHandle_CH6.PWM_CHn_UDMR = 0; - TimMasterHandle_CH6.PWM_CHn_PDMR = 0; + TimMasterHandle_CH2.PWM_CHn_UDMR = 0; + TimMasterHandle_CH2.PWM_CHn_PDMR = 0; - NVIC_EnableIRQ(IRQn_PWM6); + NVIC_EnableIRQ(PWM2_IRQn); - PWM_CHn_IntConfig(TIM_MST6, PWM_CHn_IER_OIE, ENABLE); - PWM_IntConfig(TIM_MST6, ENABLE); - PWM_TimerModeInit(TIM_MST6, &TimMasterHandle_CH6); + PWM_CHn_IntConfig(PWM_CH2, PWM_CHn_IER_OIE, ENABLE); + PWM_IntConfig(PWM_CH2, ENABLE); + PWM_TimerModeInit(PWM_CH2, &TimMasterHandle_CH2); - PWM_CHn_Start(TIM_MST6); + PWM_CHn_Start(PWM_CH2); } void us_ticker_disable_interrupt(void) { - NVIC_DisableIRQ(IRQn_PWM6); + NVIC_DisableIRQ(PWM2_IRQn); - PWM_CHn_IntConfig(TIM_MST6, PWM_CHn_IER_OIE, DISABLE); - PWM_IntConfig(TIM_MST6, DISABLE); + PWM_CHn_IntConfig(PWM_CH2, PWM_CHn_IER_OIE, DISABLE); + PWM_IntConfig(PWM_CH2, DISABLE); } void us_ticker_clear_interrupt(void) { - PWM_CHn_ClearInt(TIM_MST6, PWM_CHn_IER_OIE); + PWM_CHn_ClearInt(PWM_CH2, PWM_CHn_IER_OIE); } From 91cfb6ca9d516c162f43b01971a3647c0e8cf14e Mon Sep 17 00:00:00 2001 From: hjjeon0608 Date: Wed, 17 Jun 2015 12:20:07 +0900 Subject: [PATCH 5/7] Update I2C driver. --- .../TARGET_WIZNET/TARGET_W7500x/W7500x_i2c.c | 103 ++++++++---------- .../TARGET_WIZNET/TARGET_W7500x/W7500x_i2c.h | 6 +- 2 files changed, 49 insertions(+), 60 deletions(-) diff --git a/libraries/mbed/targets/cmsis/TARGET_WIZNET/TARGET_W7500x/W7500x_i2c.c b/libraries/mbed/targets/cmsis/TARGET_WIZNET/TARGET_W7500x/W7500x_i2c.c index 7099c0ff92..899677a08c 100644 --- a/libraries/mbed/targets/cmsis/TARGET_WIZNET/TARGET_W7500x/W7500x_i2c.c +++ b/libraries/mbed/targets/cmsis/TARGET_WIZNET/TARGET_W7500x/W7500x_i2c.c @@ -5,7 +5,7 @@ */ GPIO_InitTypeDef GPIO_InitDef; -void delay_us(int us); +void i2c_loop_us(int us); #define SCL GPIO_Pin_9 #define SDA GPIO_Pin_10 @@ -84,6 +84,10 @@ void I2C_Stop(I2C_TypeDef* I2Cx) { 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) @@ -105,7 +109,7 @@ int8_t I2C_SendDataAck(I2C_TypeDef* I2Cx,uint16_t Data) { I2C_GPIO(); WriteByte(Data); - delay_us(1); + i2c_loop_us(1); GPIO_I2C(); } else @@ -122,17 +126,18 @@ int8_t I2C_SendDataAck(I2C_TypeDef* I2Cx,uint16_t Data) 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 ) - return -1; - - I2C_Stop(I2Cx); - } + if( I2C_CheckEvent(I2Cx,I2C_ACKT) == ERROR ) { + return -1; + } + } + else if( I2C_CheckEvent(I2Cx,I2C_ACKT) == ERROR ) { + return -1; + } return (uint8_t)I2Cx -> RXR; @@ -526,13 +531,41 @@ void GPIO_I2C(void ) 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_9 (SCL0)) - GPIO_InitDef.GPIO_Mode = GPIO_Mode_OUT; // Set to Mode Output + 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); + // IIC_Byte<<=1; + } + 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) { @@ -547,56 +580,14 @@ void digitalWrite(GPIO_TypeDef* GPIOx,uint16_t pin, uint16_t val) } } -uint16_t digitalRead(GPIO_TypeDef* GPIOx,uint16_t pin) -{ - uint16_t bitstatus = 0x0000; - if((GPIOx->DATA & pin) != (uint32_t)Bit_RESET) - { - bitstatus = (uint8_t)Bit_SET; - } - else - { - bitstatus = (uint8_t)Bit_RESET; - } - - return bitstatus; -} - -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); - } - delay_us(1); - digitalWrite(GPIOx,SCL, Bit_SET); - delay_us(2); - digitalWrite(GPIOx,SCL, Bit_RESET); - // IIC_Byte<<=1; - } - digitalWrite(GPIOx,SDA, Bit_SET); - delay_us(1); - digitalWrite(GPIOx,SCL, Bit_SET); - delay_us(2); - digitalWrite(GPIOx,SCL, Bit_RESET); -} - - -void delay_us(int us) +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 delay_ms(int count) { - delay_us(count*1000); +void i2c_loop_ms(int count) { + i2c_loop_us(count*1000); } diff --git a/libraries/mbed/targets/cmsis/TARGET_WIZNET/TARGET_W7500x/W7500x_i2c.h b/libraries/mbed/targets/cmsis/TARGET_WIZNET/TARGET_W7500x/W7500x_i2c.h index 0767c6ca4c..eff835bfb9 100644 --- a/libraries/mbed/targets/cmsis/TARGET_WIZNET/TARGET_W7500x/W7500x_i2c.h +++ b/libraries/mbed/targets/cmsis/TARGET_WIZNET/TARGET_W7500x/W7500x_i2c.h @@ -193,8 +193,6 @@ int I2C_ReceiveData (I2C_TypeDef* I2Cx, int last); int I2C_Burst_Read (I2C_TypeDef* I2Cx, uint16_t address, uint8_t *data, int length, int stop); int I2C_Burst_Write (I2C_TypeDef* I2Cx, uint16_t address, uint8_t *data, int length, int stop); -void I2C_Delay (uint32_t nCount); - void I2C_GenerateSTART (I2C_TypeDef* I2Cx, FunctionalState NewState); void I2C_GenerateSTOP (I2C_TypeDef* I2Cx, FunctionalState NewState); @@ -229,8 +227,8 @@ void WriteByte(uint8_t val); void digitalWrite(GPIO_TypeDef* GPIOx,uint16_t pin, uint16_t val); uint16_t digitalRead(GPIO_TypeDef* GPIOx,uint16_t pin); -void delay_us(int us); -void delay_ms(int count) ; +void i2c_loop_us(int us); +void i2c_loop_ms(int count) ; /** * @} From 6dfbf6969104f29c81588956aaa1ad81c94d3479 Mon Sep 17 00:00:00 2001 From: hjjeon0608 Date: Thu, 18 Jun 2015 10:55:29 +0900 Subject: [PATCH 6/7] Correct the indentation in W7500x_i2c.c only. --- .../cmsis/TARGET_WIZNET/TARGET_W7500x/W7500x_i2c.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/libraries/mbed/targets/cmsis/TARGET_WIZNET/TARGET_W7500x/W7500x_i2c.c b/libraries/mbed/targets/cmsis/TARGET_WIZNET/TARGET_W7500x/W7500x_i2c.c index 899677a08c..e2d2750a55 100644 --- a/libraries/mbed/targets/cmsis/TARGET_WIZNET/TARGET_W7500x/W7500x_i2c.c +++ b/libraries/mbed/targets/cmsis/TARGET_WIZNET/TARGET_W7500x/W7500x_i2c.c @@ -104,7 +104,7 @@ void I2C_SendData(I2C_TypeDef* I2Cx,uint16_t Data) int8_t I2C_SendDataAck(I2C_TypeDef* I2Cx,uint16_t Data) { - buf[0] = Data; + buf[0] = Data; if(buf[0] == buf[1]) { I2C_GPIO(); @@ -126,19 +126,16 @@ int8_t I2C_SendDataAck(I2C_TypeDef* I2Cx,uint16_t Data) int I2C_ReceiveData(I2C_TypeDef* I2Cx, int last) { - - if(last) { I2C_AcknowledgeConfig(I2Cx,DISABLE); if( I2C_CheckEvent(I2Cx,I2C_ACKT) == ERROR ) { - return -1; + return -1; } } else if( I2C_CheckEvent(I2Cx,I2C_ACKT) == ERROR ) { return -1; } - return (uint8_t)I2Cx -> RXR; } @@ -541,7 +538,7 @@ void GPIO_I2C(void ) void WriteByte(uint8_t val) { - int i; + int i; GPIO_TypeDef* GPIOx; GPIOx = GPIOA; @@ -556,7 +553,6 @@ void WriteByte(uint8_t val) digitalWrite(GPIOx,SCL, Bit_SET); i2c_loop_us(2); digitalWrite(GPIOx,SCL, Bit_RESET); - // IIC_Byte<<=1; } digitalWrite(GPIOx,SDA, Bit_SET); i2c_loop_us(1); @@ -583,11 +579,11 @@ void digitalWrite(GPIO_TypeDef* GPIOx,uint16_t pin, uint16_t val) void i2c_loop_us(int us) { - volatile uint32_t delay = us; // approximate loops per ms at 24 MHz, Debug config + 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); + i2c_loop_us(count*1000); } From f31c0915e020c762e9d6cfcea90fb1e7cf459342 Mon Sep 17 00:00:00 2001 From: hjjeon0608 Date: Thu, 25 Jun 2015 16:00:24 +0900 Subject: [PATCH 7/7] Bug fix about I2C pinmap If output, this means to set gpio. So, I change output to AF. --- .../TARGET_WIZwiki_W7500/PeripheralPins.c | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/libraries/mbed/targets/hal/TARGET_WIZNET/TARGET_W7500x/TARGET_WIZwiki_W7500/PeripheralPins.c b/libraries/mbed/targets/hal/TARGET_WIZNET/TARGET_W7500x/TARGET_WIZwiki_W7500/PeripheralPins.c index d22fef99fe..f29cfcc54d 100644 --- a/libraries/mbed/targets/hal/TARGET_WIZNET/TARGET_W7500x/TARGET_WIZwiki_W7500/PeripheralPins.c +++ b/libraries/mbed/targets/hal/TARGET_WIZNET/TARGET_W7500x/TARGET_WIZwiki_W7500/PeripheralPins.c @@ -47,29 +47,25 @@ const PinMap PinMap_ADC[] = { //*** SERIAL *** const PinMap PinMap_UART_TX[] = { - {PA_14, UART_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF0)}, + {PA_13, UART_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF0)}, {PC_2, UART_1, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF0)}, {NC, NC, 0} }; const PinMap PinMap_UART_RX[] = { - {PA_13, UART_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF0)}, + {PA_14, UART_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF0)}, {PC_3, UART_1, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_PULLUP, Px_AFSR_AF0)}, {NC, NC, 0} }; //*** I2C *** const PinMap PinMap_I2C_SDA[] = { - {PA_6, I2C_1, WIZ_PIN_DATA(WIZ_MODE_OUTPUT, WIZ_GPIO_NOPULL, Px_AFSR_AF1)}, - {PC_5, I2C_1, WIZ_PIN_DATA(WIZ_MODE_OUTPUT, WIZ_GPIO_NOPULL, Px_AFSR_AF1)}, - {PA_10, I2C_0, WIZ_PIN_DATA(WIZ_MODE_OUTPUT, WIZ_GPIO_NOPULL, Px_AFSR_AF1)}, + {PA_10, I2C_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF1)}, {NC, NC, 0} }; const PinMap PinMap_I2C_SCL[] = { - {PC_4, I2C_1, WIZ_PIN_DATA(WIZ_MODE_OUTPUT, WIZ_GPIO_NOPULL, Px_AFSR_AF1)}, - {PA_5, I2C_1, WIZ_PIN_DATA(WIZ_MODE_OUTPUT, WIZ_GPIO_NOPULL, Px_AFSR_AF1)}, - {PA_9, I2C_0, WIZ_PIN_DATA(WIZ_MODE_OUTPUT, WIZ_GPIO_NOPULL, Px_AFSR_AF1)}, + {PA_9, I2C_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF1)}, {NC, NC, 0} }; @@ -111,21 +107,16 @@ const PinMap PinMap_PWM[] = { {PA_0 , PWM_6, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, {PA_1 , PWM_7, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, {PA_5 , PWM_2, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF3)}, - {PA_6 , PWM_3, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF3)}, {PA_7 , PWM_4, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF3)}, {PA_8 , PWM_5, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF3)}, {PA_9 , PWM_6, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF3)}, {PA_10, PWM_7, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF3)}, {PC_0 , PWM_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, - {PC_1 , PWM_1, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, {PC_2 , PWM_2, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, - {PC_3 , PWM_3, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, {PC_4 , PWM_4, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, {PC_5 , PWM_5, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, {PC_8 , PWM_0, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF0)}, - {PC_9 , PWM_1, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF0)}, {PC_10, PWM_2, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, - {PC_11, PWM_3, WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF2)}, {NC , NC , WIZ_PIN_DATA(WIZ_MODE_AF, WIZ_GPIO_NOPULL, Px_AFSR_AF0)} };