用OD模式,手册里说OD模式可以读取输入电平,这样输入输出都有了
sda是pc8,scl是pc6,
void I2C_CONFIG(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Pin=SCL_PIN|SDA_PIN;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(I2C_PORT, &GPIO_InitStructure);
GPIO_SetBits(I2C_PORT, SCL_PIN);
GPIO_SetBits(I2C_PORT, SDA_PIN);
}
等待应答
就这几个基础的程序,等待应答等不到,在做max30100模块,数据不对,调试发现等待应答等不到低电平,请大神指点一下吧,解决问题后可以加微信发红包表达感谢。
u8 I2C_Wait_ACK(void)
{
u8 flag=0;
I2C_SDA_1();
delay_us(5);
I2C_SCL_1();
delay_us(5);
if(I2C_SDA_READ())
{
flag=1;
}
else
{
flag=0;
}
// while(I2C_SDA_READ()!=0)
// {
// flag++;
// if(flag>250)
// {
// I2C_Stop();
// return 1;//ûÓнÓÊÕµ½Ó¦´ð
// }
// }
I2C_SCL_0();
delay_us(5);
return flag;//½ÓÊÕµ½´Ó»úµÄÓ¦´ð
}
开始
void I2C_Start(void)
{
I2C_SCL_1();
I2C_SDA_1();//¶¼ÊǸߵçƽ
delay_us(5);
I2C_SDA_0();//ÔÚscl¸ßµÄÇé¿öÏ£¬sda´Ó¸ßµ½µÍ
delay_us(5);
I2C_SCL_0();//sclµÍ£¬Îª·¢ËÍÊý¾Ý×ö×¼±¸
delay_us(5);
}
停止
void I2C_Stop(void)
{
I2C_SCL_1();
I2C_SDA_0();//
delay_us(5);
I2C_SDA_1();//ÔÚscl¸ßµÄÇé¿öÏ£¬sda´ÓµÍµ½¸ß
// delay_us(5);
}
发送一个字节
void I2C_Send_Byte(u8 byte)
{
u8 i;
for(i=0;i<8;i++)
{
if(byte&0x80)//ÅжϵÚһλÊÇ·ñΪ1
{
I2C_SDA_1();
}
else
{
I2C_SDA_0();
}
delay_us(5);//Êý¾ÝÏ߱仯ºó£¬sclÀ¸ß£¬¶Áµ½sdaµÄÊý¾Ý
I2C_SCL_1();
delay_us(5);
I2C_SCL_0();//sclÀµÍ£¬·¢ËÍÏÂһλÊý¾Ý
if(i==7)
{
I2C_SDA_1();//8λ½áÊøºó£¬sdaÀ¸ß£¬ÊÍ·ÅsdaÏߣ¬
}
byte<<=1;
delay_us(5);
}
}
读取一个字节
u8 I2C_Recive_Byte(void)
{
u8 i,value=0;
for(i=0;i<8;i++)
{
value<<=1;
I2C_SCL_1();
delay_us(5);
if(I2C_SDA_READ())
{
value++;
}
// delay_us(5);
I2C_SCL_0();//Êý¾ÝÏß
delay_us(5);
}
return value;
} |