Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbed-src by
Diff: targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/i2c_api.c
- Revision:
- 174:8bb9f3a33240
- Parent:
- 167:d5744491c362
- Child:
- 181:a4cbdfbbd2f4
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/i2c_api.c Mon Apr 28 18:15:06 2014 +0100 +++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/i2c_api.c Tue Apr 29 11:15:07 2014 +0100 @@ -36,8 +36,8 @@ #include "error.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. */ + not based on accurate values, they just guarantee that the application will + not remain stuck if the I2C communication is corrupted. */ #define FLAG_TIMEOUT ((int)0x1000) #define LONG_TIMEOUT ((int)0x8000) @@ -55,19 +55,19 @@ {NC, NC, 0} }; -void i2c_init(i2c_t *obj, PinName sda, PinName scl) { +void i2c_init(i2c_t *obj, PinName sda, PinName scl) { // Determine the I2C to use I2CName i2c_sda = (I2CName)pinmap_peripheral(sda, PinMap_I2C_SDA); I2CName i2c_scl = (I2CName)pinmap_peripheral(scl, PinMap_I2C_SCL); obj->i2c = (I2CName)pinmap_merge(i2c_sda, i2c_scl); - + if (obj->i2c == (I2CName)NC) { error("I2C pin mapping failed"); } // Enable I2C clock - if (obj->i2c == I2C_1) { + if (obj->i2c == I2C_1) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); } if (obj->i2c == I2C_2) { @@ -79,21 +79,21 @@ pin_mode(scl, OpenDrain); pinmap_pinout(sda, PinMap_I2C_SDA); pin_mode(sda, OpenDrain); - + // Reset to clear pending flags if any i2c_reset(obj); - + // I2C configuration - i2c_frequency(obj, 100000); // 100 kHz per default + i2c_frequency(obj, 100000); // 100 kHz per default } void i2c_frequency(i2c_t *obj, int hz) { I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c); I2C_InitTypeDef I2C_InitStructure; - + if ((hz != 0) && (hz <= 400000)) { I2C_DeInit(i2c); - + // I2C configuration I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; @@ -102,7 +102,7 @@ I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = hz; I2C_Init(i2c, &I2C_InitStructure); - + I2C_Cmd(i2c, ENABLE); } } @@ -110,30 +110,29 @@ inline int i2c_start(i2c_t *obj) { I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c); int timeout; - + I2C_ClearFlag(i2c, I2C_FLAG_AF); // Clear Acknowledge failure flag - + // Generate the START condition - I2C_GenerateSTART(i2c, ENABLE); - + I2C_GenerateSTART(i2c, ENABLE); + // Wait the START condition has been correctly sent timeout = FLAG_TIMEOUT; - //while (I2C_CheckEvent(i2c, I2C_EVENT_MASTER_MODE_SELECT) == ERROR) { while (I2C_GetFlagStatus(i2c, I2C_FLAG_SB) == RESET) { timeout--; if (timeout == 0) { return 1; } } - + return 0; } inline int i2c_stop(i2c_t *obj) { I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c); - + I2C_GenerateSTOP(i2c, ENABLE); - + return 0; } @@ -142,24 +141,13 @@ int timeout; int count; int value; - + if (length == 0) return 0; -/* - // Wait until the bus is not busy anymore - timeout = LONG_TIMEOUT; - while (I2C_GetFlagStatus(i2c, I2C_FLAG_BUSY) == SET) { - timeout--; - if (timeout == 0) { - return 0; - } - } -*/ - i2c_start(obj); // Send slave address for read - I2C_Send7bitAddress(i2c, address, I2C_Direction_Receiver); + I2C_Send7bitAddress(i2c, address, I2C_Direction_Receiver); // Wait address is acknowledged timeout = FLAG_TIMEOUT; @@ -169,13 +157,13 @@ return 0; } } - + // Read all bytes except last one for (count = 0; count < (length - 1); count++) { value = i2c_byte_read(obj, 0); data[count] = (char)value; } - + // If not repeated start, send stop. // Warning: must be done BEFORE the data is read. if (stop) { @@ -185,7 +173,7 @@ // Read the last byte value = i2c_byte_read(obj, 1); data[count] = (char)value; - + return length; } @@ -193,23 +181,12 @@ I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c); int timeout; int count; - -/* - // Wait until the bus is not busy anymore - timeout = LONG_TIMEOUT; - while (I2C_GetFlagStatus(i2c, I2C_FLAG_BUSY) == SET) { - timeout--; - if (timeout == 0) { - return 0; - } - } -*/ i2c_start(obj); // Send slave address for write I2C_Send7bitAddress(i2c, address, I2C_Direction_Transmitter); - + // Wait address is acknowledged timeout = FLAG_TIMEOUT; while (I2C_CheckEvent(i2c, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) == ERROR) { @@ -238,7 +215,7 @@ I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c); uint8_t data; int timeout; - + if (last) { // Don't acknowledge the last byte I2C_AcknowledgeConfig(i2c, DISABLE); @@ -257,7 +234,7 @@ } data = I2C_ReceiveData(i2c); - + return (int)data; } @@ -268,27 +245,26 @@ I2C_SendData(i2c, (uint8_t)data); // Wait until the byte is transmitted - timeout = FLAG_TIMEOUT; - //while (I2C_CheckEvent(i2c, I2C_EVENT_MASTER_BYTE_TRANSMITTED) == ERROR) { + timeout = FLAG_TIMEOUT; while ((I2C_GetFlagStatus(i2c, I2C_FLAG_TXE) == RESET) && - (I2C_GetFlagStatus(i2c, I2C_FLAG_BTF) == RESET)) { + (I2C_GetFlagStatus(i2c, I2C_FLAG_BTF) == RESET)) { timeout--; if (timeout == 0) { return 0; } } - + return 1; } void i2c_reset(i2c_t *obj) { - if (obj->i2c == I2C_1) { + if (obj->i2c == I2C_1) { RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE); RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE); } if (obj->i2c == I2C_2) { RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, DISABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, DISABLE); } } @@ -297,7 +273,7 @@ void i2c_slave_address(i2c_t *obj, int idx, uint32_t address, uint32_t mask) { I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c); uint16_t tmpreg; - + // Get the old register value tmpreg = i2c->OAR1; // Reset address bits @@ -319,29 +295,28 @@ #define WriteAddressed 3 // the master is writing to this slave (slave = receiver) int i2c_slave_receive(i2c_t *obj) { - // TO BE DONE - return(0); + return (0); } int i2c_slave_read(i2c_t *obj, char *data, int length) { int count = 0; - + // Read all bytes for (count = 0; count < length; count++) { data[count] = i2c_byte_read(obj, 0); } - + return count; } int i2c_slave_write(i2c_t *obj, const char *data, int length) { int count = 0; - + // Write all bytes for (count = 0; count < length; count++) { i2c_byte_write(obj, data[count]); } - + return count; }