你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

RTC DS1307 I2C 无应答,大家看看

[复制链接]
chinacool 提问时间:2015-4-23 15:55 /
本帖最后由 bwu 于 2015-4-23 16:00 编辑

目前在调试一块RTC 芯片 DS1307 用的是I2C接口,采用的是IO模拟时序(硬件I2C看着有点蛋疼
​在写入器件地址后,器件没有应答,不知道是什么情况。

...​
DS1307_start();
DS1307_write_byte(0xD0); //发送写命令
​Ack_DS1307();​
​..

//IIC发送一个字节
static void DS1307_write_byte(unsigned char dat)
{
unsigned char i;

SDA_OUT();
    IIC_SCL(0); //释放总线准备数据
    SysCtlDelay(8); //延时

    //Data is transferred with the most significant bit (MSB) first.
for (i = 0; i < 8; i++)
{
if (dat & 0x80) //MSB
{
IIC_SDA(1);
}
else
{
IIC_SDA(0);
}

dat <<= 1;
SysCtlDelay(8); //延时
IIC_SCL(1); //锁定总线传输数据
SysCtlDelay(8); //延时
IIC_SCL(0);
SysCtlDelay(8); //延时
}
}


/*
收从机应答:将数据线(SDA)置高,时钟线(SCL)变低-->变高-->变低,
                判断数据线(SDA)的电平:低为有应答,高位无应答
*/
static void Ack_DS1307(void)
{
    unsigned char errtime=250;  //因故障接收方无ACK,超时值为255。
    //数据线升高,以便捕捉相应信号,(相应信号:拉低数据线)
    SDA_OUT();
    IIC_SCL(0);SysCtlDelay(8);
    IIC_SDA(1);SysCtlDelay(8);
    SDA_IN(); SysCtlDelay(8);     //SDA设置为输入   
    IIC_SCL(1);SysCtlDelay(8);

    while (READ_SDA()) //等待捕捉相应信号,信号没有到来前一直保持循环,信号到来后迅速跳出循环
    {
    errtime--;
    if (!errtime)
    {
                 DS1307_stop(); //传送失败,停止传送
         Printf("Error: ack failed\r\n");
         return ;
    }
    }

    SDA_OUT();
    IIC_SCL(0);//无论传送是否正确,都需放空总线,以备后用
    SysCtlDelay(8);

    return ;
}

​打印出 Printf("Error: ack failed\r\n");  

​可以确定的是时序是正确的,按照datasheet上来的。
​好无解!!
收藏 评论4 发布时间:2015-4-23 15:55

举报

4个回答
废鱼 回答时间:2015-4-23 16:38:26
楼主,你还是抓一下波形吧。
拼命三郎 回答时间:2015-4-23 18:07:35
dd.jpg
kanimal 回答时间:2015-4-27 22:37:42
帮顶一下
kanimal 回答时间:2015-4-27 22:39:10
帮顶一下

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版