搜索

[PIC®/AVR® MCU] 【CuriosityNano测评报告】09.模拟I2C驱动DS1307日历模块

[复制链接]
14944|28
hu9jj|  楼主 | 2021-4-12 14:19 | 显示全部楼层 |阅读模式
#申请原创#  

    之前曾经在帖子中提过驱动DS1307日历模块时读出的数据不正确,当时以为是模拟I2C的时序问题,花费了3~4天时间反复调试都没有结果,只好先测试长短按键及滚轮编码器。今天再继续测试驱动DS1307日历模块,仔细分析代码及逻辑分析仪抓取的时序图,发现初始化DS1307设置日期时间的时候数据就不正确,从时序图上可以看出写入的并不是正确的数据,如下图所示:
I2C_01.jpg

    读出的数据时序图与写入的基本一致(见下图),说明读数据基本正确,是写数据有问题:
I2C_02.jpg

    于是进一步分析模拟I2C的写入函数,代码如下:
  1. /******************************************************************************************************************************************
  2. * 函数名称: I2C_Send()
  3. * 功能说明:        向IIC总线发送一个字节的数据
  4. * 输    入: byte dat         要发送的数据
  5. * 输    出: 无
  6. ******************************************************************************************************************************************/
  7. void SI2C_Send(uint8_t dat)
  8. {
  9.     uint8_t i;
  10.     SDA_OUT();
  11.     SCL_0();                                //拉低时钟开始数据传输
  12.     for(i=0;i<8;i++)
  13.     {
  14.         if(((dat&0x80)>>7) == 1)
  15.             SDA_1();                        //准备好SDA数据
  16.         else
  17.             SDA_0();
  18.         dat<<=1;
  19. <blockquote>        DELAY_microseconds(2);
复制代码


    上述代码若有问题,则可能是这行if(((dat&0x80)>>7) == 1),
    经过反复测试,发现这行代码并无问题,能正确判断,但优化成下面这样也行:
  1. if(dat&0x80)
  2.     SDA_1();     //准备好SDA数据
  3.                 else
  4.     SDA_0();
  5.                 dat<<=1;
复制代码


    代码优化后依旧写数据不正确,于是便想起之前测试LCD显示时遇到的数组指针传递不过去的问题,我原来是通过数组指针将要写入的日期时间数据存入在数组中,通过指针传递到模拟I2C的写函数中,代码如下:
        SI2C_8bitBuffWrite(DS1307_ADDR,0,8,DS_Buff);

    模拟I2C写入函数接收相关的参数:
    uint8_t SI2C_8bitBuffWrite(uint8_t I2Caddr,uint8_t addr,uint8_t size,uint8_t *buff)

    分析问题应该是出在此处,于是便修改为通过全局变量数组来传递,测试果然不出所料,能够正确地写入和读出数据了。下面是模拟I2C写入的代码:
  1. /**********************************************************************************************
  2. * 函数名称: SI2C_8bitBuffWrite()
  3. * 功能说明: 向I2C器件的地址addr开始写入size个字节的数据,将要写入的数据存储在全局变量数组I2C_Buff中
  4. * 输    入: uint8_t addr        数据被写入从addr开始的地址处
  5. *                        uint8_t size        要设置的数据个数(1~8)
  6. * 输    出: uint8_t                0= 成功  1=出现错误
  7. **********************************************************************************************/
  8. uint8_t SI2C_8bitBuffWrite(uint8_t I2Caddr,uint8_t addr,uint8_t size,uint8_t *buff)
  9. {
  10.     uint8_t i = 0;
  11.       
  12.     SI2C_Start();                 //产生起始信号
  13.     SI2C_Send(I2Caddr|0);   //发送从设备芯片地址及读写位,0表示写
  14.     if(SI2CIsAck())               //检测从设备是否有响应
  15.     {
  16.         SI2C_Stop();              //产生停止信号
  17.         return 1;
  18.     }

  19.     SI2C_Send(addr);           //发送数据要写入的地址
  20.     if(SI2CIsAck())                //检测从设备是否有响应
  21.     {
  22.         SI2C_Stop();              //产生停止信号
  23.         return 2;
  24.     }

  25.     for(i=0;i<size;i++)
  26.     {
  27. //        SI2C_Send(buff[i]);
  28.         SI2C_Send(DS_Buff[i]);
  29.         if(SI2CIsAck())           //检测从设备是否有响应
  30.         {
  31.             SI2C_Stop();         //产生停止信号
  32.             return 3;
  33.         }
  34.     }

  35.     SI2C_Stop();                  //产生停止信号

  36.     return 0;
  37. }
复制代码


    这是测试过程的照片,用逻辑分析仪来抓取I2C的时序:
I2C_03.jpg

    调试过程:
I2C_04.jpg

    这是视频动画:
I2C_1.gif

使用特权

评论回复

评论

cooldog123pp 2021-5-26 19:22 回复TA
写的很详细啊调试过程,学习了! 
dql2015| | 2021-4-13 17:08 | 显示全部楼层
这个逻辑分析仪不错,有链接吗

使用特权

评论回复
hu9jj|  楼主 | 2021-4-13 18:04 | 显示全部楼层
dql2015 发表于 2021-4-13 17:08
这个逻辑分析仪不错,有链接吗

2016年淘宝上买的,待会我找找看。

使用特权

评论回复
单片小菜| | 2021-4-13 22:41 | 显示全部楼层
不错呀,感谢楼主的分享,不错的资料。

使用特权

评论回复
guijial511| | 2021-4-14 07:03 | 显示全部楼层
学习了,感谢楼主的分享。

使用特权

评论回复
kkzz| | 2021-5-3 13:36 | 显示全部楼层
ds1307时钟芯片中文资料  

使用特权

评论回复
hudi008| | 2021-5-3 13:37 | 显示全部楼层
DS1302和DS1307有什么区别  

使用特权

评论回复
lzmm| | 2021-5-3 13:38 | 显示全部楼层
ds1302和ds1307相比,哪一个计时更准确一些?  

使用特权

评论回复
minzisc| | 2021-5-3 13:38 | 显示全部楼层
性能怎么样   

使用特权

评论回复
selongli| | 2021-5-3 13:38 | 显示全部楼层
               

使用特权

评论回复
fentianyou| | 2021-5-3 13:39 | 显示全部楼层
驱动DS1307需要多大的周期  

使用特权

评论回复
xiaoyaodz| | 2021-5-3 13:39 | 显示全部楼层
怎么做内部的授时呢   

使用特权

评论回复
pixhw| | 2021-5-3 13:39 | 显示全部楼层
需要上拉电阻吗   

使用特权

评论回复
sdlls| | 2021-5-3 13:39 | 显示全部楼层
数据格式有问题吗   

使用特权

评论回复
febgxu| | 2021-5-3 13:40 | 显示全部楼层
这个有硬件iic吗   

使用特权

评论回复
hu9jj|  楼主 | 2021-5-3 17:53 | 显示全部楼层
febgxu 发表于 2021-5-3 13:40
这个有硬件iic吗

有硬件I2C,但我一直没有调试成功。

使用特权

评论回复
tfqi| | 2021-5-11 13:43 | 显示全部楼层
运行稳定吗?

使用特权

评论回复
wiba| | 2021-5-11 13:43 | 显示全部楼层
看来调试并不是一帆风顺啊

使用特权

评论回复
zljiu| | 2021-5-11 13:56 | 显示全部楼层
是什么导致读出的数据不正确呢

使用特权

评论回复
coshi| | 2021-5-11 13:56 | 显示全部楼层
仿真效果还是不错的

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

本版热帖

本版活跃用户

优质原创写原创,赢大奖

编辑推荐

  • 1 kk的回忆 得到打赏 ¥600.00
  • 2 名字还没想好 得到打赏 ¥350.00
  • 3 天意无罪 得到打赏 ¥312.00
  • 4 wolfe_yu 得到打赏 ¥210.00
  • 5 呐咯密密 得到打赏 ¥170.00
  • 6 gaoyang9992006 得到打赏 ¥120.00
  • 7 CZF11 得到打赏 ¥100.00
  • 8 年轻的国王 得到打赏 ¥90.00
  • 9 hunteredward 得到打赏 ¥90.00
  • 10 blust5 得到打赏 ¥85.00
在线客服 快速回复 返回顶部 返回列表