mirror of https://github.com/ARMmbed/mbed-os.git
[NUCLEOs] enhance i2c api
parent
90467175c0
commit
aee7023d7f
|
@ -55,6 +55,9 @@ static const PinMap PinMap_I2C_SCL[] = {
|
|||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
int i2c1_inited = 0;
|
||||
int i2c2_inited = 0;
|
||||
|
||||
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);
|
||||
|
@ -63,20 +66,28 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl) {
|
|||
obj->i2c = (I2CName)pinmap_merge(i2c_sda, i2c_scl);
|
||||
MBED_ASSERT(obj->i2c != (I2CName)NC);
|
||||
|
||||
// Enable I2C clock
|
||||
if (obj->i2c == I2C_1) {
|
||||
// Enable I2C1 clock and pinout if not done
|
||||
if ((obj->i2c == I2C_1)&& !i2c1_inited) {
|
||||
i2c1_inited = 1;
|
||||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
|
||||
RCC_I2CCLKConfig(RCC_I2C1CLK_SYSCLK);
|
||||
}
|
||||
if (obj->i2c == I2C_2) {
|
||||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
|
||||
// Configure I2C pins
|
||||
pinmap_pinout(scl, PinMap_I2C_SCL);
|
||||
pin_mode(scl, OpenDrain);
|
||||
pinmap_pinout(sda, PinMap_I2C_SDA);
|
||||
pin_mode(sda, OpenDrain);
|
||||
}
|
||||
|
||||
// Configure I2C pins
|
||||
pinmap_pinout(scl, PinMap_I2C_SCL);
|
||||
pin_mode(scl, OpenDrain);
|
||||
pinmap_pinout(sda, PinMap_I2C_SDA);
|
||||
pin_mode(sda, OpenDrain);
|
||||
// Enable I2C2 clock and pinout if not done
|
||||
if ((obj->i2c == I2C_2)&& !i2c2_inited) {
|
||||
i2c2_inited = 1;
|
||||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
|
||||
// Configure I2C pins
|
||||
pinmap_pinout(scl, PinMap_I2C_SCL);
|
||||
pin_mode(scl, OpenDrain);
|
||||
pinmap_pinout(sda, PinMap_I2C_SDA);
|
||||
pin_mode(sda, OpenDrain);
|
||||
}
|
||||
|
||||
// Reset to clear pending flags if any
|
||||
i2c_reset(obj);
|
||||
|
@ -90,6 +101,11 @@ void i2c_frequency(i2c_t *obj, int hz) {
|
|||
I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c);
|
||||
I2C_InitTypeDef I2C_InitStructure;
|
||||
uint32_t tim = 0;
|
||||
int timeout;
|
||||
|
||||
// wait before init
|
||||
timeout = LONG_TIMEOUT;
|
||||
while((I2C_GetFlagStatus(i2c, I2C_FLAG_BUSY)) && (timeout-- != 0));
|
||||
|
||||
// Disable the Fast Mode Plus capability
|
||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); // Enable SYSCFG clock
|
||||
|
@ -260,6 +276,13 @@ int i2c_byte_write(i2c_t *obj, int data) {
|
|||
}
|
||||
|
||||
void i2c_reset(i2c_t *obj) {
|
||||
I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c);
|
||||
int timeout;
|
||||
|
||||
// wait before reset
|
||||
timeout = LONG_TIMEOUT;
|
||||
while((I2C_GetFlagStatus(i2c, I2C_FLAG_BUSY)) && (timeout-- != 0));
|
||||
|
||||
if (obj->i2c == I2C_1) {
|
||||
RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE);
|
||||
RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE);
|
||||
|
|
|
@ -59,6 +59,9 @@ static const PinMap PinMap_I2C_SCL[] = {
|
|||
|
||||
I2C_HandleTypeDef I2cHandle;
|
||||
|
||||
int i2c1_inited = 0;
|
||||
int i2c2_inited = 0;
|
||||
|
||||
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);
|
||||
|
@ -67,20 +70,27 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl) {
|
|||
obj->i2c = (I2CName)pinmap_merge(i2c_sda, i2c_scl);
|
||||
MBED_ASSERT(obj->i2c != (I2CName)NC);
|
||||
|
||||
// Enable I2C clock
|
||||
if (obj->i2c == I2C_1) {
|
||||
// Enable I2C1 clock and pinout if not done
|
||||
if ((obj->i2c == I2C_1)&& !i2c1_inited) {
|
||||
i2c1_inited = 1;
|
||||
__HAL_RCC_I2C1_CONFIG(RCC_I2C1CLKSOURCE_SYSCLK);
|
||||
__I2C1_CLK_ENABLE();
|
||||
// Configure I2C pins
|
||||
pinmap_pinout(sda, PinMap_I2C_SDA);
|
||||
pinmap_pinout(scl, PinMap_I2C_SCL);
|
||||
pin_mode(sda, OpenDrain);
|
||||
pin_mode(scl, OpenDrain);
|
||||
}
|
||||
if (obj->i2c == I2C_2) {
|
||||
// Enable I2C2 clock and pinout if not done
|
||||
if ((obj->i2c == I2C_2)&& !i2c2_inited) {
|
||||
i2c2_inited = 1;
|
||||
__I2C2_CLK_ENABLE();
|
||||
}
|
||||
|
||||
// Configure I2C pins
|
||||
pinmap_pinout(sda, PinMap_I2C_SDA);
|
||||
pinmap_pinout(scl, PinMap_I2C_SCL);
|
||||
pin_mode(sda, OpenDrain);
|
||||
pin_mode(scl, OpenDrain);
|
||||
}
|
||||
|
||||
// Reset to clear pending flags if any
|
||||
i2c_reset(obj);
|
||||
|
@ -91,8 +101,12 @@ 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));
|
||||
|
||||
I2cHandle.Instance = (I2C_TypeDef *)(obj->i2c);
|
||||
int timeout;
|
||||
|
||||
// wait before init
|
||||
timeout = LONG_TIMEOUT;
|
||||
while((__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BUSY)) && (timeout-- != 0));
|
||||
|
||||
// Common settings: I2C clock = 48 MHz, Analog filter = ON, Digital filter coefficient = 0
|
||||
switch (hz) {
|
||||
|
@ -274,6 +288,12 @@ int i2c_byte_write(i2c_t *obj, int data) {
|
|||
}
|
||||
|
||||
void i2c_reset(i2c_t *obj) {
|
||||
int timeout;
|
||||
|
||||
// wait before reset
|
||||
timeout = LONG_TIMEOUT;
|
||||
while((__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BUSY)) && (timeout-- != 0));
|
||||
|
||||
if (obj->i2c == I2C_1) {
|
||||
__I2C1_FORCE_RESET();
|
||||
__I2C1_RELEASE_RESET();
|
||||
|
|
|
@ -55,7 +55,13 @@ static const PinMap PinMap_I2C_SCL[] = {
|
|||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
int i2c1_inited = 0;
|
||||
int i2c2_inited = 0;
|
||||
|
||||
void i2c_init(i2c_t *obj, PinName sda, PinName scl) {
|
||||
int timeout;
|
||||
I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c);
|
||||
|
||||
// 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);
|
||||
|
@ -63,19 +69,25 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl) {
|
|||
obj->i2c = (I2CName)pinmap_merge(i2c_sda, i2c_scl);
|
||||
MBED_ASSERT(obj->i2c != (I2CName)NC);
|
||||
|
||||
// Enable I2C clock
|
||||
if (obj->i2c == I2C_1) {
|
||||
// Enable I2C clock and configure I2C pins if not done before
|
||||
if ((obj->i2c == I2C_1)&& !i2c1_inited) {
|
||||
i2c1_inited = 1;
|
||||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
|
||||
// Configure I2C pins
|
||||
pinmap_pinout(scl, PinMap_I2C_SCL);
|
||||
pin_mode(scl, OpenDrain);
|
||||
pinmap_pinout(sda, PinMap_I2C_SDA);
|
||||
pin_mode(sda, OpenDrain);
|
||||
}
|
||||
if (obj->i2c == I2C_2) {
|
||||
if ((obj->i2c == I2C_2)&& !i2c2_inited) {
|
||||
i2c2_inited = 1;
|
||||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
|
||||
}
|
||||
|
||||
// Configure I2C pins
|
||||
pinmap_pinout(scl, PinMap_I2C_SCL);
|
||||
pin_mode(scl, OpenDrain);
|
||||
pinmap_pinout(sda, PinMap_I2C_SDA);
|
||||
pin_mode(sda, OpenDrain);
|
||||
}
|
||||
|
||||
// Reset to clear pending flags if any
|
||||
i2c_reset(obj);
|
||||
|
@ -85,10 +97,17 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl) {
|
|||
}
|
||||
|
||||
void i2c_frequency(i2c_t *obj, int hz) {
|
||||
int timeout;
|
||||
|
||||
I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c);
|
||||
I2C_InitTypeDef I2C_InitStructure;
|
||||
|
||||
if ((hz != 0) && (hz <= 400000)) {
|
||||
|
||||
// wait before init
|
||||
timeout = LONG_TIMEOUT;
|
||||
while((I2C_GetFlagStatus(i2c, I2C_FLAG_BUSY)) && (timeout-- != 0));
|
||||
|
||||
I2C_DeInit(i2c);
|
||||
|
||||
// I2C configuration
|
||||
|
@ -253,6 +272,13 @@ int i2c_byte_write(i2c_t *obj, int data) {
|
|||
}
|
||||
|
||||
void i2c_reset(i2c_t *obj) {
|
||||
I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c);
|
||||
int timeout;
|
||||
|
||||
// wait before reset
|
||||
timeout = LONG_TIMEOUT;
|
||||
while((I2C_GetFlagStatus(i2c, I2C_FLAG_BUSY)) && (timeout-- != 0));
|
||||
|
||||
if (obj->i2c == I2C_1) {
|
||||
RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE);
|
||||
RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE);
|
||||
|
|
|
@ -63,6 +63,10 @@ static const PinMap PinMap_I2C_SCL[] = {
|
|||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
int i2c1_inited = 0;
|
||||
int i2c2_inited = 0;
|
||||
int i2c3_inited = 0;
|
||||
|
||||
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);
|
||||
|
@ -71,23 +75,39 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl) {
|
|||
obj->i2c = (I2CName)pinmap_merge(i2c_sda, i2c_scl);
|
||||
MBED_ASSERT(obj->i2c != (I2CName)NC);
|
||||
|
||||
// Enable I2C clock
|
||||
if (obj->i2c == I2C_1) {
|
||||
// Enable I2C1 clock and pinout if not done
|
||||
if ((obj->i2c == I2C_1)&& !i2c1_inited) {
|
||||
i2c1_inited = 1;
|
||||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
|
||||
RCC_I2CCLKConfig(RCC_I2C1CLK_SYSCLK);
|
||||
}
|
||||
if (obj->i2c == I2C_2) {
|
||||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
|
||||
}
|
||||
if (obj->i2c == I2C_3) {
|
||||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C3, ENABLE);
|
||||
// Configure I2C pins
|
||||
pinmap_pinout(scl, PinMap_I2C_SCL);
|
||||
pin_mode(scl, OpenDrain);
|
||||
pinmap_pinout(sda, PinMap_I2C_SDA);
|
||||
pin_mode(sda, OpenDrain);
|
||||
}
|
||||
|
||||
// Configure I2C pins
|
||||
pinmap_pinout(scl, PinMap_I2C_SCL);
|
||||
pin_mode(scl, OpenDrain);
|
||||
pinmap_pinout(sda, PinMap_I2C_SDA);
|
||||
pin_mode(sda, OpenDrain);
|
||||
// Enable I2C2 clock and pinout if not done
|
||||
if ((obj->i2c == I2C_2)&& !i2c2_inited) {
|
||||
i2c2_inited = 1;
|
||||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
|
||||
// Configure I2C pins
|
||||
pinmap_pinout(scl, PinMap_I2C_SCL);
|
||||
pin_mode(scl, OpenDrain);
|
||||
pinmap_pinout(sda, PinMap_I2C_SDA);
|
||||
pin_mode(sda, OpenDrain);
|
||||
}
|
||||
|
||||
// Enable I2C3 clock and pinout if not done
|
||||
if ((obj->i2c == I2C_3)&& !i2c3_inited) {
|
||||
i2c3_inited = 1;
|
||||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C3, ENABLE);
|
||||
// Configure I2C pins
|
||||
pinmap_pinout(scl, PinMap_I2C_SCL);
|
||||
pin_mode(scl, OpenDrain);
|
||||
pinmap_pinout(sda, PinMap_I2C_SDA);
|
||||
pin_mode(sda, OpenDrain);
|
||||
}
|
||||
|
||||
// Reset to clear pending flags if any
|
||||
i2c_reset(obj);
|
||||
|
@ -100,6 +120,11 @@ void i2c_frequency(i2c_t *obj, int hz) {
|
|||
I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c);
|
||||
I2C_InitTypeDef I2C_InitStructure;
|
||||
uint32_t tim = 0;
|
||||
int timeout;
|
||||
|
||||
// wait before init
|
||||
timeout = LONG_TIMEOUT;
|
||||
while((I2C_GetFlagStatus(i2c, I2C_FLAG_BUSY)) && (timeout-- != 0));
|
||||
|
||||
// Disable the Fast Mode Plus capability
|
||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); // Enable SYSCFG clock
|
||||
|
@ -302,6 +327,13 @@ int i2c_byte_write(i2c_t *obj, int data) {
|
|||
}
|
||||
|
||||
void i2c_reset(i2c_t *obj) {
|
||||
I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c);
|
||||
int timeout;
|
||||
|
||||
// wait before reset
|
||||
timeout = LONG_TIMEOUT;
|
||||
while((I2C_GetFlagStatus(i2c, I2C_FLAG_BUSY)) && (timeout-- != 0));
|
||||
|
||||
if (obj->i2c == I2C_1) {
|
||||
RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE);
|
||||
RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE);
|
||||
|
|
|
@ -57,8 +57,9 @@ static const PinMap PinMap_I2C_SCL[] = {
|
|||
|
||||
I2C_HandleTypeDef I2cHandle;
|
||||
|
||||
void i2c_init(i2c_t *obj, PinName sda, PinName scl)
|
||||
{
|
||||
int i2c1_inited = 0;
|
||||
|
||||
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);
|
||||
|
@ -66,17 +67,17 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
|
|||
obj->i2c = (I2CName)pinmap_merge(i2c_sda, i2c_scl);
|
||||
MBED_ASSERT(obj->i2c != (I2CName)NC);
|
||||
|
||||
// Enable I2C clock
|
||||
__I2C1_CLK_ENABLE();
|
||||
|
||||
// Configure the I2C clock source
|
||||
__HAL_RCC_I2C1_CONFIG(RCC_I2C1CLKSOURCE_SYSCLK);
|
||||
|
||||
// Configure I2C pins
|
||||
pinmap_pinout(sda, PinMap_I2C_SDA);
|
||||
pinmap_pinout(scl, PinMap_I2C_SCL);
|
||||
pin_mode(sda, OpenDrain);
|
||||
pin_mode(scl, OpenDrain);
|
||||
// Enable I2C1 clock and pinout if not done
|
||||
if ((obj->i2c == I2C_1)&& !i2c1_inited) {
|
||||
i2c1_inited = 1;
|
||||
__HAL_RCC_I2C1_CONFIG(RCC_I2C1CLKSOURCE_SYSCLK);
|
||||
__I2C1_CLK_ENABLE();
|
||||
// Configure I2C pins
|
||||
pinmap_pinout(sda, PinMap_I2C_SDA);
|
||||
pinmap_pinout(scl, PinMap_I2C_SCL);
|
||||
pin_mode(sda, OpenDrain);
|
||||
pin_mode(scl, OpenDrain);
|
||||
}
|
||||
|
||||
// Reset to clear pending flags if any
|
||||
i2c_reset(obj);
|
||||
|
@ -92,6 +93,11 @@ void i2c_frequency(i2c_t *obj, int hz)
|
|||
MBED_ASSERT((hz == 100000) || (hz == 400000) || (hz == 1000000));
|
||||
|
||||
I2cHandle.Instance = (I2C_TypeDef *)(obj->i2c);
|
||||
int timeout;
|
||||
|
||||
// wait before init
|
||||
timeout = LONG_TIMEOUT;
|
||||
while((__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BUSY)) && (timeout-- != 0));
|
||||
|
||||
// Update the SystemCoreClock variable.
|
||||
SystemCoreClockUpdate();
|
||||
|
@ -313,6 +319,12 @@ int i2c_byte_write(i2c_t *obj, int data)
|
|||
|
||||
void i2c_reset(i2c_t *obj)
|
||||
{
|
||||
int timeout;
|
||||
|
||||
// wait before reset
|
||||
timeout = LONG_TIMEOUT;
|
||||
while((__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BUSY)) && (timeout-- != 0));
|
||||
|
||||
__I2C1_FORCE_RESET();
|
||||
__I2C1_RELEASE_RESET();
|
||||
}
|
||||
|
|
|
@ -60,6 +60,10 @@ static const PinMap PinMap_I2C_SCL[] = {
|
|||
|
||||
I2C_HandleTypeDef I2cHandle;
|
||||
|
||||
int i2c1_inited = 0;
|
||||
int i2c2_inited = 0;
|
||||
int i2c3_inited = 0;
|
||||
|
||||
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);
|
||||
|
@ -68,23 +72,37 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl) {
|
|||
obj->i2c = (I2CName)pinmap_merge(i2c_sda, i2c_scl);
|
||||
MBED_ASSERT(obj->i2c != (I2CName)NC);
|
||||
|
||||
// Enable I2C clock
|
||||
if (obj->i2c == I2C_1) {
|
||||
// Enable I2C1 clock and pinout if not done
|
||||
if ((obj->i2c == I2C_1)&& !i2c1_inited) {
|
||||
i2c1_inited = 1;
|
||||
__I2C1_CLK_ENABLE();
|
||||
// Configure I2C pins
|
||||
pinmap_pinout(sda, PinMap_I2C_SDA);
|
||||
pinmap_pinout(scl, PinMap_I2C_SCL);
|
||||
pin_mode(sda, OpenDrain);
|
||||
pin_mode(scl, OpenDrain);
|
||||
}
|
||||
if (obj->i2c == I2C_2) {
|
||||
// Enable I2C2 clock and pinout if not done
|
||||
if ((obj->i2c == I2C_2)&& !i2c2_inited) {
|
||||
i2c2_inited = 1;
|
||||
__I2C2_CLK_ENABLE();
|
||||
// Configure I2C pins
|
||||
pinmap_pinout(sda, PinMap_I2C_SDA);
|
||||
pinmap_pinout(scl, PinMap_I2C_SCL);
|
||||
pin_mode(sda, OpenDrain);
|
||||
pin_mode(scl, OpenDrain);
|
||||
}
|
||||
if (obj->i2c == I2C_3) {
|
||||
// Enable I2C3 clock and pinout if not done
|
||||
if ((obj->i2c == I2C_3)&& !i2c3_inited) {
|
||||
i2c3_inited = 1;
|
||||
__I2C3_CLK_ENABLE();
|
||||
// Configure I2C pins
|
||||
pinmap_pinout(sda, PinMap_I2C_SDA);
|
||||
pinmap_pinout(scl, PinMap_I2C_SCL);
|
||||
pin_mode(sda, OpenDrain);
|
||||
pin_mode(scl, OpenDrain);
|
||||
}
|
||||
|
||||
// Configure I2C pins
|
||||
pinmap_pinout(sda, PinMap_I2C_SDA);
|
||||
pinmap_pinout(scl, PinMap_I2C_SCL);
|
||||
pin_mode(sda, OpenDrain);
|
||||
pin_mode(scl, OpenDrain);
|
||||
|
||||
// Reset to clear pending flags if any
|
||||
i2c_reset(obj);
|
||||
|
||||
|
@ -98,6 +116,11 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl) {
|
|||
void i2c_frequency(i2c_t *obj, int hz) {
|
||||
MBED_ASSERT((hz != 0) && (hz <= 400000));
|
||||
I2cHandle.Instance = (I2C_TypeDef *)(obj->i2c);
|
||||
int timeout;
|
||||
|
||||
// wait before init
|
||||
timeout = LONG_TIMEOUT;
|
||||
while((__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BUSY)) && (timeout-- != 0));
|
||||
|
||||
// I2C configuration
|
||||
I2cHandle.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
|
||||
|
@ -285,6 +308,12 @@ int i2c_byte_write(i2c_t *obj, int data) {
|
|||
}
|
||||
|
||||
void i2c_reset(i2c_t *obj) {
|
||||
int timeout;
|
||||
|
||||
// wait before reset
|
||||
timeout = LONG_TIMEOUT;
|
||||
while((__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BUSY)) && (timeout-- != 0));
|
||||
|
||||
if (obj->i2c == I2C_1) {
|
||||
__I2C1_FORCE_RESET();
|
||||
__I2C1_RELEASE_RESET();
|
||||
|
|
|
@ -62,8 +62,11 @@ static const PinMap PinMap_I2C_SCL[] = {
|
|||
|
||||
I2C_HandleTypeDef I2cHandle;
|
||||
|
||||
void i2c_init(i2c_t *obj, PinName sda, PinName scl)
|
||||
{
|
||||
int i2c1_inited = 0;
|
||||
int i2c2_inited = 0;
|
||||
int i2c3_inited = 0;
|
||||
|
||||
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);
|
||||
|
@ -71,23 +74,37 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
|
|||
obj->i2c = (I2CName)pinmap_merge(i2c_sda, i2c_scl);
|
||||
MBED_ASSERT(obj->i2c != (I2CName)NC);
|
||||
|
||||
// Enable I2C clock
|
||||
if (obj->i2c == I2C_1) {
|
||||
// Enable I2C1 clock and pinout if not done
|
||||
if ((obj->i2c == I2C_1)&& !i2c1_inited) {
|
||||
i2c1_inited = 1;
|
||||
__I2C1_CLK_ENABLE();
|
||||
// Configure I2C pins
|
||||
pinmap_pinout(sda, PinMap_I2C_SDA);
|
||||
pinmap_pinout(scl, PinMap_I2C_SCL);
|
||||
pin_mode(sda, OpenDrain);
|
||||
pin_mode(scl, OpenDrain);
|
||||
}
|
||||
if (obj->i2c == I2C_2) {
|
||||
// Enable I2C2 clock and pinout if not done
|
||||
if ((obj->i2c == I2C_2)&& !i2c2_inited) {
|
||||
i2c2_inited = 1;
|
||||
__I2C2_CLK_ENABLE();
|
||||
// Configure I2C pins
|
||||
pinmap_pinout(sda, PinMap_I2C_SDA);
|
||||
pinmap_pinout(scl, PinMap_I2C_SCL);
|
||||
pin_mode(sda, OpenDrain);
|
||||
pin_mode(scl, OpenDrain);
|
||||
}
|
||||
if (obj->i2c == I2C_3) {
|
||||
// Enable I2C3 clock and pinout if not done
|
||||
if ((obj->i2c == I2C_3)&& !i2c3_inited) {
|
||||
i2c3_inited = 1;
|
||||
__I2C3_CLK_ENABLE();
|
||||
// Configure I2C pins
|
||||
pinmap_pinout(sda, PinMap_I2C_SDA);
|
||||
pinmap_pinout(scl, PinMap_I2C_SCL);
|
||||
pin_mode(sda, OpenDrain);
|
||||
pin_mode(scl, OpenDrain);
|
||||
}
|
||||
|
||||
// Configure I2C pins
|
||||
pinmap_pinout(sda, PinMap_I2C_SDA);
|
||||
pinmap_pinout(scl, PinMap_I2C_SCL);
|
||||
pin_mode(sda, OpenDrain);
|
||||
pin_mode(scl, OpenDrain);
|
||||
|
||||
// Reset to clear pending flags if any
|
||||
i2c_reset(obj);
|
||||
|
||||
|
@ -98,10 +115,14 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
|
|||
obj->slave = 0;
|
||||
}
|
||||
|
||||
void i2c_frequency(i2c_t *obj, int hz)
|
||||
{
|
||||
void i2c_frequency(i2c_t *obj, int hz) {
|
||||
MBED_ASSERT((hz != 0) && (hz <= 400000));
|
||||
I2cHandle.Instance = (I2C_TypeDef *)(obj->i2c);
|
||||
int timeout;
|
||||
|
||||
// wait before init
|
||||
timeout = LONG_TIMEOUT;
|
||||
while((__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BUSY)) && (timeout-- != 0));
|
||||
|
||||
// I2C configuration
|
||||
I2cHandle.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
|
||||
|
@ -120,8 +141,7 @@ void i2c_frequency(i2c_t *obj, int hz)
|
|||
|
||||
}
|
||||
|
||||
inline int i2c_start(i2c_t *obj)
|
||||
{
|
||||
inline int i2c_start(i2c_t *obj) {
|
||||
I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c);
|
||||
int timeout;
|
||||
|
||||
|
@ -144,8 +164,7 @@ inline int i2c_start(i2c_t *obj)
|
|||
return 0;
|
||||
}
|
||||
|
||||
inline int i2c_stop(i2c_t *obj)
|
||||
{
|
||||
inline int i2c_stop(i2c_t *obj) {
|
||||
I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c);
|
||||
|
||||
// Generate the STOP condition
|
||||
|
@ -154,8 +173,7 @@ inline int i2c_stop(i2c_t *obj)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int i2c_read(i2c_t *obj, int address, char *data, int length, int stop)
|
||||
{
|
||||
int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) {
|
||||
I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c);
|
||||
I2cHandle.Instance = (I2C_TypeDef *)(obj->i2c);
|
||||
int timeout;
|
||||
|
@ -205,8 +223,7 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop)
|
|||
return length;
|
||||
}
|
||||
|
||||
int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop)
|
||||
{
|
||||
int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) {
|
||||
I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c);
|
||||
I2cHandle.Instance = (I2C_TypeDef *)(obj->i2c);
|
||||
int timeout;
|
||||
|
@ -251,8 +268,7 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop)
|
|||
return count;
|
||||
}
|
||||
|
||||
int i2c_byte_read(i2c_t *obj, int last)
|
||||
{
|
||||
int i2c_byte_read(i2c_t *obj, int last) {
|
||||
I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c);
|
||||
int timeout;
|
||||
|
||||
|
@ -275,8 +291,7 @@ int i2c_byte_read(i2c_t *obj, int last)
|
|||
return (int)i2c->DR;
|
||||
}
|
||||
|
||||
int i2c_byte_write(i2c_t *obj, int data)
|
||||
{
|
||||
int i2c_byte_write(i2c_t *obj, int data) {
|
||||
I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c);
|
||||
int timeout;
|
||||
|
||||
|
@ -294,8 +309,13 @@ int i2c_byte_write(i2c_t *obj, int data)
|
|||
return 1;
|
||||
}
|
||||
|
||||
void i2c_reset(i2c_t *obj)
|
||||
{
|
||||
void i2c_reset(i2c_t *obj) {
|
||||
int timeout;
|
||||
|
||||
// wait before reset
|
||||
timeout = LONG_TIMEOUT;
|
||||
while((__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BUSY)) && (timeout-- != 0));
|
||||
|
||||
if (obj->i2c == I2C_1) {
|
||||
__I2C1_FORCE_RESET();
|
||||
__I2C1_RELEASE_RESET();
|
||||
|
@ -312,8 +332,7 @@ void i2c_reset(i2c_t *obj)
|
|||
|
||||
#if DEVICE_I2CSLAVE
|
||||
|
||||
void i2c_slave_address(i2c_t *obj, int idx, uint32_t address, uint32_t mask)
|
||||
{
|
||||
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 = 0;
|
||||
|
||||
|
@ -327,8 +346,7 @@ void i2c_slave_address(i2c_t *obj, int idx, uint32_t address, uint32_t mask)
|
|||
i2c->OAR1 = tmpreg;
|
||||
}
|
||||
|
||||
void i2c_slave_mode(i2c_t *obj, int enable_slave)
|
||||
{
|
||||
void i2c_slave_mode(i2c_t *obj, int enable_slave) {
|
||||
I2cHandle.Instance = (I2C_TypeDef *)(obj->i2c);
|
||||
if (enable_slave) {
|
||||
obj->slave = 1;
|
||||
|
@ -343,8 +361,7 @@ void i2c_slave_mode(i2c_t *obj, int enable_slave)
|
|||
#define WriteGeneral 2 // the master is writing to all slave
|
||||
#define WriteAddressed 3 // the master is writing to this slave (slave = receiver)
|
||||
|
||||
int i2c_slave_receive(i2c_t *obj)
|
||||
{
|
||||
int i2c_slave_receive(i2c_t *obj) {
|
||||
int retValue = NoData;
|
||||
|
||||
if (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BUSY) == 1) {
|
||||
|
@ -361,8 +378,7 @@ int i2c_slave_receive(i2c_t *obj)
|
|||
return (retValue);
|
||||
}
|
||||
|
||||
int i2c_slave_read(i2c_t *obj, char *data, int length)
|
||||
{
|
||||
int i2c_slave_read(i2c_t *obj, char *data, int length) {
|
||||
uint32_t Timeout;
|
||||
int size = 0;
|
||||
|
||||
|
@ -416,8 +432,7 @@ int i2c_slave_read(i2c_t *obj, char *data, int length)
|
|||
return size;
|
||||
}
|
||||
|
||||
int i2c_slave_write(i2c_t *obj, const char *data, int length)
|
||||
{
|
||||
int i2c_slave_write(i2c_t *obj, const char *data, int length) {
|
||||
uint32_t Timeout;
|
||||
int size = 0;
|
||||
|
||||
|
|
|
@ -60,6 +60,9 @@ static const PinMap PinMap_I2C_SCL[] = {
|
|||
|
||||
I2C_HandleTypeDef I2cHandle;
|
||||
|
||||
int i2c1_inited = 0;
|
||||
int i2c2_inited = 0;
|
||||
|
||||
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);
|
||||
|
@ -68,21 +71,28 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl) {
|
|||
obj->i2c = (I2CName)pinmap_merge(i2c_sda, i2c_scl);
|
||||
MBED_ASSERT(obj->i2c != (I2CName)NC);
|
||||
|
||||
// Enable I2C clock
|
||||
if (obj->i2c == I2C_1) {
|
||||
// Enable I2C1 clock and pinout if not done
|
||||
if ((obj->i2c == I2C_1)&& !i2c1_inited) {
|
||||
i2c1_inited = 1;
|
||||
__HAL_RCC_I2C1_CONFIG(RCC_I2C1CLKSOURCE_SYSCLK);
|
||||
__I2C1_CLK_ENABLE();
|
||||
// Configure I2C pins
|
||||
pinmap_pinout(sda, PinMap_I2C_SDA);
|
||||
pinmap_pinout(scl, PinMap_I2C_SCL);
|
||||
pin_mode(sda, OpenDrain);
|
||||
pin_mode(scl, OpenDrain);
|
||||
}
|
||||
if (obj->i2c == I2C_2) {
|
||||
// Enable I2C2 clock and pinout if not done
|
||||
if ((obj->i2c == I2C_2)&& !i2c2_inited) {
|
||||
i2c2_inited = 1;
|
||||
__I2C2_CLK_ENABLE();
|
||||
// Configure I2C pins
|
||||
pinmap_pinout(sda, PinMap_I2C_SDA);
|
||||
pinmap_pinout(scl, PinMap_I2C_SCL);
|
||||
pin_mode(sda, OpenDrain);
|
||||
pin_mode(scl, OpenDrain);
|
||||
}
|
||||
|
||||
// Configure I2C pins
|
||||
pinmap_pinout(sda, PinMap_I2C_SDA);
|
||||
pinmap_pinout(scl, PinMap_I2C_SCL);
|
||||
pin_mode(sda, OpenDrain);
|
||||
pin_mode(scl, OpenDrain);
|
||||
|
||||
// Reset to clear pending flags if any
|
||||
i2c_reset(obj);
|
||||
|
||||
|
@ -93,6 +103,11 @@ 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));
|
||||
I2cHandle.Instance = (I2C_TypeDef *)(obj->i2c);
|
||||
int timeout;
|
||||
|
||||
// wait before init
|
||||
timeout = LONG_TIMEOUT;
|
||||
while((__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BUSY)) && (timeout-- != 0));
|
||||
|
||||
// Common settings: I2C clock = 32 MHz, Analog filter = ON, Digital filter coefficient = 0
|
||||
switch (hz) {
|
||||
|
@ -274,6 +289,12 @@ int i2c_byte_write(i2c_t *obj, int data) {
|
|||
}
|
||||
|
||||
void i2c_reset(i2c_t *obj) {
|
||||
int timeout;
|
||||
|
||||
// wait before reset
|
||||
timeout = LONG_TIMEOUT;
|
||||
while((__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BUSY)) && (timeout-- != 0));
|
||||
|
||||
if (obj->i2c == I2C_1) {
|
||||
__I2C1_FORCE_RESET();
|
||||
__I2C1_RELEASE_RESET();
|
||||
|
|
|
@ -56,6 +56,9 @@ static const PinMap PinMap_I2C_SCL[] = {
|
|||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
int i2c1_inited = 0;
|
||||
int i2c2_inited = 0;
|
||||
|
||||
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);
|
||||
|
@ -64,19 +67,27 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl) {
|
|||
obj->i2c = (I2CName)pinmap_merge(i2c_sda, i2c_scl);
|
||||
MBED_ASSERT(obj->i2c != (I2CName)NC);
|
||||
|
||||
// Enable I2C clock
|
||||
if (obj->i2c == I2C_1) {
|
||||
// Enable I2C1 clock and pinout if not done
|
||||
if ((obj->i2c == I2C_1)&& !i2c1_inited) {
|
||||
i2c1_inited = 1;
|
||||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
|
||||
}
|
||||
if (obj->i2c == I2C_2) {
|
||||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
|
||||
// Configure I2C pins
|
||||
pinmap_pinout(scl, PinMap_I2C_SCL);
|
||||
pin_mode(scl, OpenDrain);
|
||||
pinmap_pinout(sda, PinMap_I2C_SDA);
|
||||
pin_mode(sda, OpenDrain);
|
||||
}
|
||||
|
||||
// Configure I2C pins
|
||||
pinmap_pinout(scl, PinMap_I2C_SCL);
|
||||
pin_mode(scl, OpenDrain);
|
||||
pinmap_pinout(sda, PinMap_I2C_SDA);
|
||||
pin_mode(sda, OpenDrain);
|
||||
// Enable I2C2 clock and pinout if not done
|
||||
if ((obj->i2c == I2C_2)&& !i2c2_inited) {
|
||||
i2c2_inited = 1;
|
||||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
|
||||
// Configure I2C pins
|
||||
pinmap_pinout(scl, PinMap_I2C_SCL);
|
||||
pin_mode(scl, OpenDrain);
|
||||
pinmap_pinout(sda, PinMap_I2C_SDA);
|
||||
pin_mode(sda, OpenDrain);
|
||||
}
|
||||
|
||||
// Reset to clear pending flags if any
|
||||
i2c_reset(obj);
|
||||
|
@ -88,10 +99,15 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl) {
|
|||
void i2c_frequency(i2c_t *obj, int hz) {
|
||||
I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c);
|
||||
I2C_InitTypeDef I2C_InitStructure;
|
||||
int timeout;
|
||||
|
||||
if (hz == 0) return;
|
||||
if (hz > 400000) hz = 400000;
|
||||
|
||||
// wait before init
|
||||
timeout = LONG_TIMEOUT;
|
||||
while((I2C_GetFlagStatus(i2c, I2C_FLAG_BUSY)) && (timeout-- != 0));
|
||||
|
||||
/* Warning: To use the I2C at 400 kHz (in fast mode), the PCLK1 frequency
|
||||
(I2C peripheral input clock) must be a multiple of 10 MHz.
|
||||
With the actual clock configuration, the max frequency is measured at 296 kHz */
|
||||
|
@ -272,6 +288,13 @@ int i2c_byte_write(i2c_t *obj, int data) {
|
|||
}
|
||||
|
||||
void i2c_reset(i2c_t *obj) {
|
||||
I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c);
|
||||
int timeout;
|
||||
|
||||
// wait before reset
|
||||
timeout = LONG_TIMEOUT;
|
||||
while((I2C_GetFlagStatus(i2c, I2C_FLAG_BUSY)) && (timeout-- != 0));
|
||||
|
||||
if (obj->i2c == I2C_1) {
|
||||
RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE);
|
||||
RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE);
|
||||
|
|
Loading…
Reference in New Issue