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

STM32 NUCLEO板之硬件I2C

[复制链接]
三创电子(Tcreate) 发布时间:2014-12-25 09:56
       今天测试液晶屏附带的AT24C02,都说STM32的I2C是个鸡肋,但是之前用103的I2C、030的I2C 都能驱动,不过大数据操作不知道效果,没有试过,但是STM8的I2C到目前为止,真心没有跑过去,今天再测下072的I2C吧。8 l. o) a+ o; b; H7 H; |+ ^
       直接跑之前030操作256K的EPROM,发现数据异常,查看手册发现02的内存地址只需要1个字节,改了之后,发现还是有异常,前几个字节是正常的(联系写50字节),后面的全都是0xFF,但是单个字节的写50次都没有问题,然后又对照数据手册看,发现02的连续写最大只支持8字节(256K的支持128字节,也就是page的size定义不同),8字节的连续写感觉和单字节的写 没有啥区别就没在继续测试了,这里贴出读写的核心代码,供大家参考下
8 R* ?4 M$ t. |; g. ^
0 Y5 C' T4 P0 ^% J初始化:
5 @& r& g+ D" E2 ~void I2C_uConfiguration(void)0 r! Z5 a/ Q: v! `* ?7 N: ~$ C. i
{
. l: z! h: V" s+ G% R        I2C_InitTypeDef    I2C_uInitStructure;
( [# L" |- Y2 x( ^0 V        GPIO_InitTypeDef   GPIO_uInitStructure;1 ?( P$ A6 ^. j
       
4 k! P. f. G- D. ~# S) ~        RCC_I2CCLKConfig(RCC_I2C1CLK_SYSCLK);! m: x$ a$ c" k9 p3 `
       
; N$ ]& }. t* p        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);
% }+ i. U$ ?9 h7 S: Z2 G        RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
1 @+ }) V8 x2 T! r0 b        1 l/ Z! f4 J0 \+ R
        // I2C1_SCL -> PB8
" f1 H7 U/ w8 R3 B& m( }3 L        // I2C1_SDA -> PB90! h1 g) b% a7 }) N
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_1);9 @; h' j$ I" f
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_1);
( C6 T, n; \2 a' [       
! P" k: `" H" p4 l! |        GPIO_uInitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;3 ^3 N' P, m+ H# }7 D
        GPIO_uInitStructure.GPIO_Mode = GPIO_Mode_AF;
1 j. m" d9 w$ t' _$ D; y4 Z! o% B        GPIO_uInitStructure.GPIO_OType = GPIO_OType_PP;  ) \# e. _# N* G5 x  ]* |, i1 r
        GPIO_uInitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;! Y9 t) v( ^. N' h; D3 _5 a% c! u$ V
        GPIO_uInitStructure.GPIO_Speed = GPIO_Speed_Level_3;  // 10M
) F- Y  F+ s+ w: J        GPIO_Init(GPIOB,&GPIO_uInitStructure);' {" n# L9 Z  D3 E2 w0 x
       
) d8 Q5 a  y) H+ L% V0 N        I2C_uInitStructure.I2C_Mode = I2C_Mode_I2C;
/ C; s6 P  j# i8 ?- u; _" j2 [& p        I2C_uInitStructure.I2C_Ack = I2C_Ack_Enable;
; K& }: k+ h- h( J$ C  H        I2C_uInitStructure.I2C_AnalogFilter = I2C_AnalogFilter_Enable;
1 e) u, q! |5 R/ s3 ]+ v, S8 Y        I2C_uInitStructure.I2C_DigitalFilter = 0;
8 x3 O% x" f( m  s! j9 \5 i8 {        I2C_uInitStructure.I2C_Timing = 0x40B22536;' p# R1 B1 b6 i2 @, o
        I2C_uInitStructure.I2C_OwnAddress1 = 0;$ I" G2 C" }3 p! k/ Z2 G+ @- D
        I2C_uInitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  c8 j- @0 X8 f9 k  Q        I2C_Init(I2C1,&I2C_uInitStructure);
% i4 T( S, ]( `% |: N% k, z       
2 |. h# I1 w; ?' V& v. X9 ~# r        I2C_Cmd(I2C1,ENABLE);
% {3 L3 X9 F7 h' N& v}1 ?6 I# }6 f0 J+ i" t8 n/ q! {
- i, _% o# y& _( @) U: i/ W3 Q

& h4 k; W6 t) ^+ k% E* U. c连续读:. y. k0 Q9 B; x+ Y" v; _" |) |2 M4 z
void I2C_uReadData(INT8U SlaveAddr,INT8U ReadAddr,INT8U ReadLen,INT8U *ReadBuf)0 j/ R% x) B* X+ u
{
  T& T$ W1 D% C" a+ {. y        INT8U i;
/ M5 D5 m6 ~- y  l' ?; P
, q# _4 c# I4 H& \        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
) _* f- v8 F% E        I2C_TransferHandling(I2C1,SlaveAddr,1,I2C_SoftEnd_Mode,I2C_Generate_Start_Write);0 d0 g# j) A# o& ?" s7 |
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET);
( ~/ C0 J! d+ `& `# A/ b& J        I2C_SendData(I2C1,ReadAddr);1 g4 V, Y2 V2 H- v
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TC) == RESET);9 I# T; B6 |( N2 N
        I2C_TransferHandling(I2C1,SlaveAddr,ReadLen,I2C_AutoEnd_Mode,I2C_Generate_Start_Read);/ [4 ^! V  K, h7 Y  [
        for(i=0;i<ReadLen;i++)4 u- }. s, A: B6 E. }
        {3 |, V( z" M: l3 K' @
                while(I2C_GetFlagStatus(I2C1,I2C_FLAG_RXNE) == RESET);; k( h1 z& Q, H
                ReadBuf[i] = I2C_ReceiveData(I2C1);
0 y3 i/ B7 c% L3 M3 i3 d6 m        }
8 ^# E$ f# p$ c4 s        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_STOPF) == RESET);
" L+ S" }0 ?! Q- Z}
7 P- o, l: t6 s+ g7 ?
& _( x. I, r, J3 E+ y, o- m, w
) c. L. V6 N" T; B字节写:1 e! ~7 q8 g9 Q% u9 r
void I2C_uWriteByte(INT8U SlaveAddr,INT8U WriteAddr,INT8U Data)
4 _+ D) U3 N1 F6 p& P{* z  ?7 J( Z6 d
        INT8U i;( c. n6 G" F* t
0 a% U& [! W8 \# `( y& q  e3 Q$ T
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
) |; Y% O% g6 _+ I+ r: u/ `2 T" |        I2C_TransferHandling(I2C1,SlaveAddr,1,I2C_Reload_Mode,I2C_Generate_Start_Write);+ \0 P+ l1 z! ~' t$ J# N
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET);
1 P0 Y7 |5 q+ w" U( R* h, r1 Y        I2C_SendData(I2C1,WriteAddr);
6 a0 f8 J8 y9 T! H% d0 L        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TCR) == RESET);
# M2 L, Z! [2 b2 V3 b) s& ~, w/ m* g: x5 F        I2C_TransferHandling(I2C1,SlaveAddr,1,I2C_AutoEnd_Mode,I2C_No_StartStop);
3 r: M+ g( Z: n8 p/ f; i5 c/ @        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET);
( d& {( f. ]3 _2 \) h, Z        I2C_SendData(I2C1, Data);
; N2 w- `4 i' B2 _1 r  S% i        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_STOPF) == RESET);
7 w4 D0 @$ P8 N! Z+ d/ S        I2C_ClearFlag(I2C1, I2C_ICR_STOPCF);1 D# {3 |3 p% ^+ a" s5 l
        Delay_ms(5);
: t$ O8 b/ i7 s; [; g0 W}
# z2 H9 L# M0 @9 Y7 \8 @/ R2 x5 z9 v% w* s. F$ y  d
4 |: S+ J: O5 `
* P+ N" L8 H6 \

5 G1 i( O: c0 k7 z0 ?$ _5 {+ G9 F; a$ y2 m5 N1 i& S
收藏 评论16 发布时间:2014-12-25 09:56

举报

16个回答
三创电子(Tcreate) 回答时间:2015-1-5 15:17:18
万里-363223 发表于 2015-1-5 15:049 J3 j" N% U" N9 a5 `2 R7 k" \! V+ f4 D
STM32的硬件I2C不太稳定

6 h3 a' ?& p9 S稳定性是没有测试过,不过有产品偶尔死机,现在想是不是I2C导致的看门狗复位呢  还没有来得及验证……
三创电子(Tcreate) 回答时间:2015-1-6 14:23:42
小贾-370388 发表于 2015-1-6 13:34) B9 [$ s4 z& p
好帖子收藏了
7 q' W4 F5 m6 Z2 a9 O) q
见该贴  :https://www.stmcu.org.cn/module/forum/thread-598677-1-1.html
三创电子(Tcreate) 回答时间:2015-1-6 13:28:42
Veiko 发表于 2015-1-6 13:251 ~, C3 g( |2 i
一直用的IO模拟的IIC呢,唉

$ _# M9 x* _4 t1 u0 WSTM8的 我也是一直用的模拟 一直搞不通 呵呵
大秦正声 回答时间:2014-12-29 13:15:27
谢谢分享!
沐紫 回答时间:2014-12-29 13:32:35
支持
三创电子(Tcreate) 回答时间:2015-1-4 08:27:50
大秦正声 发表于 2014-12-29 13:15
+ z- |1 g& c+ ?9 {: f( F& l谢谢分享!

+ M9 a3 J. g& W) D5 m$ w, b1 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:02
9 N- K5 c, E% T7 V" ]谢谢分享,学习学习

0 p7 h- l# }, U/ ]共同学习!
咱﹑旳青春 回答时间: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:349 [# P  @7 |) `! N. I. _
好帖子收藏了

$ t* w, d- [& y0 i正在更新中 嘿嘿
12下一页

所属标签

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