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

STM32 NUCLEO板之硬件I2C

[复制链接]
三创电子(Tcreate) 发布时间:2014-12-25 09:56
       今天测试液晶屏附带的AT24C02,都说STM32的I2C是个鸡肋,但是之前用103的I2C、030的I2C 都能驱动,不过大数据操作不知道效果,没有试过,但是STM8的I2C到目前为止,真心没有跑过去,今天再测下072的I2C吧。! Z! h, ~- }8 u
       直接跑之前030操作256K的EPROM,发现数据异常,查看手册发现02的内存地址只需要1个字节,改了之后,发现还是有异常,前几个字节是正常的(联系写50字节),后面的全都是0xFF,但是单个字节的写50次都没有问题,然后又对照数据手册看,发现02的连续写最大只支持8字节(256K的支持128字节,也就是page的size定义不同),8字节的连续写感觉和单字节的写 没有啥区别就没在继续测试了,这里贴出读写的核心代码,供大家参考下
/ @1 H0 i; F' g* Y' C' T% v, |3 [7 n( Z6 k; |  T
初始化:* D0 C( q5 U4 i* G& p
void I2C_uConfiguration(void)
1 m  o' k: q) C4 o{
2 i, x( D9 @& ]  C: s        I2C_InitTypeDef    I2C_uInitStructure;! u( k, @) f+ [  h) h4 C+ i; n
        GPIO_InitTypeDef   GPIO_uInitStructure;
# t8 l# t7 W/ T9 \) b+ P        $ t9 w" Q+ M5 T* R& p; C2 R
        RCC_I2CCLKConfig(RCC_I2C1CLK_SYSCLK);
- `* `7 q( q2 l& M" {2 J        2 J3 @' G" j) A
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);
+ S7 M* \/ i/ H3 n        RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
2 R6 M! [7 t6 w. ]/ O6 Y        7 C- g. L9 g) }! m* X# ~9 `2 P5 F
        // I2C1_SCL -> PB8
5 L, h% t! M0 Z. N        // I2C1_SDA -> PB90
, r) x$ Z0 G6 @5 ?/ m6 a  V% P* A        GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_1);
2 L7 |3 c3 b- J8 O0 _7 ^) }- X1 Z" ^        GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_1);( Z0 f2 q6 ], q
        ! |% V+ e( i5 x7 b0 Z, W$ J, ?  |+ Z
        GPIO_uInitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
0 P8 ~  d6 C/ o) F5 T        GPIO_uInitStructure.GPIO_Mode = GPIO_Mode_AF;4 Q) `7 ?1 [, A( s' P
        GPIO_uInitStructure.GPIO_OType = GPIO_OType_PP;  9 j* F1 r5 s; H& Y5 }
        GPIO_uInitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;8 g  Q' G# M2 }" a2 b
        GPIO_uInitStructure.GPIO_Speed = GPIO_Speed_Level_3;  // 10M& {. W" b8 y' m2 F
        GPIO_Init(GPIOB,&GPIO_uInitStructure);
, v# [, E" W2 [9 @       
& D) ]4 p- I- i: y        I2C_uInitStructure.I2C_Mode = I2C_Mode_I2C;4 ~1 s0 K$ Z6 E5 e# ]- Y( ~
        I2C_uInitStructure.I2C_Ack = I2C_Ack_Enable;: \; K1 ^+ ]- W2 a- F  Q9 L
        I2C_uInitStructure.I2C_AnalogFilter = I2C_AnalogFilter_Enable;
# D: ]7 a# i! O0 K2 n& e        I2C_uInitStructure.I2C_DigitalFilter = 0;4 @4 t8 ^. z$ B+ p
        I2C_uInitStructure.I2C_Timing = 0x40B22536;2 E% i; I9 F- d7 d' _" l
        I2C_uInitStructure.I2C_OwnAddress1 = 0;
( ~* x* ]; z6 R# H* }  ~. T5 G        I2C_uInitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
* y, S1 c1 \9 G4 c# P0 d8 z* j        I2C_Init(I2C1,&I2C_uInitStructure);
, Q6 N3 w$ X0 \4 C- s6 ]+ E# E" `0 x, G        + Y( d. ]( L% ~/ l  h2 b, K4 d
        I2C_Cmd(I2C1,ENABLE);' j! y5 E7 a# B7 T, y# u
}: H. k2 u1 U/ O" H, @9 [6 P8 l

! Q5 ~+ u+ w! v/ `- E+ |; O5 p# l4 I% W# Z: K
连续读:3 O1 C  b7 ]2 F
void I2C_uReadData(INT8U SlaveAddr,INT8U ReadAddr,INT8U ReadLen,INT8U *ReadBuf)
+ ]) e. [3 d' N! C; {{/ |! Q. q4 r) A# q; D% a) U
        INT8U i;& @; \/ W' T+ r- ^9 u# Q

. U6 }: g; J, ~" d4 T, S        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));6 Q  b# u3 O) H" x. p* c
        I2C_TransferHandling(I2C1,SlaveAddr,1,I2C_SoftEnd_Mode,I2C_Generate_Start_Write);+ C! a( E9 l5 I( o/ T) u" l" \
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET);
( F5 u, h- }% V7 T# b3 g( E        I2C_SendData(I2C1,ReadAddr);+ R! \+ L  ^! }2 r
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TC) == RESET);/ i/ b: h. M5 |* s. H$ ?" N
        I2C_TransferHandling(I2C1,SlaveAddr,ReadLen,I2C_AutoEnd_Mode,I2C_Generate_Start_Read);/ `* a; @" g) U( T5 e5 \- O9 ^
        for(i=0;i<ReadLen;i++)' o! o3 J: J+ ]- w
        {
- W1 U+ {6 p6 y+ @) j, J                while(I2C_GetFlagStatus(I2C1,I2C_FLAG_RXNE) == RESET);4 A  M) |' w4 g
                ReadBuf[i] = I2C_ReceiveData(I2C1);+ q7 k- G! J. i. r
        }
( V& C! ^* ^3 T2 Y' `: @" C7 n        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_STOPF) == RESET);( }+ Z# S, M) L  p
}) h- P8 \4 {/ q
# k8 U1 a5 B* ~* P

3 C) I: k1 p+ J字节写:
3 P( _6 C! Z' k2 D% j" ~+ qvoid I2C_uWriteByte(INT8U SlaveAddr,INT8U WriteAddr,INT8U Data)
& m: b7 a1 ]4 }. b' F{
/ w2 N% S* X/ f0 T        INT8U i;
& T" {9 q: @$ N% J9 d3 l8 w' a9 A# L: u' F6 o; V: x
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
. @, }$ }) h0 x% o8 {% O        I2C_TransferHandling(I2C1,SlaveAddr,1,I2C_Reload_Mode,I2C_Generate_Start_Write);
' U4 w) |5 w8 v        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET);* h" |9 Q1 c0 u5 Z! Z# ^
        I2C_SendData(I2C1,WriteAddr);  ~$ D7 E# B5 y5 N
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TCR) == RESET);
; h" G3 P! n( |6 j) ~- R6 N/ B        I2C_TransferHandling(I2C1,SlaveAddr,1,I2C_AutoEnd_Mode,I2C_No_StartStop);
% w, p7 ^+ s& F" a1 P+ e* [$ t        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET);; u% z5 N3 V& n/ U
        I2C_SendData(I2C1, Data);
% W) y9 J  i5 M) I5 [4 y        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_STOPF) == RESET);
9 p7 h3 N" X1 h. F: A! p/ P        I2C_ClearFlag(I2C1, I2C_ICR_STOPCF);
& m/ o8 S) C  D0 u, l        Delay_ms(5);
, Y/ E9 x' y  t/ g( c8 Z1 ~, G}
  F4 M) S  C8 G" i; @2 c
/ \; O1 S! V- f1 S0 e
" {) i, D9 [3 \7 W! x! y3 o! G( ~7 y. e! O5 ]) ]& @
) {" r4 k, F1 q2 q* F

& G, F, b( `  T9 M0 R# V
收藏 评论16 发布时间:2014-12-25 09:56

举报

16个回答
三创电子(Tcreate) 回答时间:2015-1-5 15:17:18
万里-363223 发表于 2015-1-5 15:042 @, K1 }$ ~1 v3 k: y* F$ S# G1 M
STM32的硬件I2C不太稳定

7 |/ g- z+ q: B* z4 E& i( V0 A5 H, k; m稳定性是没有测试过,不过有产品偶尔死机,现在想是不是I2C导致的看门狗复位呢  还没有来得及验证……
三创电子(Tcreate) 回答时间:2015-1-6 14:23:42
小贾-370388 发表于 2015-1-6 13:34# d' {" p* ]/ i* z& j8 d6 @$ O5 r
好帖子收藏了

* k: y  d( }7 M2 e. i见该贴  :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
, H- W* ?* y7 E" ~! j' S一直用的IO模拟的IIC呢,唉
$ }4 a% a: a$ _1 r  C+ v! v
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
8 H5 O& X8 V$ B3 }- E谢谢分享!

# K: J6 v  @7 a0 q4 O
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$ e; G. E# ~( z/ ?
谢谢分享,学习学习

* p9 g2 c! t0 y2 y% q5 @共同学习!
咱﹑旳青春 回答时间: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:34
& X- i' t0 K) K6 e8 v5 k好帖子收藏了

" X  X5 p& ^8 n- [( Q! h2 n$ V正在更新中 嘿嘿
12下一页

所属标签

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