void Drv_I2C_Config( void )
{
GPIO_InitTypeDef GPIO_InitStruct;
/* GPIO Ports Clock Enable */
I2C1_SCL_GPIO_CLK_ENABLE();
I2C1_SDA_GPIO_CLK_ENABLE();
/*Configure GPIO pin : BAT_INT_Pin */
GPIO_InitStruct.Pin = BAT_I2C1_SCL_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(BAT_I2C1_SCL_GPIO_Port, &GPIO_InitStruct);
GPIO_InitStruct.Pin = BAT_I2C1_SDA_Pin;
HAL_GPIO_Init(BAT_I2C1_SDA_GPIO_Port, &GPIO_InitStruct);
I2C_SCL_H;
I2C_SDA_H;
}
void Drv_I2C_Start( void )
{
I2C_SCL_H;
I2C_SDA_H;
i2c_Delay();
I2C_SDA_L;
i2c_Delay();
I2C_SCL_L;
i2c_Delay();
}
/***************************************************************
Name: Drv_I2C_Stop
Params: void
Return: void
Description: CPU·¢ÆðI2C×ÜÏßÍ£Ö¹ÐźÅ
***************************************************************/
void Drv_I2C_Stop( void )
{
I2C_SDA_L;
I2C_SCL_H;
i2c_Delay();
I2C_SDA_H;
}
void Drv_I2C_SendByte( uint8_t dat )
{
uint8_t i;
for (i = 0; i < 8; i++)
{
I2C_SCL_L;
i2c_Delay();
if(dat & 0x80)
{
I2C_SDA_H;
}
else
{
I2C_SDA_L;
}
dat <<= 1;
i2c_Delay();
I2C_SCL_H;
i2c_Delay();
}
I2C_SCL_L;
i2c_Delay();
}
uint8_t Drv_I2C_WaitAck(void)
{
uint8_t re;
SDA_Input();
I2C_SCL_L;
i2c_Delay();
I2C_SDA_H;
i2c_Delay();
I2C_SCL_H;
i2c_Delay();
if(I2C_SDA_GET)
{
re = 1;
}
else
{
re = 0;
}
I2C_SCL_L;
i2c_Delay();
SDA_Output();
return re;
}
我使用的是stm32l8的芯片,i2c周期大概是10us,写地址0x6B,无应答信号,我使用这个程序写eeprom的地址0xA0,是有应答。
原理图如下,VCC_USB使用5V电压输入,VBAT和VBAT_SYS_OUT都有有4.2V电压。
Wu JW:
请抓一下,通信时,I2C口的SCL和SDA的波形。
user3473265:
回复 Wu JW:
难道写地址不是0x6B吗?
Wu JW:
回复 user3473265:
请将SCL和SDA放在同一个时间窗口内,不然没办法判断。
user3473265:
回复 Wu JW:
Wu JW:
回复 user3473265:
目前I2C地址有问题,请仔细按照我们的Datasheet来配置。目前的设置为地址为35h。
前7位是I2C地址,第8位是读写位,第9位为ACK。
user3473265:
回复 Wu JW:
我是发送的0x6Bh,第一个时钟周期是发送的0,第二个周期是1,第三个周期是1,第四个周期是0,依次往后。