小学生
最后登录1970-1-1
在线时间 小时
注册时间2016-10-6
|
STM32F030模拟IIC无应答,都设置为开漏了,而且外部有上拉电阻,不知道问题出现在哪?
void GPIO_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_Level_2;
GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;
GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;
GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11);
SMBus_Stop() ;
}
void I2C_CLK(u8 mode)
{
if(mode == 1)
GPIO_SetBits(GPIOB,GPIO_Pin_10);
else
GPIO_ResetBits(GPIOB,GPIO_Pin_10);
}
void I2C_SDA(u8 mode)
{
if(mode == 1)
GPIO_SetBits(GPIOB,GPIO_Pin_11);
else
GPIO_ResetBits(GPIOB,GPIO_Pin_11);
}
unsigned char READ_I2C_SDA(void)
{
return GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11);
}
void SMBus_Start(void)
{
I2C_SDA(1) ; //SMBus_SDA=1;
I2C_CLK(1) ; //SMBus_SCL=1;
delay_us(4);
I2C_SDA(0) ; //SMBus_SDA=0;
delay_us(4);
I2C_CLK(0) ; //SMBus_SCL=0;ÇˉסI2C×üÏß,×¼±¸·¢Ëí»ò½óêÕêy¾Y
delay_us(4);
}
void SMBus_Stop(void)
{
I2C_SDA(0) ;
I2C_CLK(1) ;
delay_us(4) ;
I2C_SDA(1) ;
}
void SMBus_Send(u8 dat)
{
u8 i;
for(i=0;i<8;i++)
{
if(dat&0x80)
I2C_SDA(1) ;
else
I2C_SDA(0) ;
delay_us(2);
I2C_CLK(1) ; //SMBus_SCL=1;
delay_us(2);
I2C_CLK(0) ; //SMBus_SCL=0;
if(i == 7)
I2C_SDA(1) ;
dat <<= 1;
delay_us(2);
}
}
u8 SMBus_Read(u8 ack)
{
u8 receive=0;
u8 k;
for(k=0;k<8;k++)
{
receive<<=1;
I2C_CLK(1) ; //SMBus_SCL=1;
delay_us(2);
if(READ_I2C_SDA)
receive++;
I2C_CLK(0) ; //SMBus_SCL=0;
delay_us(2);
}
if(!ack)
NAck();//êÇ0 2»ó|′e
else
Ack();//êÇ1 ó|′e
return receive;
}
//ûóDó|′e¾íêÇ1£¬ó|′e¾íêÇ0
u8 Wait_Ack(void)
{
u8 times=0;
I2C_SDA(1) ; //SMBus_SDA=1;
delay_us(2);
I2C_CLK(1) ; //SMBus_SCL=1;
delay_us(2);
I2C_SDA(0) ;
while(READ_I2C_SDA) //while(READ_SDA)
{
times++;
if(times>20) //¶à′η¢ËíÎTó|′e£¬½áêø
{
SMBus_Stop();
return 1;
}
// USART_SendData(USART1,0x67) ;
}
I2C_CLK(0) ; //SMBus_SCL=0;
delay_us(2);
return 0;
}
void Ack(void)
{
I2C_SDA(0) ; //SMBus_SDA=0;
delay_us(2);
I2C_CLK(1) ; //SMBus_SCL=0;
delay_us(2);
I2C_CLK(0) ; //SMBus_SCL=1;
delay_us(2);
I2C_SDA(1) ;
}
void NAck(void)
{
I2C_SDA(1) ; //SMBus_SDA=1;
delay_us(2);
I2C_CLK(1) ; //SMBus_SCL=0;
delay_us(2);
I2C_CLK(0) ; //SMBus_SCL=1;
delay_us(2);
}
|
|