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

【经验分享】STM32G0学习手册——I2C总线使用(使用硬件I2C-HAL库)

[复制链接]
STMCU小助手 发布时间:2021-11-8 16:08
I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。$ B- M! {: o  m8 h$ R4 L* Q
/ B* I! t# [  v( x: L
这里使用的是G071RB开发板,已经自带有24C08A芯片,是一个8K的EEPROM芯片,使用I2C总线来控制这个芯片,写入数据。, @) J( a# ?2 R  ~! u" G9 \

( [  G; g1 a6 H. }; S5 y实验步骤
' t+ h; }" m% F1、CubeMx中芯片选择STM32G071RBTx,新建工程
3 L. F+ Y! f) R% Y2 L0 b( m0 Y- t" X0 ]7 n# ^! r7 D* ^/ g
2、开启SWD调试、HSE
" v* t; E" [9 p9 ]" d) Z9 V% j3 G+ B6 v+ ]4 \6 I
20200710210326903.png

7 @6 L4 @% U% k! Y
3 z$ g5 ~9 x- q& ?2 t( N/ _0 A
20200710210417612.png

' T1 X) [, Y) z; N$ ~, d4 C. D" G9 m0 T: o
3、开启USART1 ,设置波特率115200、8bit、None(无奇偶检验)、停止位15 c+ ~# n# V7 v" h& G& ]/ B4 u

) W: `9 d6 C4 w% L1 V
2020071021064272.png
7 n6 ]4 u# r# X7 B$ i9 C; L3 p5 C
' U0 e; z! l- p* ?  M+ h
4、 设置PB5为推挽输出模式,默认上拉,用于控制eeprom的WP引脚; N' I' I+ S/ z+ O; @; o% F
+ O+ q: h' i6 f
20200710211139405.png 20200710211620223.png

$ f  y1 j9 d9 G; @
1 E  C7 J) g  U  l2 O+ I& O5、 选择PB7引脚,设置为I2C1_SDA,PB6设置为I2C_SCL,再激活I2C1,I2C Speed Moed选择:Standard Mode(标准模式),其他保持默认参数
4 @5 Y: s! C+ b$ G. Q4 z, Y5 Z& Z% l+ B4 S8 D1 }
20200710212115736.png

! S. ]( N/ o+ @0 S$ V3 n4 u
4 K! t6 j4 b. h0 ?8 {6、设置时钟树,HCLK=64MHz3 m: s* g3 ?+ \
$ I  G& q+ r/ v% b* E
20200710212802195.png
& q* u' j. u" D
3 o; I; [8 x$ f
7、在工程管理里面,设置好参数,生成代码使用MDK打开。8 _4 e" x  a+ o

1 R- s+ v7 I2 Z) Z, C5 l$ X1 F
20200710213244172.png

4 ]# Y! u  z- K( }: F
$ ^$ ~" v- e" ?) i
20200710213308820.png
" l# Z3 \5 t) i1 o

3 @8 W4 y& v- P$ i7 t; T代码部分
5 C- J6 K- a( D& A5 h1、在Debug选项卡中,Flash Download勾上“Reset and Run”
6 ?+ y/ E  p: b1 ^/ h  y* S
/ c. O  W/ z" V! _8 W) a) u2、添加printf打印代码,在usart.c文件添加如下代码
5 a# A1 w6 g# n2 ^; L( x- L/ [6 U8 u6 j% K. [
  1. /* USER CODE BEGIN 0 */
    - }6 Q* k' ^: d, k' Q2 H
  2. #include <stdio.h>3 T2 z* q( O3 E! f- h
  3. /* USER CODE BEGIN 0 */
    1 @* {: _8 G, F  n3 W
  4. #ifdef __GNUC__
    ( J* o, N. m) v1 [  V( p' r& e
  5.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf) O& c8 M6 M0 L, G2 e! ^( t. _
  6.      set to 'Yes') calls __io_putchar() */
    " b' h5 Q" X7 d
  7.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)7 |. n! F$ o9 ]1 j: s
  8. #else4 g! X+ f7 e- \) h0 P) t& G
  9.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    . b" ^4 Z* C7 [/ b% l- G5 |
  10. #endif /* __GNUC__ */9 x: W# k2 H  i/ }! {
  11. /**' p6 P+ v" `) i) A8 g" _9 Y
  12.   * @brief  Retargets the C library printf function to the USART.
    6 S9 V4 a# a4 w# `/ m5 N% ?" C7 E
  13.   * @param  None4 d% o2 m  u9 E# L3 k. H
  14.   * @retval None: S  E4 @- c  y0 D7 L- v/ A
  15.   */& V% b# D( I' ?2 X% r% Q
  16. PUTCHAR_PROTOTYPE# X2 c0 u) w6 H2 |4 e( |+ \
  17. {
    - P# v, P0 i- ^( [. N7 T
  18.   /* Place your implementation of fputc here */" ~: C1 f/ o0 u; d! A, J
  19.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */1 E) Y! q: l! F2 Z
  20.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
    : I$ F; o5 ?* t' E6 {9 }, g! @
  21.   Y+ _  C1 b3 l1 C+ h* N
  22.   return ch;" I+ M; D' S6 i3 C1 v  g8 _
  23. }$ R5 U1 K: s1 A7 O: G3 l* c" T
  24. /* USER CODE END 0 */
复制代码
% ^( e: e) [4 Q& ^$ ^
3、设置24C08A的地址8 t2 O* {7 [  ?) k, I7 y) w+ \

3 @# ~4 n7 n3 j- b1 b这里用的是8K的芯片,所以有P1,P0位(),有4个块区域,每个区域有256字节。,这就是8K芯片。A0表示第一块256字节的设备地址,A2表示第二块256字节的设备地址,A4表示第三块256字节的设备地址,A6表示第四块256字节的设备地址) C: [4 w! ]/ {) j

2 L. W: ~& A3 n* J# R
20200710214406373.png
$ q  q' P& g8 V) `

( o, O# n1 l- J8 v' U4 r8 i7 K在i2c.h文件中添加如下代码
  1. /* USER CODE BEGIN Includes */
    6 p3 P6 B, T* u& P; F
  2. ( |, |6 r! u8 Y
  3. #define ADDR_24LC08_WRITE 0XA0                 //设备地址和写指令
      s, f8 s3 Z/ i6 l9 G9 t; K
  4. #define ADDR_24LC08_READ  0XA1                 //设备地址和读指令9 C; c+ l( m! S9 @! G: S: M3 |
  5. #define BufferSize 15$ @) @* i& ~* f* P4 G
  6. . V$ H% B, D: H  {! o
  7. /* USER CODE END Includes */
复制代码
8 l7 c& s4 N& F0 S4 _& t% w2 Y& S. N
4、在main.c文件中添加如下代码3 {  \" V0 g2 w4 q- e- }0 N

: C$ `5 {3 X7 H' h& ~
  1. /* USER CODE BEGIN Includes */
    ; Z8 n. R5 d5 ~& K+ |- }! J
  2. #include <stdio.h>
    , d2 e: |5 n1 G$ c0 R
  3. #include <string.h>+ Q& B8 d% \; [$ E, K2 R
  4. uint16_t i;9 c% o/ ~2 j$ |1 q  c: w: s
  5. /* USER CODE END Includes */
    ) A+ x: V; J$ r0 p

  6. 5 _- l* s' T: M/ A. j  K# F2 Q
  7. int main(void)
      ]+ y/ n5 _! Y; T9 d+ l
  8. {  n% H. \! [. M/ `
  9. */ ?. R3 t1 D, m, r! J
  10. *
    / X  S8 F) c2 i) i! A4 y, b) @
  11. *) L* Z3 D5 Y% }, K: X( V' B5 |
  12. /* USER CODE BEGIN 2 */
    % z: S, V! W/ a( ~. `
  13.   uint8_t writerbuff[BufferSize]="This is a test.";" X0 |6 A/ C7 ^$ x& m3 F
  14.   uint8_t readbuff[BufferSize];9 q& a  d0 b+ b7 A9 P$ A6 P- k. b& c
  15.   HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);             //下拉引脚,激活eeprom芯片
    1 ?  n8 F4 J+ M7 h: ~) b
  16. " h* c+ [0 [# o' x) ]" P
  17. if(HAL_I2C_Mem_Write(&hi2c1,ADDR_24LC08_WRITE,0,I2C_MEMADD_SIZE_8BIT,writerbuff,BufferSize,0x10)==HAL_OK)( \! Q1 N3 h# t. f
  18.   printf("Write succeeded.\r\n");0 r+ K0 \- G0 ^2 Q5 }1 D: [
  19.   else
    6 q7 x5 d0 w& J  v
  20.   printf("Write failed.\r\n");
    ) [. n& I; y( c- f) W# N
  21.   HAL_Delay(5);                                                   //等待芯片写周期完成- S7 O$ X0 H1 z* t1 o
  22.   HAL_I2C_Mem_Read(&hi2c1,ADDR_24LC08_READ,0,I2C_MEMADD_SIZE_8BIT,readbuff,BufferSize,0x10);8 j" f& q  D# q9 X' z, p
  23.   printf("The data in the chip is as follows:\r\n");1 {6 u+ M2 F- Q8 Q, F& J! F9 d/ b3 @
  24.   for(i=0;i<BufferSize;i++)                                      //读取的数据通过串口打印出来
    % |0 j. N, R( l+ t- I6 E; |; v
  25.   {; I; |$ q6 r  |
  26.     printf("%c",readbuff<i>);
    # `% r% J4 x0 g2 W( U* O7 H( A
  27.   }# N5 K) H( b6 `. e# R& ]
  28.   if(memcmp(writerbuff,readbuff,BufferSize)==0)                  //对比写入数据与读取数据是否一致4 v5 E0 a  _$ A# G' P0 u8 p
  29.     printf("\r\nVerification succeeded.\r\n");
    ) E) Q4 G) o. S  V
  30.   else3 x6 C. b- m; }# C+ ?# d! ]
  31.     printf("\r\nVerification failed.\r\n");
    # B: N. N3 M, x/ j0 r$ E  q
  32. *
    ) t( o' h# S9 \0 P& X
  33. *
    , @% L0 U* Y# C4 z+ |: z, d# U
  34. *' x- q! m) `6 Q
  35. }</i>
复制代码

5 D. z; E8 p& Q- }) D5 \5、编译好固件后,烧录进去芯片。串口输出如下- G- W# Y7 @0 g2 G+ k
" L& F* F  U5 ~! Z& p: }7 y
20200710233907215.png

% Y9 ]$ H8 }. A" S. ?. }2 B7 f
收藏 评论0 发布时间:2021-11-8 16:08

举报

0个回答

所属标签

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