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

【经验分享】STM32硬件IIC操作

[复制链接]
STMCU小助手 发布时间:2022-1-25 21:49
Stm32具有IIC接口,接口有以下主要特性
多主机功能:该模块既可做主设备也可做从设备
主设备功能
C地址检测
产生和检测7位/10位地址和广播呼叫
支持不同的通讯速度
状态标志:
发送器/接收器模式标志
字节发送结束标志
总线忙标志
错误标志
2个中断向量
可选的拉长时钟功能
具单字节缓冲器的DMA
虽然很多人说STM的硬件IIC不好用,但是对于这么一个设备去探索一下还是很有必要的,指不定哪天就用上了呢,
IIC借口一共有九个寄存器,比较重要的几个寄存器分别如下

! d8 H: P9 B9 R: Q7 }. Y) C! X
1.       CR1
20141006204029435.jpg
20141006204020386.jpg
20141006204024739.jpg
" |+ ^( s* S* _# _5 j
/ w+ |6 z- G# J% l" u

# N2 V! x' j' q+ |8 R, b
由这几个位我们可以正常产生标准IIC的START条件STOP条件,ACK与NOACK

6 z. S. v+ ?! C$ i( _
CR2
' k! d. f5 n7 y* m# r5 v3 h

& l  v  Z8 ]3 f, R/ D, s: t: [
控制IIC的通行频率
这两位检测IIC总线是否收到数据
6 m0 i. {2 ~9 B* \3 i+ ]# a

& G3 f$ T! C8 W5 B$ G# _" n7 Z
  o" j% Z  o. n) h; Q8 m
20141006203908453.jpg % u* _; [- W9 ^" K/ U* U

" y. L. J9 C' Q* L& [
1.       对于硬件IIC的初始化流程包括
1.       配置IO口,配置为GPIO_Mode_AF_OD模式
2.       选择IIC模式
3.       选择是否使能自动应答以及设备地址长度
4.       设置IIC总线的传输速率
2.       硬件IIC的读写操作其实逻辑上和标准总线类似,也是发送地址等待ack发送数据等待ACK,但是因为有硬件的自动参与,所以我们不需要延时了

" j* Z* ]% N# \5 ?/ k
具体代码如下
  1. void HmcIICInit(void)& ?2 B! o. e/ v/ \
  2. {
    % n  M! w: ]7 r4 {3 U  h& f
  3.         /*GPIO初始化*/# S& Y5 }3 E4 ?* b% z
  4.         GPIO_InitTypeDef GPIO_InitStructure;% E- N8 q5 B& Y7 Y- O0 q1 j0 C
  5.         /* 配置硬件IIC需要的变量 */
    9 L: b/ ^; U9 G4 T/ l/ Q  d: r
  6.         I2C_InitTypeDef I2C_InitStructure;
    - i4 f# u. g4 W1 g5 O

  7. 2 u. L/ F8 s. B: s; l: O+ [. s2 }
  8.         /* 使能与 I2C1 有关的时钟 */; M; e' l9 R) e
  9.         RCC_APB2PeriphClockCmd  (RCC_APB2Periph_GPIOB,ENABLE ); / s0 |7 i& d% S5 T3 q; m
  10.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);  3 Q9 q- U6 j9 \, B; V4 p" @

  11. - U, Z8 S1 E2 @; w2 `$ ]- l( q
  12.         /* PB6-I2C1_SCL、PB7-I2C1_SDA*/
    / t6 S) m/ h, q0 Z+ d4 q
  13.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; ( o! `: H8 F" `  C
  14.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 7 G: [# j: c- e5 V/ l9 Z
  15.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
    ' K' k8 C( i# m/ T$ m& w
  16.         GPIO_Init(GPIOB, &GPIO_InitStructure); , L1 ~" k2 h: V* M

  17. : m# o& }9 s6 B% Y
  18.         /*IIC外设初始化*/
    8 g$ A6 g+ s$ Z2 W. b8 K
  19. - r$ I* [+ e, D8 n& s) k
  20.         /* I2C 配置 */. V- _& ~4 [3 X
  21.         I2C_InitStructure.I2C_Mode = I2C_Mode_I2C ;     //配置为普通IIC模式
    . j/ D% a9 \, N2 ]6 E
  22.         //I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
      W- B5 u+ V% L; C8 q
  23.         //I2C_InitStructure.I2C_OwnAddress1 = SlaveAddress; : A" f& Z$ G, A" G1 T$ O
  24.         I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;  //使能自动应答   
    ) x$ T! s; j, r, R3 t8 p
  25.         I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;   J/ k  t3 ^8 e' U, v8 K3 H1 v
  26.         I2C_InitStructure.I2C_ClockSpeed = 50000;   //5K的速度?0 d8 ?7 x! }+ j0 n7 b

  27. 5 m3 ]  g7 z4 y, ~0 Z% x" R
  28. ' `) ~. A5 R, t
  29.         /* I2C1 初始化 */9 [  Z! R0 ?+ a" q2 O9 D
  30.         I2C_Init(I2C1, &I2C_InitStructure);          
    % n% s$ |8 w) U2 I; {# x) B& E, o

  31. 9 `3 D1 q* g2 t5 H. A
  32.         /* 使能 I2C1 */
    $ w  k2 D6 J; l' n$ a& C+ h
  33.         I2C_Cmd  (I2C1,ENABLE);
    5 ~1 b6 f+ [# V+ H0 y% b. U
  34.         /*允许应答模式*/5 @8 B# ~* A5 x$ t
  35.         I2C_AcknowledgeConfig(I2C1, ENABLE);   
    - W% O) Y* M2 R% E. \/ H
  36. }( O2 T; `1 C* S$ X1 r' T
  37. 3 s  X2 _+ w( d: j
  38. void HmcByteWrite(u8 addr,u8 dataValue)1 q2 A! ]5 c$ n1 v: K' `8 N
  39. {9 y, e& b. V9 M, V* o6 w. t
  40.         I2C_GenerateSTART(I2C1,ENABLE);, H, G% v* K' F) ?3 [% w

  41. 3 W4 y$ i4 {- S) ~: i
  42.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));, O6 V+ X& l7 L- b) z
  43.   l# ]# v) d# O1 G
  44.         I2C_Send7bitAddress(I2C1,HMC_ADDR,I2C_Direction_Transmitter);. t( P9 R& g7 R+ G
  45. / Z) [% ]% ^& @' c9 ]* l8 o
  46.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));7 ], F. U: d! n' C( W8 k! x

  47. 0 x) J- f( P2 h( V( P4 o/ O7 {: p3 j
  48.         I2C_SendData(I2C1,addr);
    2 s/ o+ a) x! i& t3 E* m! J

  49. " m5 {- I6 \8 }( f" t5 Z# a
  50.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));6 n4 @# X: K$ P
  51. # w7 r% K' p+ s# s/ c+ i
  52.         I2C_SendData(I2C1,dataValue);3 x- M) J+ H( o
  53. 3 N$ P; M* f8 m/ _' J
  54.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
    3 _1 D8 i( t+ p& H
  55. - o  M* M4 i* E* f9 K3 ~4 S
  56.         I2C_GenerateSTOP(I2C1,ENABLE);' [3 X4 P8 g% _: y
  57. : P- p, L) T9 K; Y8 p
  58. }5 t, p5 e+ P2 V% _: A

  59. 4 R. f* ~6 E( W
  60. u8 HmcByteRead(u8 addr)9 x1 H: d( Q+ V& c9 Y) s
  61. {% {; x2 N( l3 r
  62.         u8 dataValue;
    4 j- A5 G2 N( ]3 r; n; J: N& B
  63. % [  l: G% S+ u$ P4 r4 N2 }( h
  64.         while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
    4 r& c1 c- d$ ]7 W) G6 \  b) s
  65. 1 t- G- j9 g. P: X0 C7 y
  66.         I2C_GenerateSTART(I2C1,ENABLE);//起始信号! V4 b6 z& p/ S: ^! [4 S, a

  67. * H% o; I% N; E: u8 ~8 O; f8 ]. L
  68.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
    7 X5 @# K0 p% w& |% \; h

  69. 9 z) q% j, P! S+ W2 c5 I( c1 j! C9 a, L
  70.         I2C_Send7bitAddress(I2C1,HMC_ADDR,I2C_Direction_Transmitter);//发送设备地址+写信号
    ( y' X) h, l0 m
  71. 6 f+ Y! J1 S# p, ~
  72.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//
    , ^+ h; p* [0 S% i
  73. # b  n$ m7 X- f
  74.         I2C_Cmd(I2C1,ENABLE);* ~7 z/ p+ h- b5 [0 B

  75. / w, u. [* E5 ^: {
  76.         I2C_SendData(I2C1,addr);//发送存储单元地址,从0开始; f7 a- Y; O: Q# d2 v* V
  77. ; u5 W2 n, H8 y* W: |4 k) d
  78.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
    8 L- i- t6 u8 s6 J! P5 f6 ^3 l

  79. - Q2 b$ ^/ y8 G0 d0 W) i
  80.         I2C_GenerateSTART(I2C1,ENABLE);//起始信号
    ( ]& A( e. Q( @  U+ ?5 p
  81. 9 d( y" U$ l1 j& w  K) t
  82.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
    7 d* U3 V' e* {" s+ g7 g8 Z
  83. 4 [7 z: T4 s, ]# k* p- G# C
  84.         I2C_Send7bitAddress(I2C1,HMC_ADDR,I2C_Direction_Receiver);//发送设备地址+读信号
    0 L: I9 M  j9 i5 p2 E0 S5 R! V0 a3 b8 @
  85. $ n6 H8 X( t' o! s, y! B$ a
  86.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
    9 ]/ Z8 q0 T, |; G" G6 ?( ?% O

  87. ; A1 I/ O( J2 j! e0 {) m
  88.         I2C_AcknowledgeConfig(I2C1,DISABLE);
    # Y' O$ s& T( o* x) \0 d2 l; f3 J2 ?
  89. , k. q& m7 @, W' T* t  ]
  90.         I2C_GenerateSTOP(I2C1,ENABLE);
    % ?5 i) M1 Y: G4 {( x6 R& T4 g
  91. 9 Y- K) v  x' m  U2 \0 A( a
  92.         while(!(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED)));9 Y* t# }+ n3 }1 H- {! {% P, n3 l
  93. * i" @' }. @# x- U! K3 q7 v
  94.         dataValue=I2C_ReceiveData(I2C1);//读出寄存器数据2 N( g; G* I/ l: j8 t

  95. 2 K7 q  z2 h7 N* ]
  96.         return dataValue;
    " {  p2 D: J  M- [
  97. }
    ) T$ D+ v) b0 J, }& R4 s  m
  98. 4 f5 r+ d' ]0 I- k  o# a
复制代码
" n" ]' Y, g) [

( }7 H8 n2 n0 Z' T- ?3 t% j% o
收藏 1 评论1 发布时间:2022-1-25 21:49

举报

1个回答
小猪000 回答时间:2022-1-31 22:57:51

66666

所属标签

相似分享

官网相关资源

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