cancel
Showing results for 
Search instead for 
Did you mean: 

I2C pin config

francescatodiego
Associate II
Posted on May 18, 2015 at 21:51

My application use an I2C1-> 1wire network converter on STM32F407 device

At reset, after the I2C1 peripheral init, the application enumerate 1wire network and discover all connected devices. But the user can also connect a new 1wire device and restart the enumeration process while application running (Ok normally must shutdown the device before do it, but I know my customers...) When new enumeration request start, my code Disable i2c port Deinit the port and after short delay restart the I2C perhiperal with same config procedure called at reset With I2c peripheral disabled (all I2C1 regs are set to zero checked with emulator) I call the GPIO pin config:

static void uB_I2C_GPIO_config (eI2CID id, I2C_INIT_T* i2c)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Pin = i2c->pin_scl.pin ; GPIO_Init(i2c->pin_scl.port, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = i2c->pin_sda.pin ; GPIO_Init(i2c->pin_sda.port, &GPIO_InitStructure);
GPIO_PinAFConfig(i2c->pin_scl.port, i2c->pin_scl.source, i2c->pin_scl.altf) ;
GPIO_PinAFConfig(i2c->pin_sda.port, i2c->pin_sda.source, i2c->pin_sda.altf) ;
}

Sometime, after the call of I2C_GPIO_config the I2C1.SR2.BUSY bit is set (With I2C peripheral disabled) Ok the pinsa are already set to i2c alternate function and I can skip this config when not exit fom reset But why the I2C peripheral regs are changed with peripheral disabled ? The busy flag can be cleared only generting an I2C stop sequence.

I have

tried to send a STOP condition but the busy is always set

#i2c-config-pin
1 REPLY 1
francescatodiego
Associate II
Posted on May 19, 2015 at 09:14

I found this solution

uB_I2C_GPIO_config(id, i2c) ;
I2C_SoftwareResetCmd(I2c[id].base, ENABLE );
I2C_SoftwareResetCmd(I2c[id].base, DISABLE);