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

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

[复制链接]
老牛洋车 发布时间:2019-9-15 22:26
    一周来都在尝试驱动DS1307,在用GPIO模拟I2C驱动不成功之后,尝试用硬件I2C来驱动,将I2C相关的代码复制到项目中,编译通过后但仍没有成功驱动DS1307,用逻辑分析仪抓取时序,发现单片机发出了地址信号,但没有应答信号,为了排除DS1307模块的问题,我将备用模块焊好排针测试,第一次似乎通过了I2C读写,但返回的数据全是零,复位再测试又不行了。
; A) n: X1 k9 e+ r5 h  Y I2CWriteAddrss_3.jpg 0 B4 u# Y& K/ U4 K# q* h7 R
; }1 O, i" _9 P7 Z  s3 z
0 D1 W3 O, r$ L2 g& b1 \; I0 `
    通过分析时序图,发现单片机在发出地址之前还发出了11110000数据,不清楚这个字节的含义。进一步分析发现I2C通讯时高位在前、低位在后,而我从网上搜索到的DS1307驱动代码的模拟I2C通讯却是低位在前、高位在后,明显不符合通讯协议。下面是时序图:
* r3 y; g/ |: @ I2CWriteAddrss_0.jpg
- ]' q8 D4 u" D* x- |2 B  A3 J/ v! V9 G
" l9 g# W* w1 V! o0 T6 [6 T
    测试时单片机在不断地循环发出地址数据:
1 {* B& j) |, A! O1 i8 ?2 Q I2CWriteAddrss_1.jpg : @' |/ ]+ p1 q% X

5 [; _( P( A; I4 O1 j( ]
' }8 \; r+ l: v/ E- I I2CWriteAddrss_2.jpg
8 U% G8 ~, s4 X3 R" h, \0 n# S% r% L! o, k% A

- [" Y6 T, b8 @/ d7 b8 o3 X- Q7 I    硬件I2C对DS1307进行读写操作的代码如下,这个代码是参照范例写的,也不清楚是否会是代码有问题:
& D, U) h& y( L2 ?* z- R: ~5 P
  1. /******************************************************************************************
    % d' w3 L7 q% @
  2. * 函数名称: DS1307_I2C_Read()
    ( n, i$ G) |6 L' u; o4 D5 J# O
  3. * 功能说明: 从DS1307地址addr开始获取size个字节的数据,获取的数据存储在全局变量DS_Buff中' p' |/ x/ y  L/ f6 D+ \& e3 _- G) H
  4. * 输    入: uint8_t addr        获取数据的开始地址
    0 n) y# X5 b4 M% f: d  d2 F
  5. *                        uint8_t size        要获取的数据个数(1~8)4 n+ x" N: V6 q! ~
  6. * 输    出: ui08    0=RET_OK 成功从DS1307获取数据  >0=从DS1307获取数据过程中出现错误& ^2 f9 U" O7 z" |' _
  7. ******************************************************************************************/
    ; F# [7 H- i: y: |' [
  8. uint8_t DS1307_I2C_Read(uint8_t addr,uint8_t size)
    0 c7 C3 y; P) p! {7 y1 R* w
  9. {
    # S. [" B; `& }' O% _9 y
  10.     DS_Buff[0] = addr;    //将要读取的起始地址发送给DS1307
    ( G% V9 g5 c3 W: x7 N
  11.     while (HAL_I2C_Master_Transmit(&hi2c1, (uint16_t)I2C_ADDRESS|0, (uint8_t *)DS_Buff, 1, 10000) != HAL_OK)
    ; [$ S3 F0 x1 @
  12.     {  Z7 O, J3 _- M3 Y+ U$ q
  13.         if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
    + q- ]# y1 H! p- T
  14.         {
    / c. q( _3 b  i9 B
  15.             LCD_write_ASCII(0,3,1,(uint8_t *)"Read-Tr-ErrorA");4 x. `5 ~! z* k
  16.                         return 1;  K0 e7 d9 e% G( q) _- g
  17.         }
    - E' Y5 v! G0 d4 }% ^" W+ s  U0 N
  18.                 LCD_write_ASCII(0,4,1,(uint8_t *)"WriteAddr-ACK!");
    : s" \" B% u9 }0 W8 W
  19.     }
    8 u$ D4 G  X; }/ f# B  W  X
  20.     while (HAL_I2C_Master_Receive(&hi2c1, (uint16_t)I2C_ADDRESS|1, (uint8_t *)DS_Buff, size, 10000) != HAL_OK)8 q5 m# e$ v, k0 {
  21.     {* n2 ?, q4 W8 x+ q; t
  22.         if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
    5 y; q% _# b, W$ C( Z; ^  |6 {' ~: G
  23.         {
    - F+ T* w& N; i9 n
  24.             LCD_write_ASCII(0,3,1,(uint8_t *)"Read_Tr_ErrorB");
    * P* R: y  p! D5 d+ l7 Q
  25.                         return 2;
    1 u+ @7 j+ ^, P
  26.         }
    & D) H* a' F) ~3 ^  e
  27.     }
    ( `2 m) s0 ?5 b, |: q9 [
  28.         return 0;
    ! u2 s6 r4 z- M$ q1 x. D
  29. }
    9 N+ l* Z) a" D. z; m% i3 D) a1 V
  30. ; ~. D$ K* q  T+ a; s: g
  31. /****************************************************************************************** 3 j) ^3 W4 C/ \; W. p0 K) u2 h: D0 P
  32. * 函数名称: DS1307_I2C_Write()) c8 ~$ [5 l9 u* W
  33. * 功能说明: 从DS1307地址addr开始写入size个字节的数据,数据存储在全局变量DS_Buff中
    " A" Q* a: g2 u0 c& n- K8 r  y
  34. * 输    入: uint8_t addr        写入数据的开始地址
    ( N% Z. L6 z, P, m2 Z1 q. |$ j
  35. *                        uint8_t size        要写入的数据个数(1~8)- v. {8 I2 c: q) f! J. Y5 m# u
  36. * 输    出: ui08    0=RET_OK 成功写入数据  >0=从DS1307写入数据过程中出现错误8 `, H% }1 G" P
  37. ******************************************************************************************/% J  _  B9 F. V9 ]( l6 T# g9 X4 @
  38. uint8_t DS1307_I2C_Write(uint8_t addr,uint8_t size)! P; e) _% D/ v6 a
  39. {
    1 Q) o8 k7 ~/ c2 g2 E4 n- Y
  40.     uint8_t i;
    / X% P1 C) @5 _! @$ z, ?5 F5 C2 h
  41.         i = DS_Buff[0];
    1 v5 j$ Y6 B# P$ ]8 c
  42.     DS_Buff[0] = addr;    //将要写入的起始地址发送给DS13079 N3 d7 {: t4 P( ?+ t* \
  43.     while (HAL_I2C_Master_Transmit(&hi2c1, (uint16_t)I2C_ADDRESS|0, (uint8_t *)DS_Buff, 1, 10000) != HAL_OK)+ _6 T* {/ P! ?' E5 ^* W' w& I
  44.     {5 X2 a- {9 j( S7 l
  45.         if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
    / t: J9 \( ]1 L
  46.         {) S6 x) e: P$ c! r, P
  47.             LCD_write_ASCII(0,3,1,(uint8_t *)"Write_Tr_ErroA");
    ( x9 x, b# c- a/ W" }" N0 G( D& H
  48.                         return 11;
    2 S8 }8 B/ c) l* X3 V
  49.         }$ G* r: G' F$ v+ Q1 }
  50.     }8 u- a; f2 V! n9 r# q  C1 |
  51.         DS_Buff[0] = i;
    % v+ Z- C) S' R( u/ G
  52.     while (HAL_I2C_Master_Transmit(&hi2c1, (uint16_t)I2C_ADDRESS|0, (uint8_t *)DS_Buff, size, 10000) != HAL_OK)5 z' x/ t4 `( [# {" A
  53.     {
    : V! f0 |, B7 @" w( P5 S1 t
  54.         if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
    ' _) O: v' M7 E$ t1 ?$ h" x0 [
  55.         {: @! M' T6 B$ |  l
  56.             LCD_write_ASCII(0,3,1,(uint8_t *)"Write_Tr_ErroB");; ?+ G- X" t; A3 U
  57.                         return 12;% @$ O  `9 {! _% @2 ]4 n2 W8 y
  58.         }
    + d( T9 W: B$ y+ l% v* f7 N. J( q
  59.     }
    & {) n9 ^0 `/ N5 ]2 l( @  o- Q
  60.         return 0;
    % J  T! p( I2 i
  61. }* C" |2 v: u9 `6 `/ u+ h% y
复制代码
; n* m* P# w& d7 G0 ?) S* j! b6 O

+ ^4 x5 D2 T# `8 d: I! ]: e: G; t) ~
    不过我核对了DS1302的驱动程序,也是低位在前、高位在后通讯的,能够正常地读写,换句话说也许DS1302并不是标准的I2C。DS1307的I2C通讯时序尚未找到,但我这个模块是I2C总线除了DS1307外,还有一块AT24C32,而AT24C32是符合I2C通讯标准的,按理DS1307也应该同样符合。6 a: K" R0 `" s' ]( N3 [
    下一步准备继续测试GPIO模拟I2C,一定要设法成功驱动这块DS1307。- d. T- |7 w5 R! l7 p1 i2 b

- y7 z& Q- T1 |. v2 J0 @; w    为了驱动DS1307模块已经花费了一周多的时间,原来还准备测试驱动智能小车的都没来得及,轮子及电机已经买好了,但电机驱动板尚未配齐,只有等以后再测试了:
6 w, u9 |  V# Q+ w6 z SmartCar_0.jpg % u  u# ]9 a: s3 a9 H$ n5 W) s
' Q  K, r8 B0 h1 c
+ f/ A$ L* Z2 @5 g/ z$ z
收藏 评论2 发布时间:2019-9-15 22:26

举报

2个回答
老牛洋车 回答时间:2019-9-16 09:18:29
    在分析了范例中I2C的时序图之后,尝试修改了原来下载的软件I2C的代码(如下图}。5 l" ]1 V) G5 L% {
# s- A& b! ^; R$ J' A! Z8 |+ @
I2CWriteAddrss_4.jpg
8 Z3 [+ `5 a; y5 [+ f% h    现在正继续调试软件I2C,然后参照DS1307的数据手册来修改对DS1307的驱动。
% B$ E/ p% _8 F' B$ Z9 Y: m7 Q* m" X/ d5 G
老牛洋车 回答时间: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 手机版