打印
[应用相关]

IO口模拟iic等待不到应答

[复制链接]
2103|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Richardd|  楼主 | 2018-3-31 11:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用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;
}
沙发
Mattheww| | 2018-3-31 11:38 | 只看该作者
如果输入模式是OD需要外部电路接上拉,不然没法读高电平,如果外部没有上拉就程序配置为上拉输入

使用特权

评论回复
板凳
mmuuss586| | 2018-3-31 11:40 | 只看该作者
找个例程参考下呗,也有可能芯片坏了

使用特权

评论回复
地板
Erichk| | 2018-3-31 11:49 | 只看该作者
检查一下外部I/O是否添加上拉电阻或是在软件程序里使能上拉电阻功能再看看。

使用特权

评论回复
5
Thorald| | 2018-3-31 11:59 | 只看该作者
如果设置成上拉输入,就不能输出高、低电平了吧

使用特权

评论回复
6
gygp| | 2018-4-1 15:40 | 只看该作者
使用示波器测量了吗

使用特权

评论回复
7
updownq| | 2018-4-1 15:41 | 只看该作者
硬件的问题吗

使用特权

评论回复
8
sanfuzi| | 2018-4-1 15:41 | 只看该作者
可能IO的驱动能力不足造成的。

使用特权

评论回复
9
chenci2013| | 2018-4-1 15:42 | 只看该作者
测试信号了吗

使用特权

评论回复
10
biechedan| | 2018-4-1 15:42 | 只看该作者
Mattheww 发表于 2018-3-31 11:38
如果输入模式是OD需要外部电路接上拉,不然没法读高电平,如果外部没有上拉就程序配置为上拉输入 ...

有可能是上拉电阻。

使用特权

评论回复
11
gygp| | 2018-4-1 15:45 | 只看该作者
是不是电平信号有了吗

使用特权

评论回复
12
updownq| | 2018-4-1 15:45 | 只看该作者
使用上拉电阻试试。

使用特权

评论回复
13
sanfuzi| | 2018-4-1 15:45 | 只看该作者
使用隔离芯片吧。

使用特权

评论回复
14
chenci2013| | 2018-4-1 15:45 | 只看该作者
IIC芯片有问题吗?

使用特权

评论回复
15
biechedan| | 2018-4-1 15:45 | 只看该作者
Mattheww 发表于 2018-3-31 11:38
如果输入模式是OD需要外部电路接上拉,不然没法读高电平,如果外部没有上拉就程序配置为上拉输入 ...

外接一个上拉电阻试试。

使用特权

评论回复
16
lehuijie| | 2018-4-2 10:00 | 只看该作者
u8 I2C_Wait_ACK(void)  这最前面要把slc先拉低
在sda输入读取这最好要先把模式改为输入,我也不清楚这是为啥,自己两块板一块要要配置,另外则不用。

使用特权

评论回复
17
蝴蝶泉2018| | 2018-4-2 10:08 | 只看该作者
软件IIC......

使用特权

评论回复
18
ningling_21| | 2018-4-2 17:35 | 只看该作者
先排除硬件的问题

使用特权

评论回复
19
ayb_ice| | 2018-4-3 08:53 | 只看该作者
OD是需要外部上拉电阻的,
协议写的确实不咋地,不够严谨,但应该也可以用,有可能是其它问题
比如从机地址错了,或者调用错了,这里代码看不出实际调用过程

使用特权

评论回复
20
Prry| | 2018-4-7 23:56 | 只看该作者
参考模拟i2c:
https://blog.csdn.net/qq_20553613/article/details/78878211

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

380

帖子

0

粉丝