2012-10-31 1:57 PM
I am communicating with a slave device and after the generation of the start condition, I am not seeing SCL and SDA pulsing. Below is the code:
void DS2482_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; I2C_InitTypeDef I2C_InitStructure; /* Enable peripheral clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE); /* Enable GPIOB clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); /* Configure I2C2_SCL and I2C2_SDA */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_Init(GPIOB, &GPIO_InitStructure); /* Enable I2C2 reset state */ //RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, ENABLE); /* Release I2C2 from reset state */ //RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, DISABLE); I2C_DeInit(DS2482_I2C); /* DS2482 peripheral configuration */ I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_OwnAddress1 = DS2482_I2C_ADDRESS; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = DS2482_I2C_SPEED; /* enable the I2C peripheral */ I2C_Cmd(DS2482_I2C, ENABLE); I2C_Init(DS2482_I2C, &I2C_InitStructure); }int DS2482_channel_select(int channel){ // select the 1-wire channel on DS2482-800 // Returns: TRUE if channel selected // FALSE if device not detected unsigned char ch, ch_read, check; /* while the bus is busy */ while(I2C_GetFlagStatus(DS2482_I2C, I2C_FLAG_BUSY)); /* send START condition */ I2C_GenerateSTART(DS2482_I2C, ENABLE); /* test on EV5 and clear it */ while(!I2C_CheckEvent(DS2482_I2C, I2C_EVENT_MASTER_MODE_SELECT)); //I2C_AcknowledgeConfig(DS2482_I2C, ENABLE); /* Send DS2482 address for write */ I2C_Send7bitAddress(DS2482_I2C, DS2482_I2C_ADDRESS, I2C_Direction_Transmitter); #i2c-example-stm322012-11-01 3:41 AM
I had the same problem yesterday : found a fix like this :
I2C_Send7bitAddress(DS2482_I2C, DS2482_I2C_ADDRESS, I2C_Direction_Transmitter); becomes :
I2C_Send7bitAddress(DS2482_I2C, (DS2482_I2C_ADDRESS<<1), I2C_Direction_Transmitter); It appears you need to shift manually... It's quite a bit strange with a complete library from ST.
Is there any i2c config flag to set a different way ?
2012-11-01 12:41 PM
Thanks for pointing it out! I double checked and yes, the slave address needs to be shifted. It is working now :).
2013-02-25 3:02 AM
Hi Stephane,
This shouldn't be a bug as the address is a user defined parameter. The correct format is specified in reference manuals (The 7 bit device address...is placed in the most significant bits of the byte. The eighth bit can be a zero or one.). Best Regards, ST.MCUTo give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.
We’re moving the ST Community to a new platform to give you a better and more reliable community experience.