mbed library sources

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Fri Jul 31 15:00:09 2015 +0100
Revision:
601:248b0d2dd755
Parent:
576:99a3d3d9c43f
Synchronized with git revision 9d276ebad7fd567e170326b8ba3f5ecbf2b021a3

Full URL: https://github.com/mbedmicro/mbed/commit/9d276ebad7fd567e170326b8ba3f5ecbf2b021a3/

Wiznet - I2c -> gpio

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 601:248b0d2dd755 1 /* mbed Microcontroller Library
mbed_official 601:248b0d2dd755 2 *******************************************************************************
mbed_official 601:248b0d2dd755 3 * Copyright (c) 2015 WIZnet Co.,Ltd. All rights reserved.
mbed_official 601:248b0d2dd755 4 * All rights reserved.
mbed_official 601:248b0d2dd755 5 *
mbed_official 601:248b0d2dd755 6 * Redistribution and use in source and binary forms, with or without
mbed_official 601:248b0d2dd755 7 * modification, are permitted provided that the following conditions are met:
mbed_official 601:248b0d2dd755 8 *
mbed_official 601:248b0d2dd755 9 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 601:248b0d2dd755 10 * this list of conditions and the following disclaimer.
mbed_official 601:248b0d2dd755 11 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 601:248b0d2dd755 12 * this list of conditions and the following disclaimer in the documentation
mbed_official 601:248b0d2dd755 13 * and/or other materials provided with the distribution.
mbed_official 601:248b0d2dd755 14 * 3. Neither the name of ARM Limited nor the names of its contributors
mbed_official 601:248b0d2dd755 15 * may be used to endorse or promote products derived from this software
mbed_official 601:248b0d2dd755 16 * without specific prior written permission.
mbed_official 601:248b0d2dd755 17 *
mbed_official 601:248b0d2dd755 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 601:248b0d2dd755 19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 601:248b0d2dd755 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 601:248b0d2dd755 21 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 601:248b0d2dd755 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 601:248b0d2dd755 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 601:248b0d2dd755 24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 601:248b0d2dd755 25 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 601:248b0d2dd755 26 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 601:248b0d2dd755 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 601:248b0d2dd755 28 *******************************************************************************
mbed_official 601:248b0d2dd755 29 */
mbed_official 601:248b0d2dd755 30 /*include -------------------------------------*/
mbed_official 601:248b0d2dd755 31 #include <stdio.h>
mbed_official 558:0880f51c4036 32 #include "W7500x.h"
mbed_official 558:0880f51c4036 33
mbed_official 576:99a3d3d9c43f 34 GPIO_InitTypeDef GPIO_InitDef;
mbed_official 576:99a3d3d9c43f 35
mbed_official 601:248b0d2dd755 36 uint32_t I2C_Init(I2C_ConfigStruct* conf)
mbed_official 601:248b0d2dd755 37 {
mbed_official 601:248b0d2dd755 38 uint32_t scl_port_num;
mbed_official 601:248b0d2dd755 39 uint32_t scl_pin_index;
mbed_official 601:248b0d2dd755 40 uint32_t sda_port_num;
mbed_official 601:248b0d2dd755 41 uint32_t sda_pin_index;
mbed_official 601:248b0d2dd755 42
mbed_official 601:248b0d2dd755 43 scl_port_num = I2C_PORT(conf->scl);
mbed_official 601:248b0d2dd755 44 scl_pin_index = I2C_PIN_INDEX(conf->scl);
mbed_official 601:248b0d2dd755 45
mbed_official 601:248b0d2dd755 46 sda_port_num = I2C_PORT(conf->sda);
mbed_official 601:248b0d2dd755 47 sda_pin_index = I2C_PIN_INDEX(conf->sda);
mbed_official 601:248b0d2dd755 48
mbed_official 601:248b0d2dd755 49 //SCL setting
mbed_official 601:248b0d2dd755 50 GPIO_InitDef.GPIO_Pin = scl_pin_index;
mbed_official 601:248b0d2dd755 51 GPIO_InitDef.GPIO_Mode = GPIO_Mode_OUT;
mbed_official 601:248b0d2dd755 52
mbed_official 601:248b0d2dd755 53 HAL_GPIO_Init((GPIO_TypeDef*)(GPIOA_BASE + (scl_port_num << 24)), &GPIO_InitDef);
mbed_official 601:248b0d2dd755 54 HAL_GPIO_SetBits((GPIO_TypeDef*)(GPIOA_BASE + (scl_port_num << 24)), scl_pin_index);
mbed_official 601:248b0d2dd755 55
mbed_official 601:248b0d2dd755 56 //SDA setting
mbed_official 601:248b0d2dd755 57 GPIO_InitDef.GPIO_Pin = sda_pin_index;
mbed_official 601:248b0d2dd755 58 GPIO_InitDef.GPIO_Mode = GPIO_Mode_IN;
mbed_official 601:248b0d2dd755 59
mbed_official 601:248b0d2dd755 60 HAL_GPIO_Init((GPIO_TypeDef*)(GPIOA_BASE + (sda_port_num << 24)), &GPIO_InitDef);
mbed_official 601:248b0d2dd755 61 HAL_GPIO_ResetBits((GPIO_TypeDef*)(GPIOA_BASE + (sda_port_num << 24)), sda_pin_index);
mbed_official 601:248b0d2dd755 62
mbed_official 601:248b0d2dd755 63 //Pin muxing
mbed_official 601:248b0d2dd755 64 HAL_PAD_AFConfig(scl_port_num, scl_pin_index, PAD_AF1);
mbed_official 601:248b0d2dd755 65 HAL_PAD_AFConfig(sda_port_num, sda_pin_index, PAD_AF1);
mbed_official 576:99a3d3d9c43f 66
mbed_official 601:248b0d2dd755 67 return 0;
mbed_official 601:248b0d2dd755 68 }
mbed_official 601:248b0d2dd755 69
mbed_official 601:248b0d2dd755 70 void I2C_WriteBitSCL(I2C_ConfigStruct* conf, uint8_t data)
mbed_official 601:248b0d2dd755 71 {
mbed_official 601:248b0d2dd755 72 uint32_t scl_port_num = I2C_PORT(conf->scl);
mbed_official 601:248b0d2dd755 73 uint32_t scl_pin_index = I2C_PIN_INDEX(conf->scl);
mbed_official 601:248b0d2dd755 74
mbed_official 601:248b0d2dd755 75 if(data == 1)
mbed_official 601:248b0d2dd755 76 HAL_GPIO_SetBits((GPIO_TypeDef*)(GPIOA_BASE + (scl_port_num << 24)), scl_pin_index);
mbed_official 601:248b0d2dd755 77 else
mbed_official 601:248b0d2dd755 78 HAL_GPIO_ResetBits((GPIO_TypeDef*)(GPIOA_BASE + (scl_port_num << 24)), scl_pin_index);
mbed_official 601:248b0d2dd755 79
mbed_official 601:248b0d2dd755 80 }
mbed_official 558:0880f51c4036 81
mbed_official 601:248b0d2dd755 82 void I2C_WriteBitSDA(I2C_ConfigStruct* conf, uint8_t data)
mbed_official 558:0880f51c4036 83 {
mbed_official 601:248b0d2dd755 84 uint32_t sda_port_num = I2C_PORT(conf->sda);
mbed_official 601:248b0d2dd755 85 uint32_t sda_pin_index = I2C_PIN_INDEX(conf->sda);
mbed_official 601:248b0d2dd755 86
mbed_official 601:248b0d2dd755 87 if(data == 1)
mbed_official 601:248b0d2dd755 88 GPIO_OutEnClr((GPIO_TypeDef*)(GPIOA_BASE + (sda_port_num << 24)), sda_pin_index);
mbed_official 601:248b0d2dd755 89 else
mbed_official 601:248b0d2dd755 90 GPIO_OutEnSet((GPIO_TypeDef*)(GPIOA_BASE + (sda_port_num << 24)), sda_pin_index);
mbed_official 601:248b0d2dd755 91
mbed_official 601:248b0d2dd755 92 }
mbed_official 601:248b0d2dd755 93
mbed_official 601:248b0d2dd755 94 uint8_t I2C_ReadBitSDA(I2C_ConfigStruct* conf)
mbed_official 601:248b0d2dd755 95 {
mbed_official 601:248b0d2dd755 96 uint32_t sda_port_num = I2C_PORT(conf->sda);
mbed_official 601:248b0d2dd755 97 uint32_t sda_pin_index = I2C_PIN_INDEX(conf->sda);
mbed_official 601:248b0d2dd755 98
mbed_official 601:248b0d2dd755 99 if(HAL_GPIO_ReadInputDataBit((GPIO_TypeDef*)(GPIOA_BASE + (sda_port_num << 24)), sda_pin_index))
mbed_official 601:248b0d2dd755 100 return 1;
mbed_official 601:248b0d2dd755 101 else
mbed_official 601:248b0d2dd755 102 return 0;
mbed_official 558:0880f51c4036 103
mbed_official 558:0880f51c4036 104
mbed_official 601:248b0d2dd755 105 return 0;
mbed_official 601:248b0d2dd755 106 }
mbed_official 558:0880f51c4036 107
mbed_official 601:248b0d2dd755 108 void I2C_Start(I2C_ConfigStruct* conf)
mbed_official 601:248b0d2dd755 109 {
mbed_official 601:248b0d2dd755 110 I2C_WriteBitSCL(conf, 1);
mbed_official 601:248b0d2dd755 111 I2C_WriteBitSDA(conf, 1);
mbed_official 558:0880f51c4036 112
mbed_official 601:248b0d2dd755 113 I2C_WriteBitSDA(conf, 0);
mbed_official 601:248b0d2dd755 114 I2C_WriteBitSCL(conf, 0);
mbed_official 601:248b0d2dd755 115 }
mbed_official 558:0880f51c4036 116
mbed_official 601:248b0d2dd755 117 void I2C_Stop(I2C_ConfigStruct* conf)
mbed_official 601:248b0d2dd755 118 {
mbed_official 601:248b0d2dd755 119 I2C_WriteBitSCL(conf, 0);
mbed_official 601:248b0d2dd755 120 I2C_WriteBitSDA(conf, 0);
mbed_official 601:248b0d2dd755 121
mbed_official 601:248b0d2dd755 122 I2C_WriteBitSCL(conf, 1);
mbed_official 601:248b0d2dd755 123 I2C_WriteBitSDA(conf, 1);
mbed_official 558:0880f51c4036 124 }
mbed_official 558:0880f51c4036 125
mbed_official 601:248b0d2dd755 126 uint8_t I2C_WriteByte(I2C_ConfigStruct* conf, uint8_t data)
mbed_official 558:0880f51c4036 127 {
mbed_official 601:248b0d2dd755 128 int i;
mbed_official 601:248b0d2dd755 129 uint8_t ret;
mbed_official 601:248b0d2dd755 130
mbed_official 601:248b0d2dd755 131 //Write byte
mbed_official 601:248b0d2dd755 132 for(i=0; i<8; i++)
mbed_official 601:248b0d2dd755 133 {
mbed_official 601:248b0d2dd755 134 if((data << i) & 0x80)
mbed_official 601:248b0d2dd755 135 I2C_WriteBitSDA(conf, 1);
mbed_official 601:248b0d2dd755 136 else
mbed_official 601:248b0d2dd755 137 I2C_WriteBitSDA(conf, 0);
mbed_official 601:248b0d2dd755 138
mbed_official 601:248b0d2dd755 139 I2C_WriteBitSCL(conf, 1);
mbed_official 601:248b0d2dd755 140 I2C_WriteBitSCL(conf, 0);
mbed_official 601:248b0d2dd755 141 }
mbed_official 601:248b0d2dd755 142 //Make clk for receiving ack
mbed_official 601:248b0d2dd755 143 I2C_WriteBitSDA(conf, 1);
mbed_official 601:248b0d2dd755 144 I2C_WriteBitSCL(conf, 1);
mbed_official 601:248b0d2dd755 145 //Read Ack/Nack
mbed_official 601:248b0d2dd755 146 ret = I2C_ReadBitSDA(conf);
mbed_official 601:248b0d2dd755 147
mbed_official 601:248b0d2dd755 148 I2C_WriteBitSCL(conf, 0);
mbed_official 601:248b0d2dd755 149
mbed_official 558:0880f51c4036 150 return ret;
mbed_official 558:0880f51c4036 151 }
mbed_official 558:0880f51c4036 152
mbed_official 601:248b0d2dd755 153 void I2C_SendACK(I2C_ConfigStruct* conf)
mbed_official 558:0880f51c4036 154 {
mbed_official 601:248b0d2dd755 155 I2C_WriteBitSDA(conf, 0);
mbed_official 601:248b0d2dd755 156 I2C_WriteBitSCL(conf, 1);
mbed_official 601:248b0d2dd755 157
mbed_official 601:248b0d2dd755 158 I2C_WriteBitSCL(conf, 0);
mbed_official 558:0880f51c4036 159 }
mbed_official 601:248b0d2dd755 160
mbed_official 601:248b0d2dd755 161 void I2C_SendNACK(I2C_ConfigStruct* conf)
mbed_official 558:0880f51c4036 162 {
mbed_official 601:248b0d2dd755 163 I2C_WriteBitSDA(conf, 1);
mbed_official 601:248b0d2dd755 164 I2C_WriteBitSCL(conf, 1);
mbed_official 601:248b0d2dd755 165
mbed_official 601:248b0d2dd755 166 I2C_WriteBitSCL(conf, 0);
mbed_official 558:0880f51c4036 167 }
mbed_official 558:0880f51c4036 168
mbed_official 601:248b0d2dd755 169 uint8_t I2C_ReadByte(I2C_ConfigStruct* conf)
mbed_official 558:0880f51c4036 170 {
mbed_official 601:248b0d2dd755 171 int i;
mbed_official 601:248b0d2dd755 172 uint8_t ret = 0;
mbed_official 601:248b0d2dd755 173
mbed_official 601:248b0d2dd755 174 I2C_WriteBitSDA(conf, 1); //out enable clear(GPIO is input)
mbed_official 601:248b0d2dd755 175
mbed_official 601:248b0d2dd755 176 //Read byte
mbed_official 601:248b0d2dd755 177 for(i=0; i<8; i++)
mbed_official 558:0880f51c4036 178 {
mbed_official 601:248b0d2dd755 179 I2C_WriteBitSCL(conf, 1);
mbed_official 601:248b0d2dd755 180 ret = (ret << 1) | (I2C_ReadBitSDA(conf));
mbed_official 601:248b0d2dd755 181 I2C_WriteBitSCL(conf, 0);
mbed_official 576:99a3d3d9c43f 182 }
mbed_official 601:248b0d2dd755 183
mbed_official 601:248b0d2dd755 184 return ret;
mbed_official 558:0880f51c4036 185 }
mbed_official 558:0880f51c4036 186
mbed_official 601:248b0d2dd755 187 int I2C_Write(I2C_ConfigStruct* conf, uint8_t addr, uint8_t* data, uint32_t len)
mbed_official 558:0880f51c4036 188 {
mbed_official 601:248b0d2dd755 189 int i;
mbed_official 601:248b0d2dd755 190
mbed_official 601:248b0d2dd755 191 I2C_Start(conf);
mbed_official 601:248b0d2dd755 192
mbed_official 601:248b0d2dd755 193 //Write addr
mbed_official 601:248b0d2dd755 194 if(I2C_WriteByte(conf, addr) != 0)
mbed_official 558:0880f51c4036 195 {
mbed_official 601:248b0d2dd755 196 printf("Received NACK at address phase!!\r\n");
mbed_official 558:0880f51c4036 197 return -1;
mbed_official 558:0880f51c4036 198 }
mbed_official 558:0880f51c4036 199
mbed_official 601:248b0d2dd755 200 //Write data
mbed_official 601:248b0d2dd755 201 for(i=0; i<len; i++)
mbed_official 558:0880f51c4036 202 {
mbed_official 601:248b0d2dd755 203 if(I2C_WriteByte(conf, data[i]))
mbed_official 601:248b0d2dd755 204 return -1;
mbed_official 576:99a3d3d9c43f 205 }
mbed_official 601:248b0d2dd755 206
mbed_official 601:248b0d2dd755 207 I2C_Stop(conf);
mbed_official 601:248b0d2dd755 208
mbed_official 601:248b0d2dd755 209 return 0;//success
mbed_official 558:0880f51c4036 210 }
mbed_official 558:0880f51c4036 211
mbed_official 601:248b0d2dd755 212 int I2C_WriteRepeated(I2C_ConfigStruct* conf, uint8_t addr, uint8_t* data, uint32_t len)
mbed_official 558:0880f51c4036 213 {
mbed_official 601:248b0d2dd755 214 int i;
mbed_official 601:248b0d2dd755 215
mbed_official 601:248b0d2dd755 216 I2C_Start(conf);
mbed_official 601:248b0d2dd755 217
mbed_official 601:248b0d2dd755 218 //Write addr
mbed_official 601:248b0d2dd755 219 if(I2C_WriteByte(conf, addr) != 0)
mbed_official 558:0880f51c4036 220 {
mbed_official 601:248b0d2dd755 221 printf("Received NACK at address phase!!\r\n");
mbed_official 601:248b0d2dd755 222 return -1;
mbed_official 558:0880f51c4036 223 }
mbed_official 601:248b0d2dd755 224
mbed_official 601:248b0d2dd755 225 //Write data
mbed_official 601:248b0d2dd755 226 for(i=0; i<len; i++)
mbed_official 558:0880f51c4036 227 {
mbed_official 601:248b0d2dd755 228 if(I2C_WriteByte(conf, data[i]))
mbed_official 601:248b0d2dd755 229 return -1;
mbed_official 558:0880f51c4036 230 }
mbed_official 601:248b0d2dd755 231
mbed_official 601:248b0d2dd755 232 return 0;//success
mbed_official 558:0880f51c4036 233 }
mbed_official 558:0880f51c4036 234
mbed_official 601:248b0d2dd755 235 int I2C_Read(I2C_ConfigStruct* conf, uint8_t addr, uint8_t* data, uint32_t len)
mbed_official 558:0880f51c4036 236 {
mbed_official 601:248b0d2dd755 237 int i;
mbed_official 558:0880f51c4036 238
mbed_official 601:248b0d2dd755 239 I2C_Start(conf);
mbed_official 601:248b0d2dd755 240
mbed_official 601:248b0d2dd755 241 //Write addr | read command
mbed_official 601:248b0d2dd755 242 if(I2C_WriteByte(conf, (addr | 1)) != 0)
mbed_official 558:0880f51c4036 243 {
mbed_official 601:248b0d2dd755 244 printf("Received NACK at address phase!!\r\n");
mbed_official 601:248b0d2dd755 245 return -1;
mbed_official 601:248b0d2dd755 246 }
mbed_official 601:248b0d2dd755 247
mbed_official 601:248b0d2dd755 248 //Read data
mbed_official 601:248b0d2dd755 249 for(i=0; i<len; i++)
mbed_official 558:0880f51c4036 250 {
mbed_official 601:248b0d2dd755 251 data[i] = I2C_ReadByte(conf);
mbed_official 558:0880f51c4036 252
mbed_official 601:248b0d2dd755 253 if( i == (len - 1) )
mbed_official 601:248b0d2dd755 254 I2C_SendNACK(conf);
mbed_official 601:248b0d2dd755 255 else
mbed_official 601:248b0d2dd755 256 I2C_SendACK(conf);
mbed_official 558:0880f51c4036 257 }
mbed_official 601:248b0d2dd755 258
mbed_official 601:248b0d2dd755 259 I2C_Stop(conf);
mbed_official 601:248b0d2dd755 260
mbed_official 601:248b0d2dd755 261 return 0;//success
mbed_official 558:0880f51c4036 262 }
mbed_official 558:0880f51c4036 263
mbed_official 601:248b0d2dd755 264 int I2C_ReadRepeated(I2C_ConfigStruct* conf, uint8_t addr, uint8_t* data, uint32_t len)
mbed_official 558:0880f51c4036 265 {
mbed_official 601:248b0d2dd755 266 int i;
mbed_official 601:248b0d2dd755 267
mbed_official 601:248b0d2dd755 268 I2C_Start(conf);
mbed_official 601:248b0d2dd755 269
mbed_official 601:248b0d2dd755 270 //Write addr | read command
mbed_official 601:248b0d2dd755 271 if(I2C_WriteByte(conf, (addr | 1)) != 0)
mbed_official 558:0880f51c4036 272 {
mbed_official 601:248b0d2dd755 273 printf("Received NACK at address phase!!\r\n");
mbed_official 601:248b0d2dd755 274 return -1;
mbed_official 558:0880f51c4036 275 }
mbed_official 558:0880f51c4036 276
mbed_official 601:248b0d2dd755 277 //Read data
mbed_official 601:248b0d2dd755 278 for(i=0; i<len; i++)
mbed_official 601:248b0d2dd755 279 {
mbed_official 601:248b0d2dd755 280 data[i] = I2C_ReadByte(conf);
mbed_official 601:248b0d2dd755 281
mbed_official 601:248b0d2dd755 282 if( i == (len - 1) )
mbed_official 601:248b0d2dd755 283 I2C_SendNACK(conf);
mbed_official 601:248b0d2dd755 284 else
mbed_official 601:248b0d2dd755 285 I2C_SendACK(conf);
mbed_official 601:248b0d2dd755 286 }
mbed_official 601:248b0d2dd755 287
mbed_official 601:248b0d2dd755 288 return 0;//success
mbed_official 558:0880f51c4036 289 }
mbed_official 558:0880f51c4036 290