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

STM32 NUCLEO板之硬件I2C

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

! V: S) |' w6 v, I( \初始化:
) K6 D/ a$ x( d. G2 Tvoid I2C_uConfiguration(void)2 `/ j# `  b3 l" M- A
{
# m- b+ N) Q0 C2 P) d4 G) V* E        I2C_InitTypeDef    I2C_uInitStructure;, ]% W  @9 B3 ^2 J6 @) t
        GPIO_InitTypeDef   GPIO_uInitStructure;: |% u: g, N$ W+ a# i9 V
       
$ Y: s2 ?1 G/ ]/ {) |6 K8 r1 c$ |        RCC_I2CCLKConfig(RCC_I2C1CLK_SYSCLK);
1 `" F: K) |; `/ y" p3 @        0 `6 S  b7 C, J
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);
- [% P" Q$ R" X2 A2 w        RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);3 m; K$ y0 G) S2 e- ~" q& X
        - c, P0 j* c$ q$ b% S9 V
        // I2C1_SCL -> PB8
+ M* t  H, ?4 F9 \. S8 y9 ?/ u) I        // I2C1_SDA -> PB90
0 F. H7 B6 q. L- y# t        GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_1);
8 d* e; A8 {, \        GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_1);5 b$ W* y% A! D8 Q& i: Z7 _8 g
        4 [' M( g1 ^2 |( i8 l6 W' F3 A
        GPIO_uInitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
6 l$ ~. v; {; Q1 t/ q7 A0 T        GPIO_uInitStructure.GPIO_Mode = GPIO_Mode_AF;: f* V  B* y. U# ^" _6 v7 u/ Q5 g
        GPIO_uInitStructure.GPIO_OType = GPIO_OType_PP;  2 g" d7 x5 D7 y. B& h6 }
        GPIO_uInitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
3 ~8 H7 [& T) f' k9 F# W# @        GPIO_uInitStructure.GPIO_Speed = GPIO_Speed_Level_3;  // 10M8 i/ m! R. o. _- C# m0 J
        GPIO_Init(GPIOB,&GPIO_uInitStructure);! z0 \* f& b3 f- Y& v% Y- g2 P9 x, b
        , d6 {$ ]. Z3 G$ d/ B! B/ U
        I2C_uInitStructure.I2C_Mode = I2C_Mode_I2C;  S6 K* m# [" }- j5 \' R& p$ v
        I2C_uInitStructure.I2C_Ack = I2C_Ack_Enable;
, U# Z& \& Y/ g; ^4 [, Z9 F8 u' }        I2C_uInitStructure.I2C_AnalogFilter = I2C_AnalogFilter_Enable;
# J! f$ Y8 ]6 A+ l/ {  @        I2C_uInitStructure.I2C_DigitalFilter = 0;
5 ?& t" m+ G; p6 u# J; f: d8 M7 ~        I2C_uInitStructure.I2C_Timing = 0x40B22536;
% z4 Y5 B# g2 z: i! g" @, H        I2C_uInitStructure.I2C_OwnAddress1 = 0;3 A# J; q3 {8 u: y6 I( D9 @
        I2C_uInitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
% ]" v! R* ~& D        I2C_Init(I2C1,&I2C_uInitStructure);1 m5 U1 @1 [% F+ b6 o: h, o8 A
       
1 y3 D* @1 f9 l# a! h! K; A        I2C_Cmd(I2C1,ENABLE);
& }' [: X+ L" N! _}+ K  H; I1 g0 K. n: ^  z

6 F* T* Q3 p$ M, w/ z: H2 S
2 {: m" _5 t' w0 Q* C/ C连续读:
6 N& K9 `3 |( k+ |5 C1 tvoid I2C_uReadData(INT8U SlaveAddr,INT8U ReadAddr,INT8U ReadLen,INT8U *ReadBuf)
4 t  l9 [- D4 v+ M( w{
. W* W5 v# Q, Q  I4 B% J        INT8U i;
9 p( e) x( ]2 n! ?6 o
. _! F" E( }, R  r+ D3 {        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
8 f( N8 [% x* n        I2C_TransferHandling(I2C1,SlaveAddr,1,I2C_SoftEnd_Mode,I2C_Generate_Start_Write);/ w8 v, x; Q/ ?
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET);; l/ {( y6 s8 ~
        I2C_SendData(I2C1,ReadAddr);/ g5 C; x4 P* Z4 B
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TC) == RESET);
+ o9 E4 q( Q% [6 f% w7 H  T# K        I2C_TransferHandling(I2C1,SlaveAddr,ReadLen,I2C_AutoEnd_Mode,I2C_Generate_Start_Read);
+ ~. \& T% C; @2 `1 P8 c9 }: q        for(i=0;i<ReadLen;i++)/ y2 ~. K- c0 L) ]8 n
        {
" Y2 n) j+ _* k6 F$ w' i                while(I2C_GetFlagStatus(I2C1,I2C_FLAG_RXNE) == RESET);
, [1 C* }9 U% `/ L                ReadBuf[i] = I2C_ReceiveData(I2C1);6 v* q2 t) t. R
        }, t( z4 R3 {. J( w' @
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_STOPF) == RESET);3 Z" [, r+ l0 s+ q4 g5 L
}
; ?9 X2 {* _: p+ Y+ q
) P8 o1 C5 W# p& l. L8 O" W3 b, E) O1 h
字节写:
$ {" Q) _: E6 [( y8 C7 l4 bvoid I2C_uWriteByte(INT8U SlaveAddr,INT8U WriteAddr,INT8U Data)
& z0 m* j) y; H& H{4 a/ b4 }% [0 a' l
        INT8U i;5 H0 P' Q, V( i/ O9 @

" Y/ \( V# J5 {' X# x' V        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
  [, l5 G8 ^/ F/ ~' [: W% J& D        I2C_TransferHandling(I2C1,SlaveAddr,1,I2C_Reload_Mode,I2C_Generate_Start_Write);
3 Y2 X, z! y/ O9 `4 o7 s" V        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET);$ p( W% p, n& d
        I2C_SendData(I2C1,WriteAddr);: A7 ^* M7 c% [# C2 H7 C" N7 Y
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TCR) == RESET);" p/ L. h" Z2 M: w
        I2C_TransferHandling(I2C1,SlaveAddr,1,I2C_AutoEnd_Mode,I2C_No_StartStop);
, J) l3 |8 _! ?# c) U; l( r8 t        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET);
5 \8 a' d8 b' q5 r        I2C_SendData(I2C1, Data);
! K" Q% J- h6 S        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_STOPF) == RESET);
3 z. @% R7 L! i4 g- J' o% @9 s        I2C_ClearFlag(I2C1, I2C_ICR_STOPCF);! P: N. f( Q9 u: r  M
        Delay_ms(5);3 r2 w0 j/ e, r1 L
}9 r% d/ F) E& \& Y$ H: d: k8 A7 ~

8 Y* J' r* b+ D- p# p+ Z. v, L) u- a" r8 T$ T$ s8 u0 \1 b
1 i. I3 D' r+ ~& b+ `, Y7 o0 l' h7 k) a7 ]

( o% @/ `! t' w1 E5 o* N. R8 Q7 D% S6 T5 \  }
赞 收藏 评论16 发布时间:2014-12-25 09:56

举报

16个回答
三创电子(Tcreate) 回答时间:2015-1-5 15:17:18
万里-363223 发表于 2015-1-5 15:04" @  ]$ {2 |. W3 t6 E2 z
STM32的硬件I2C不太稳定

1 e* ]4 C3 M6 m) |6 d+ I$ Z$ _稳定性是没有测试过,不过有产品偶尔死机,现在想是不是I2C导致的看门狗复位呢  还没有来得及验证……
三创电子(Tcreate) 回答时间:2015-1-6 14:23:42
小贾-370388 发表于 2015-1-6 13:34. p) N. ?4 B! c, W
好帖子收藏了

: N; \: `- c$ O1 P7 |见该贴  :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
8 l1 B" Y1 H8 N! I! u. C; R. H一直用的IO模拟的IIC呢,唉

7 v1 w6 G% H1 _$ x: F3 G3 u+ VSTM8的 我也是一直用的模拟 一直搞不通 呵呵
大秦正声 回答时间:2014-12-29 13:15:27
谢谢分享!
沐紫 回答时间:2014-12-29 13:32:35
支持
三创电子(Tcreate) 回答时间:2015-1-4 08:27:50
大秦正声 发表于 2014-12-29 13:150 F. d9 G# G) d( x9 M" `0 D
谢谢分享!
; A% ?7 |# D+ D. G: q% K7 v; P$ r
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:02
1 d. c9 i. V4 j谢谢分享,学习学习
9 t3 y- m( B8 o/ I( O
共同学习!
咱﹑旳青春 回答时间: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:344 N2 t  F% E+ I3 s* H& i
好帖子收藏了

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