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

【STM32G4 NUCLEO G431RB】+ 尝试硬件I2C驱动DS1307

[复制链接]
老牛洋车 发布时间:2019-9-15 22:26
    一周来都在尝试驱动DS1307,在用GPIO模拟I2C驱动不成功之后,尝试用硬件I2C来驱动,将I2C相关的代码复制到项目中,编译通过后但仍没有成功驱动DS1307,用逻辑分析仪抓取时序,发现单片机发出了地址信号,但没有应答信号,为了排除DS1307模块的问题,我将备用模块焊好排针测试,第一次似乎通过了I2C读写,但返回的数据全是零,复位再测试又不行了。
I2CWriteAddrss_3.jpg


    通过分析时序图,发现单片机在发出地址之前还发出了11110000数据,不清楚这个字节的含义。进一步分析发现I2C通讯时高位在前、低位在后,而我从网上搜索到的DS1307驱动代码的模拟I2C通讯却是低位在前、高位在后,明显不符合通讯协议。下面是时序图:
I2CWriteAddrss_0.jpg


    测试时单片机在不断地循环发出地址数据:
I2CWriteAddrss_1.jpg


I2CWriteAddrss_2.jpg


    硬件I2C对DS1307进行读写操作的代码如下,这个代码是参照范例写的,也不清楚是否会是代码有问题:
  1. /******************************************************************************************
  2. * 函数名称: DS1307_I2C_Read()
  3. * 功能说明: 从DS1307地址addr开始获取size个字节的数据,获取的数据存储在全局变量DS_Buff中
  4. * 输    入: uint8_t addr        获取数据的开始地址
  5. *                        uint8_t size        要获取的数据个数(1~8)
  6. * 输    出: ui08    0=RET_OK 成功从DS1307获取数据  >0=从DS1307获取数据过程中出现错误
  7. ******************************************************************************************/
  8. uint8_t DS1307_I2C_Read(uint8_t addr,uint8_t size)
  9. {
  10.     DS_Buff[0] = addr;    //将要读取的起始地址发送给DS1307
  11.     while (HAL_I2C_Master_Transmit(&hi2c1, (uint16_t)I2C_ADDRESS|0, (uint8_t *)DS_Buff, 1, 10000) != HAL_OK)
  12.     {
  13.         if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
  14.         {
  15.             LCD_write_ASCII(0,3,1,(uint8_t *)"Read-Tr-ErrorA");
  16.                         return 1;
  17.         }
  18.                 LCD_write_ASCII(0,4,1,(uint8_t *)"WriteAddr-ACK!");
  19.     }
  20.     while (HAL_I2C_Master_Receive(&hi2c1, (uint16_t)I2C_ADDRESS|1, (uint8_t *)DS_Buff, size, 10000) != HAL_OK)
  21.     {
  22.         if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
  23.         {
  24.             LCD_write_ASCII(0,3,1,(uint8_t *)"Read_Tr_ErrorB");
  25.                         return 2;
  26.         }
  27.     }
  28.         return 0;
  29. }

  30. /******************************************************************************************
  31. * 函数名称: DS1307_I2C_Write()
  32. * 功能说明: 从DS1307地址addr开始写入size个字节的数据,数据存储在全局变量DS_Buff中
  33. * 输    入: uint8_t addr        写入数据的开始地址
  34. *                        uint8_t size        要写入的数据个数(1~8)
  35. * 输    出: ui08    0=RET_OK 成功写入数据  >0=从DS1307写入数据过程中出现错误
  36. ******************************************************************************************/
  37. uint8_t DS1307_I2C_Write(uint8_t addr,uint8_t size)
  38. {
  39.     uint8_t i;
  40.         i = DS_Buff[0];
  41.     DS_Buff[0] = addr;    //将要写入的起始地址发送给DS1307
  42.     while (HAL_I2C_Master_Transmit(&hi2c1, (uint16_t)I2C_ADDRESS|0, (uint8_t *)DS_Buff, 1, 10000) != HAL_OK)
  43.     {
  44.         if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
  45.         {
  46.             LCD_write_ASCII(0,3,1,(uint8_t *)"Write_Tr_ErroA");
  47.                         return 11;
  48.         }
  49.     }
  50.         DS_Buff[0] = i;
  51.     while (HAL_I2C_Master_Transmit(&hi2c1, (uint16_t)I2C_ADDRESS|0, (uint8_t *)DS_Buff, size, 10000) != HAL_OK)
  52.     {
  53.         if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
  54.         {
  55.             LCD_write_ASCII(0,3,1,(uint8_t *)"Write_Tr_ErroB");
  56.                         return 12;
  57.         }
  58.     }
  59.         return 0;
  60. }
复制代码



    不过我核对了DS1302的驱动程序,也是低位在前、高位在后通讯的,能够正常地读写,换句话说也许DS1302并不是标准的I2C。DS1307的I2C通讯时序尚未找到,但我这个模块是I2C总线除了DS1307外,还有一块AT24C32,而AT24C32是符合I2C通讯标准的,按理DS1307也应该同样符合。
    下一步准备继续测试GPIO模拟I2C,一定要设法成功驱动这块DS1307。

    为了驱动DS1307模块已经花费了一周多的时间,原来还准备测试驱动智能小车的都没来得及,轮子及电机已经买好了,但电机驱动板尚未配齐,只有等以后再测试了:
SmartCar_0.jpg


收藏 评论2 发布时间:2019-9-15 22:26

举报

2个回答
老牛洋车 回答时间:2019-9-16 09:18:29
    在分析了范例中I2C的时序图之后,尝试修改了原来下载的软件I2C的代码(如下图}。

I2CWriteAddrss_4.jpg
    现在正继续调试软件I2C,然后参照DS1307的数据手册来修改对DS1307的驱动。

老牛洋车 回答时间:2019-9-16 11:19:03
通过仔细查看数据手册,DS1307是按照I2C的通讯标准,但其速度不快,我用硬件I2C设置的是400K速率,太快了,DS1307跟不上。另外还发现了一个重要因素,DS1307的供电电压范围是4.5~5.5V,而我想当然地用了3.3V,难怪不能正常工作了。

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版