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

STM32 NUCLEO板之硬件I2C

[复制链接]
三创电子(Tcreate) 发布时间:2014-12-25 09:56
       今天测试液晶屏附带的AT24C02,都说STM32的I2C是个鸡肋,但是之前用103的I2C、030的I2C 都能驱动,不过大数据操作不知道效果,没有试过,但是STM8的I2C到目前为止,真心没有跑过去,今天再测下072的I2C吧。
: ]) [6 C. q( B2 q7 s" P2 r' v% A! S       直接跑之前030操作256K的EPROM,发现数据异常,查看手册发现02的内存地址只需要1个字节,改了之后,发现还是有异常,前几个字节是正常的(联系写50字节),后面的全都是0xFF,但是单个字节的写50次都没有问题,然后又对照数据手册看,发现02的连续写最大只支持8字节(256K的支持128字节,也就是page的size定义不同),8字节的连续写感觉和单字节的写 没有啥区别就没在继续测试了,这里贴出读写的核心代码,供大家参考下 * u2 h" z: q* t) @3 G; ]8 l9 E
2 d2 }) @8 o6 T6 O2 s5 _. G
初始化:: P; ~' ]6 j: t' ]3 N
void I2C_uConfiguration(void)4 l" g8 t$ U5 A9 L% L' Y
{
+ O/ a& l& O7 D        I2C_InitTypeDef    I2C_uInitStructure;' C0 j/ }5 H, j: A% I
        GPIO_InitTypeDef   GPIO_uInitStructure;( |4 V5 N% V' L- B) N
       
2 A0 N1 q1 r& a2 o' r7 \4 B, g7 {; j0 ?        RCC_I2CCLKConfig(RCC_I2C1CLK_SYSCLK);
9 i! y% i0 y; w" z7 K7 F3 ~       
" G% M+ P! `! f+ ?/ u  S& M2 m        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);
2 p0 K# e- _5 g+ J4 ~        RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
$ T' w% q3 U+ A! ^- v8 L( o       
- U" U# r& v$ U( I: \3 `2 i        // I2C1_SCL -> PB8
9 D$ o5 E2 D/ _& R1 T0 L# A0 F        // I2C1_SDA -> PB90
& D3 B  K2 s4 z7 H3 }1 ?( B9 G( C        GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_1);6 y# c2 N; }5 ]& s/ J, N6 p1 }
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_1);
! b5 y/ F$ G! F; y$ k6 F       
) E( ^1 z* m$ }( u8 ]2 v) c0 a        GPIO_uInitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
$ Q( g) D/ Q6 t2 b- c$ L+ g; ^        GPIO_uInitStructure.GPIO_Mode = GPIO_Mode_AF;
' ^5 l, ]( Y+ ^2 z0 Z2 e- S$ ^( j        GPIO_uInitStructure.GPIO_OType = GPIO_OType_PP;  2 p8 o+ C7 |0 i1 l4 z. C( B
        GPIO_uInitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
9 y6 B9 [% ~5 }* g) [        GPIO_uInitStructure.GPIO_Speed = GPIO_Speed_Level_3;  // 10M! W; m9 d1 k! m# c
        GPIO_Init(GPIOB,&GPIO_uInitStructure);1 ]' L, L4 p) K/ ~  y# I3 G% E. Q
       
7 [, k8 J- Z6 j" K2 y/ a3 X        I2C_uInitStructure.I2C_Mode = I2C_Mode_I2C;0 `  ]& F' M# G" [+ p
        I2C_uInitStructure.I2C_Ack = I2C_Ack_Enable;
; Z% \- r. H; k+ N        I2C_uInitStructure.I2C_AnalogFilter = I2C_AnalogFilter_Enable;' y* w4 Z8 G$ o& t5 a
        I2C_uInitStructure.I2C_DigitalFilter = 0;
. `& o) i7 W; A  X        I2C_uInitStructure.I2C_Timing = 0x40B22536;
1 f' b- v) N; b8 I3 b        I2C_uInitStructure.I2C_OwnAddress1 = 0;
. G3 u" F( W6 k/ {9 P; A7 p$ Q; d) e        I2C_uInitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
' D& }1 d' O% G' x! \3 k        I2C_Init(I2C1,&I2C_uInitStructure);3 O( @, R# i5 Q+ T) k% L; G
        5 @9 b, h: F2 Y* [
        I2C_Cmd(I2C1,ENABLE);' c# F4 n& L2 F8 `/ e0 @7 j5 y  q, ]
}/ x; y! L/ r' Y" z0 N2 i) Z

* b0 X9 o' {" G
+ \: `& m" {* p5 P8 o0 B8 a$ B连续读:+ z- W* w/ _) V9 H3 ]: A
void I2C_uReadData(INT8U SlaveAddr,INT8U ReadAddr,INT8U ReadLen,INT8U *ReadBuf)
9 Q" J3 ^+ ~* ]3 B! W2 k{; E' W' p) N$ o
        INT8U i;
: Z% ]4 d) a, K5 F
( \7 R9 z$ I+ Q4 v        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));: {2 d" _3 x: R! F3 y
        I2C_TransferHandling(I2C1,SlaveAddr,1,I2C_SoftEnd_Mode,I2C_Generate_Start_Write);' I- N+ z; v9 D! ]  [
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET);
( c) a) B! [+ d6 S; Z% ]        I2C_SendData(I2C1,ReadAddr);9 l6 Y+ T: M& {5 i6 e3 B
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TC) == RESET);9 @6 G0 d/ H/ F7 D
        I2C_TransferHandling(I2C1,SlaveAddr,ReadLen,I2C_AutoEnd_Mode,I2C_Generate_Start_Read);
/ G6 s7 p0 G; {7 T* k$ k        for(i=0;i<ReadLen;i++)
5 ^4 M: }3 B2 w  U) `        {% c6 X% B! U9 w8 J+ E* B8 v
                while(I2C_GetFlagStatus(I2C1,I2C_FLAG_RXNE) == RESET);- P0 U* J: D/ ~" Z" j# I( t: Z
                ReadBuf[i] = I2C_ReceiveData(I2C1);3 w  l( O. l3 s. P; P( A
        }
! I' X' X( X* n3 ~        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_STOPF) == RESET);
7 [5 O; m, |3 @}
9 @* }1 ?4 t( t
0 H4 u( }- [/ ~+ K; u  R. G2 D9 Z
字节写:
" [( l# @1 Z! G% z, ^6 Kvoid I2C_uWriteByte(INT8U SlaveAddr,INT8U WriteAddr,INT8U Data)0 k4 r2 B% u- Z# ^8 L
{% l- K! Q6 K# r& a3 l0 t0 D/ z2 O  s
        INT8U i;1 S0 ]: Q' E# Y( A  o1 ]
( m6 u+ s* |! s* x8 U
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));# A- f6 W0 p  B4 S4 [% M
        I2C_TransferHandling(I2C1,SlaveAddr,1,I2C_Reload_Mode,I2C_Generate_Start_Write);1 Y2 m! g& u" J9 w$ v2 c( w
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET);
- }0 m& }8 [: j5 e$ [7 V        I2C_SendData(I2C1,WriteAddr);4 \% s# y' ?$ e  H
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TCR) == RESET);
# c  ~1 w: R( T$ w, u        I2C_TransferHandling(I2C1,SlaveAddr,1,I2C_AutoEnd_Mode,I2C_No_StartStop);
' s9 q* _  I7 b' r) W9 U        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET);3 n& u* z; g5 a
        I2C_SendData(I2C1, Data);! H2 ]+ b# A4 X" Y' l3 _6 I3 h1 \
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_STOPF) == RESET);0 o3 ]0 [! V9 g. q2 k6 K
        I2C_ClearFlag(I2C1, I2C_ICR_STOPCF);- w; n% o/ G' l% w( M
        Delay_ms(5);$ P+ f# f0 K3 n4 ~' t, s$ ?" j# ]9 N
}/ e9 S% p: X: `7 I8 C

- Q- C, \* A% d$ [( K- U, A. l" |% n9 [0 O

1 h& h; \/ K8 T, l1 [& y  U4 N' s/ v* {) T# {. B6 q: @$ h2 }

" W& T/ ^& w5 P4 u+ e3 Y
收藏 评论16 发布时间:2014-12-25 09:56

举报

16个回答
三创电子(Tcreate) 回答时间:2015-1-5 15:17:18
万里-363223 发表于 2015-1-5 15:04
$ ?# N/ R6 P. S4 ISTM32的硬件I2C不太稳定

7 T# _$ N/ s" r' w4 `( C稳定性是没有测试过,不过有产品偶尔死机,现在想是不是I2C导致的看门狗复位呢  还没有来得及验证……
三创电子(Tcreate) 回答时间:2015-1-6 14:23:42
小贾-370388 发表于 2015-1-6 13:34
* H/ e* l, F; ]好帖子收藏了

1 i0 A* ?: [5 ~1 n见该贴  :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
. F$ k4 f' b% X. S  c" H一直用的IO模拟的IIC呢,唉

8 @1 U( n% ~1 }  \STM8的 我也是一直用的模拟 一直搞不通 呵呵
大秦正声 回答时间:2014-12-29 13:15:27
谢谢分享!
沐紫 回答时间:2014-12-29 13:32:35
支持
三创电子(Tcreate) 回答时间:2015-1-4 08:27:50
大秦正声 发表于 2014-12-29 13:15$ _2 y1 [! `% A& N
谢谢分享!
& ~* ?% I( o: ]8 [0 o* @' p6 n
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
' \( @  ]9 n0 H: y- W谢谢分享,学习学习
9 O3 Z* @2 x; u7 h9 k( ]
共同学习!
咱﹑旳青春 回答时间: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:341 w7 i% k3 d  `2 L
好帖子收藏了
0 S" H" t& V7 Y% H9 U8 z: F
正在更新中 嘿嘿
12下一页

所属标签

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