我用的是STM32F405,I2C从设备是气压传感器MS5611,它的地址是0XEE
//启动
void I2C_Start(void)
{
delay_us(10);
I2C1_SDA_SET();
I2C1_SCL_SET();
delay_us(10);
I2C1_SDA_RESET();
delay_us(10);
I2C1_SCL_RESET();
}
//***************停止**********************
void I2C_Stop(void)
{
//I2C1_SDA_OUT();
delay_us(10);
I2C1_SDA_RESET();
I2C1_SCL_RESET();
delay_us(10);
I2C1_SCL_SET();
delay_us(10);
I2C1_SDA_SET();
}
//********************获取ACK************************
uint8_t I2C_Wait_ACK(void)
{
I2C1_SDA_IN();
delay_us(10);
uint32_t sur_error;
//I2C1_SDA_SET();
delay_us(10);
sur_error = 0;
while(I2C1_READ_ACK() == 1)
{
sur_error++;
if(sur_error>500000)
{
I2C_Stop();
return 1;
}
delay_us(10);
}
return 0;
}
//**********************发送ACK***************************
void I2C_Send_ACK(uint8_t ack)
{
I2C1_SDA_OUT();
delay_us(10);
I2C1_SCL_RESET();
I2C1_SDA_SET();
delay_us(10);
if(ack == 0)
I2C1_SDA_RESET();
else
I2C1_SDA_SET();
I2C1_SCL_SET();
delay_us(10);
I2C1_SCL_RESET();
}
//*******************发送字节*******************
void I2C_Send_Byte(uint8_t Tdata)
{
I2C1_SCL_RESET();
delay_us(10);
for(uint8_t i=0;i<8;i++)
{
delay_us(10);
if((Tdata&0x80) == 0x80)
{
I2C1_SDA_SET();
}
else
{
I2C1_SDA_RESET();
}
delay_us(10);
I2C1_SCL_SET();
delay_us(10);
I2C1_SCL_RESET();
Tdata <<= 1;
}
}
我的主程序中还在用示波器调试,为了看每个波形,所以延时较长
//**********************主程序运行I2C******************
void I2C_Init(void)
{
GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
I2C1_SDA_SET();
I2C1_SCL_SET();
//MS5611复位(这一部分很好,均有应答)
I2C_Start();
I2C_Send_Byte(MS5611_ADDRESS);
delay_us(10);
while(I2C1_READ_ACK()==1);
delay_us(10);
I2C_Send_Byte(MS5611_RESET);
delay_us(10);
while(I2C1_READ_ACK()==1);
I2C_Stop();
delay_us(10);
//*****************************************
//***********开始读取PROM值(还没做具体读数据,因为读地址没有应答)***************
I2C_Start();
I2C_Send_Byte(0xee);
delay_us(10);
while(I2C1_READ_ACK()==1);
HAL_Delay(1000);
I2C_Send_Byte(MS5611_PROM_READ);
HAL_Delay(1000);
I2C_Stop();
delay_us(1000);
I2C_Start();
I2C_Send_Byte(0xef);
delay_us(10);
while(I2C1_READ_ACK()==1); //*最后死在该处?????????????
HAL_Delay(1000);
I2C_Stop();
delay_us(10);
}
|