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

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

[复制链接]
老牛洋车 发布时间:2019-9-15 22:26
    一周来都在尝试驱动DS1307,在用GPIO模拟I2C驱动不成功之后,尝试用硬件I2C来驱动,将I2C相关的代码复制到项目中,编译通过后但仍没有成功驱动DS1307,用逻辑分析仪抓取时序,发现单片机发出了地址信号,但没有应答信号,为了排除DS1307模块的问题,我将备用模块焊好排针测试,第一次似乎通过了I2C读写,但返回的数据全是零,复位再测试又不行了。
4 a1 a7 T0 B! N' w: V I2CWriteAddrss_3.jpg
* s6 p- o1 v3 K3 F+ \( K9 q' E6 z' I3 m; O. t; a
- p. K3 C2 [' K5 _: v0 ~
    通过分析时序图,发现单片机在发出地址之前还发出了11110000数据,不清楚这个字节的含义。进一步分析发现I2C通讯时高位在前、低位在后,而我从网上搜索到的DS1307驱动代码的模拟I2C通讯却是低位在前、高位在后,明显不符合通讯协议。下面是时序图:
; K( N/ O9 e' U  n/ d; s3 y) f2 \ I2CWriteAddrss_0.jpg ( U' k* Y7 z! g/ |9 i5 J% k8 j
3 `6 o; ]! _6 W1 ~; \
6 Z3 A+ ?2 s8 n. m3 }' W
    测试时单片机在不断地循环发出地址数据:
9 K9 G- c+ [+ e3 q6 d I2CWriteAddrss_1.jpg
7 D& V) ~# {$ e9 v, O# j
# L/ _& c" A. L; F, K: ?* e' m& U9 |9 R  E- n5 n
I2CWriteAddrss_2.jpg * T( [$ l0 y* J
" K: `0 R" z6 @

: w% a$ R8 C- @8 }    硬件I2C对DS1307进行读写操作的代码如下,这个代码是参照范例写的,也不清楚是否会是代码有问题:
8 D. X8 H4 a: W' m
  1. /******************************************************************************************
    % O( ?: n' ?- D8 z5 A
  2. * 函数名称: DS1307_I2C_Read()
    : K" Y& t0 h! e& I1 y8 L
  3. * 功能说明: 从DS1307地址addr开始获取size个字节的数据,获取的数据存储在全局变量DS_Buff中+ M2 N& V, R& ?; N
  4. * 输    入: uint8_t addr        获取数据的开始地址
    ; X" j$ ^* \7 G$ \
  5. *                        uint8_t size        要获取的数据个数(1~8), f( ~$ v/ ]0 r# a4 r5 a( |
  6. * 输    出: ui08    0=RET_OK 成功从DS1307获取数据  >0=从DS1307获取数据过程中出现错误# M3 u1 J. H5 A$ V; F) {
  7. ******************************************************************************************/, g+ I7 D4 m% k! F- \
  8. uint8_t DS1307_I2C_Read(uint8_t addr,uint8_t size)
    - r) p; g3 `4 ?: A
  9. {
    8 v2 y3 }% g' {. |
  10.     DS_Buff[0] = addr;    //将要读取的起始地址发送给DS1307( o/ P. f- @) }5 k2 }- {0 S2 u
  11.     while (HAL_I2C_Master_Transmit(&hi2c1, (uint16_t)I2C_ADDRESS|0, (uint8_t *)DS_Buff, 1, 10000) != HAL_OK)
    " o, I# B9 N! Z3 }
  12.     {. B0 Q* g" h7 I2 Y
  13.         if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
    " h" h: @: ]  k# Y
  14.         {% {5 V" m& \: h* ]& V7 Y* ]1 X: t
  15.             LCD_write_ASCII(0,3,1,(uint8_t *)"Read-Tr-ErrorA");
    9 h: y* o' }; l6 l& v( \. Z
  16.                         return 1;
    : e4 q( X* F  p7 @& H+ B# Q
  17.         }. e/ Y& ?7 z1 ^4 c& H
  18.                 LCD_write_ASCII(0,4,1,(uint8_t *)"WriteAddr-ACK!");
    + Z# y9 L9 z- W3 c* M# @6 z( t; L/ Y4 W
  19.     }
    , f2 ]  Y2 q) P* u# @! G  a
  20.     while (HAL_I2C_Master_Receive(&hi2c1, (uint16_t)I2C_ADDRESS|1, (uint8_t *)DS_Buff, size, 10000) != HAL_OK), v% L3 W5 Q  o  s. M4 O' \9 X6 @
  21.     {
    - t2 h* P2 l. j! Y
  22.         if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
    * D! S3 z- X, ~9 \
  23.         {
    , s/ h% _1 {, V' a" U- c" b
  24.             LCD_write_ASCII(0,3,1,(uint8_t *)"Read_Tr_ErrorB");
    ; t+ v3 a" b1 c# L( ~" k
  25.                         return 2;2 X' ?. s( K. H: n1 ^
  26.         }
    1 Q. k8 w) o" o: X
  27.     }( Z1 E3 D; e2 a2 z" T9 D
  28.         return 0;
    8 g9 x8 s* e, h: |3 L
  29. }
    ; B  ]  N' m! d- n& h) o# h
  30. ! [+ s: D& I: X; n
  31. /******************************************************************************************
    6 A& b* ?: ^; X- T! w1 ]9 K& g
  32. * 函数名称: DS1307_I2C_Write()
    - Q) s8 K: ^0 {0 w2 z" M; e. k
  33. * 功能说明: 从DS1307地址addr开始写入size个字节的数据,数据存储在全局变量DS_Buff中
    # \2 ]# O* a+ R) `
  34. * 输    入: uint8_t addr        写入数据的开始地址
    # o2 ^8 T7 B( [. @
  35. *                        uint8_t size        要写入的数据个数(1~8)' o3 B* ~. ~5 |2 |% J$ B$ t
  36. * 输    出: ui08    0=RET_OK 成功写入数据  >0=从DS1307写入数据过程中出现错误
    5 k# @4 }2 M+ q( A! b8 I
  37. ******************************************************************************************/
    , [4 A# O$ k6 w, [; Z5 u
  38. uint8_t DS1307_I2C_Write(uint8_t addr,uint8_t size)8 B; @; {+ W$ k; M2 n- F
  39. {
    ; ]. X) M" n5 a; ^# j# h: a
  40.     uint8_t i;
    . W, ]: {% i2 |" T. a) w
  41.         i = DS_Buff[0];
    * `* X$ w" Z9 d* o% U% q
  42.     DS_Buff[0] = addr;    //将要写入的起始地址发送给DS1307
    ' n1 q  [0 F6 }5 i4 E$ E) K
  43.     while (HAL_I2C_Master_Transmit(&hi2c1, (uint16_t)I2C_ADDRESS|0, (uint8_t *)DS_Buff, 1, 10000) != HAL_OK)
    ( f% f0 f. b& `; Z
  44.     {9 @, d7 c# A5 K( u) \
  45.         if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)+ J7 d) O! m* @  r3 q4 ?$ M
  46.         {
      P% s* n0 l2 `' e3 m  L8 ?
  47.             LCD_write_ASCII(0,3,1,(uint8_t *)"Write_Tr_ErroA");& U! s. m% N6 m3 v5 m2 w+ F
  48.                         return 11;+ O9 _- j+ a$ V" ^6 N4 @9 H8 A
  49.         }& J- I$ Q9 P$ {/ _/ v
  50.     }$ H$ I6 X- G2 J! e7 u* j9 ^8 \
  51.         DS_Buff[0] = i;
    + q3 C' E9 N! v! _
  52.     while (HAL_I2C_Master_Transmit(&hi2c1, (uint16_t)I2C_ADDRESS|0, (uint8_t *)DS_Buff, size, 10000) != HAL_OK)
    ( t0 ^3 x1 N% h, A# C/ _( d2 r
  53.     {2 J& @2 h6 i/ G; d3 s
  54.         if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)4 T+ ~- m. a* l* L
  55.         {1 n$ M. T1 ]: C1 @, b" b1 l# }
  56.             LCD_write_ASCII(0,3,1,(uint8_t *)"Write_Tr_ErroB");
    9 f! X* A3 |, s- R
  57.                         return 12;( U- F$ Q% |: V+ M9 Q: I  A4 k
  58.         }
    ( G. q9 l3 y4 g- i" H; c
  59.     }
    $ @6 }8 H8 h. m8 I
  60.         return 0;
    * }- c( A, _1 M2 G* u
  61. }
    ' w5 w! X9 \4 Z3 I& |5 s
复制代码
7 D& ]) H  p" y: Y
1 ~  t& W6 P( b, N9 K
+ y) H0 m# P! f& h6 `% V. ~& j
    不过我核对了DS1302的驱动程序,也是低位在前、高位在后通讯的,能够正常地读写,换句话说也许DS1302并不是标准的I2C。DS1307的I2C通讯时序尚未找到,但我这个模块是I2C总线除了DS1307外,还有一块AT24C32,而AT24C32是符合I2C通讯标准的,按理DS1307也应该同样符合。% B- M$ k" J; p+ i, c9 x
    下一步准备继续测试GPIO模拟I2C,一定要设法成功驱动这块DS1307。
3 o+ J3 l; |, h+ b7 O
* l' t2 p1 p& m5 U$ y* t$ T3 D8 y    为了驱动DS1307模块已经花费了一周多的时间,原来还准备测试驱动智能小车的都没来得及,轮子及电机已经买好了,但电机驱动板尚未配齐,只有等以后再测试了:
( C1 Y  U6 o* J* Q0 ~1 O% N1 ? SmartCar_0.jpg
2 N3 E4 U2 \! b( I7 Z8 j: L! k% w
$ D1 n5 n/ H6 {
赞 收藏 评论2 发布时间:2019-9-15 22:26

举报

2个回答
老牛洋车 回答时间:2019-9-16 09:18:29
    在分析了范例中I2C的时序图之后,尝试修改了原来下载的软件I2C的代码(如下图}。
5 V7 T9 `* V. n: h+ M% ~
0 ~  |  M! u) i4 m I2CWriteAddrss_4.jpg 4 \8 q# g& a" K4 k: \
    现在正继续调试软件I2C,然后参照DS1307的数据手册来修改对DS1307的驱动。6 j8 q. M" j4 E, w; j# ^7 I! v
2 w( U& Z4 d8 z# d2 b- O5 k
老牛洋车 回答时间:2019-9-16 11:19:03
通过仔细查看数据手册,DS1307是按照I2C的通讯标准,但其速度不快,我用硬件I2C设置的是400K速率,太快了,DS1307跟不上。另外还发现了一个重要因素,DS1307的供电电压范围是4.5~5.5V,而我想当然地用了3.3V,难怪不能正常工作了。

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版