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

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

[复制链接]
hujjj 发布时间: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个回答
hujjj 回答时间:2019-9-16 09:18:29
    在分析了范例中I2C的时序图之后,尝试修改了原来下载的软件I2C的代码(如下图}。

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

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

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

官网相关资源

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