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

STM32 NUCLEO板之硬件I2C

[复制链接]
三创电子(Tcreate) 发布时间:2014-12-25 09:56
       今天测试液晶屏附带的AT24C02,都说STM32的I2C是个鸡肋,但是之前用103的I2C、030的I2C 都能驱动,不过大数据操作不知道效果,没有试过,但是STM8的I2C到目前为止,真心没有跑过去,今天再测下072的I2C吧。
5 I: G* o+ g4 Q/ `; q9 q       直接跑之前030操作256K的EPROM,发现数据异常,查看手册发现02的内存地址只需要1个字节,改了之后,发现还是有异常,前几个字节是正常的(联系写50字节),后面的全都是0xFF,但是单个字节的写50次都没有问题,然后又对照数据手册看,发现02的连续写最大只支持8字节(256K的支持128字节,也就是page的size定义不同),8字节的连续写感觉和单字节的写 没有啥区别就没在继续测试了,这里贴出读写的核心代码,供大家参考下 ' m0 Q( `0 y1 d# I. P

% E7 c" {5 {/ l2 ~+ Y; ~8 n初始化:0 y( Y# N9 m- ^, D+ O' e, |0 Q* f
void I2C_uConfiguration(void); \5 j7 v5 V2 x# L" {* A1 w
{
  {: _: x9 A8 U' |5 i        I2C_InitTypeDef    I2C_uInitStructure;( p% c1 ^7 H+ n9 E# e/ }$ v+ }  K
        GPIO_InitTypeDef   GPIO_uInitStructure;) Q, H/ [. Q; P- D% q7 y+ X+ v+ z/ C
       
( D$ q1 t$ g7 m, Y9 W        RCC_I2CCLKConfig(RCC_I2C1CLK_SYSCLK);
, q- B8 w% K$ j        2 Q0 z- f8 {9 G( C7 T  u$ Z
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);
; Q; o# F5 Z' m6 x3 u        RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
" g9 f5 ]: c2 k        # ~& }& S) A0 \9 u- M, U
        // I2C1_SCL -> PB8 ) @* a0 s% O8 Z0 ]" W3 u
        // I2C1_SDA -> PB90$ M" S" X( o& V/ Q
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_1);
0 J( z( L4 {6 z0 u0 H! w8 I        GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_1);' }6 ~  g0 ?8 n& h" J# ?6 c0 Z
       
7 _! ]5 D, ^6 F- t% |+ e' x        GPIO_uInitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;  H1 G! t$ ]4 I
        GPIO_uInitStructure.GPIO_Mode = GPIO_Mode_AF;
) m( z0 _2 A, K* c' B        GPIO_uInitStructure.GPIO_OType = GPIO_OType_PP;  
, e2 G. ~. N* c* o, S- u        GPIO_uInitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;( T, j9 [! `- r( h
        GPIO_uInitStructure.GPIO_Speed = GPIO_Speed_Level_3;  // 10M6 t" Z* w8 Z$ w9 b. V3 ~- Q% D
        GPIO_Init(GPIOB,&GPIO_uInitStructure);! i6 d: c2 ^% P2 \! }- Q" o
        ( m% {! e: c5 h( H# w9 Y
        I2C_uInitStructure.I2C_Mode = I2C_Mode_I2C;- i8 q/ C2 U7 S, ]! i
        I2C_uInitStructure.I2C_Ack = I2C_Ack_Enable;3 \1 r' m5 J: I+ @. n3 Q" M
        I2C_uInitStructure.I2C_AnalogFilter = I2C_AnalogFilter_Enable;
# m, T2 N" V( ~        I2C_uInitStructure.I2C_DigitalFilter = 0;# H  K4 u, t+ q" y
        I2C_uInitStructure.I2C_Timing = 0x40B22536;
# {+ i" i% g( Q8 h  c1 ~        I2C_uInitStructure.I2C_OwnAddress1 = 0;
- P! K. d* q; v$ S        I2C_uInitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
9 O/ W- ?* \  k& J1 O+ B# L        I2C_Init(I2C1,&I2C_uInitStructure);& H8 b: M0 K* `
       
4 i, x, Z: i! A$ T        I2C_Cmd(I2C1,ENABLE);
, |$ q) \8 X5 P' C}; o+ G% ?, D1 H
$ s8 Y% r! W5 M+ C! y

1 o8 H8 X: D; ?1 K" S连续读:& p- \7 J% e% t) R( U" I
void I2C_uReadData(INT8U SlaveAddr,INT8U ReadAddr,INT8U ReadLen,INT8U *ReadBuf)+ I2 O" M+ j; m! Q* }3 z' j9 a
{
, K$ b) N# `4 j# r* U        INT8U i;( T1 B/ k; g# |, j9 y, h% _
7 y0 c+ V7 P7 w: m- t
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
" @+ R+ o( W0 M3 ?- B        I2C_TransferHandling(I2C1,SlaveAddr,1,I2C_SoftEnd_Mode,I2C_Generate_Start_Write);
0 k' a+ ]/ }6 G0 ?& c        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET);
6 E/ b  _- ~1 e0 `        I2C_SendData(I2C1,ReadAddr);
2 D( |$ C  `5 }( n        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TC) == RESET);
' o' `* A* a3 A+ h* c+ w        I2C_TransferHandling(I2C1,SlaveAddr,ReadLen,I2C_AutoEnd_Mode,I2C_Generate_Start_Read);
# Q& g% b6 {  k: b6 j        for(i=0;i<ReadLen;i++)! e$ s  @9 M) J9 `2 o
        {
' B7 ^6 @0 F1 k& _, d                while(I2C_GetFlagStatus(I2C1,I2C_FLAG_RXNE) == RESET);
. o- N  u: `, E  ^0 G                ReadBuf[i] = I2C_ReceiveData(I2C1);
2 K5 i5 }1 Q" R$ M9 M" t        }! o' A9 o6 O! Q7 p! Z
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_STOPF) == RESET);
1 L+ a# h0 c' o: C# X9 C}
# B/ r( e) O! W# x" Q* N$ u
; f0 a( q$ b% s2 i, _; s% M, S: r4 U3 a: A) A1 S
字节写:9 T$ L0 M$ v2 X7 L7 Y
void I2C_uWriteByte(INT8U SlaveAddr,INT8U WriteAddr,INT8U Data)
! M; o3 b, {# b, ~9 W{- V- L4 H: `6 l0 S' V
        INT8U i;
  z! l& F5 c6 R* t% K8 h
- L2 y. _9 D2 V; ^5 B        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));: U1 Z4 E" m! ~5 k, A; V/ L) G, ~
        I2C_TransferHandling(I2C1,SlaveAddr,1,I2C_Reload_Mode,I2C_Generate_Start_Write);# E% ]6 N, C5 N4 i+ \
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET);
) b" j% y+ ^5 T1 U/ _2 o        I2C_SendData(I2C1,WriteAddr);
4 ], w9 G& Z: Z4 a: ?5 f9 b% c        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TCR) == RESET);2 G+ Z  W: t! a$ x& \8 y
        I2C_TransferHandling(I2C1,SlaveAddr,1,I2C_AutoEnd_Mode,I2C_No_StartStop);7 w. t, Q* U( _. {
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET);1 u( F$ T! l+ G, B9 W2 [4 A0 h
        I2C_SendData(I2C1, Data);3 C+ a8 R* Y2 ?
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_STOPF) == RESET);
8 ?6 p6 `% s$ l; K: a$ Q        I2C_ClearFlag(I2C1, I2C_ICR_STOPCF);
. d5 c9 h% P* N/ h9 H% }        Delay_ms(5);% d; S. y- m$ c* `. h, X
}
+ ~4 Q$ x* b- v; Q+ X3 p: n* w: _7 ]+ N/ `2 n1 F& l( ?! C) ]3 j

/ e* F/ r8 |* E  k
- `5 |; L, z) H4 R8 d% R' \8 `. D" E' ]

) o( h  g' j0 k) P
赞 收藏 评论16 发布时间:2014-12-25 09:56

举报

16个回答
三创电子(Tcreate) 回答时间:2015-1-5 15:17:18
万里-363223 发表于 2015-1-5 15:04
5 ]% {! A# r: c; }STM32的硬件I2C不太稳定
2 N, V$ m+ R: G- T2 X# X
稳定性是没有测试过,不过有产品偶尔死机,现在想是不是I2C导致的看门狗复位呢  还没有来得及验证……
三创电子(Tcreate) 回答时间:2015-1-6 14:23:42
小贾-370388 发表于 2015-1-6 13:34
' e' z' ~  o+ B. o1 L# ]好帖子收藏了

. s5 J4 C$ D- _1 e9 U. b见该贴  :https://www.stmcu.org.cn/module/forum/thread-598677-1-1.html
三创电子(Tcreate) 回答时间:2015-1-6 13:28:42
Veiko 发表于 2015-1-6 13:25# r: F1 ^/ ?! l. |
一直用的IO模拟的IIC呢,唉

: \/ L& B6 Z. x: R7 p: f' RSTM8的 我也是一直用的模拟 一直搞不通 呵呵
大秦正声 回答时间:2014-12-29 13:15:27
谢谢分享!
沐紫 回答时间:2014-12-29 13:32:35
支持
三创电子(Tcreate) 回答时间:2015-1-4 08:27:50
大秦正声 发表于 2014-12-29 13:15
* [; c  X6 M8 c0 m; \# N谢谢分享!

! L3 p0 g( \- z% T7 d8 y3 ?- j
wyxy163@126.com 回答时间:2015-1-4 09:02:44
提示: 作者被禁止或删除 内容自动屏蔽
wyxy163@126.com 回答时间:2015-1-4 09:02:59
提示: 作者被禁止或删除 内容自动屏蔽
三创电子(Tcreate) 回答时间:2015-1-5 14:47:48
数码小叶 发表于 2015-1-4 09:024 l' K9 e- c# J# W7 A! H, G8 Z: M
谢谢分享,学习学习
4 T$ E' e. E: [! U4 A7 g/ N
共同学习!
咱﹑旳青春 回答时间:2015-1-5 14:56:40
不错, 收藏当做参考了
万里-363223 回答时间:2015-1-5 15:04:20
STM32的硬件I2C不太稳定
Veiko 回答时间:2015-1-6 13:25:15
一直用的IO模拟的IIC呢,唉
小贾-370388 回答时间:2015-1-6 13:34:39
好帖子收藏了
三创电子(Tcreate) 回答时间:2015-1-6 14:22:57
小贾-370388 发表于 2015-1-6 13:345 H. ~" N) h# {8 q  x
好帖子收藏了
4 ~- x/ s. e3 `* k
正在更新中 嘿嘿
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版