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

RTC DS1307 I2C 无应答,大家看看

[复制链接]
bwu 提问时间: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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版