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

STM32G0学习手册——I2C总线使用(使用硬件I2C-HAL库)

[复制链接]
STMCU小助手 发布时间:2022-10-28 18:14
实验步骤
/ ?" g2 g2 P! Q' z' C1、CubeMx中芯片选择STM32G071RBTx,新建工程
5 q# P& K+ N% o0 W: o: D6 L2 n* F
( g( T' j4 ^; O. M, A- _9 [- b2 e2、开启SWD调试、HSE, k0 g) X- X' f* ?; z9 F/ ?# _
7 n7 B- R# u+ p% e( t. B
20200710210326903.png # _9 V: e" ~' X: t( d8 D
20200710210417612.png
9 r9 V. Z/ }/ B( z" Q! @8 j6 T
' i6 u6 w% g# y% ?- J7 U/ c3、开启USART1 ,设置波特率115200、8bit、None(无奇偶检验)、停止位1
: j+ c$ N( n: ^0 X
9 N: U8 u8 }  E& H8 {: T 2020071021064272.png
1 n- j* P8 t& [0 Q' `! V6 R
  K; L# I) ]! f4、 设置PB5为推挽输出模式,默认上拉,用于控制eeprom的WP引脚
* d8 o% r  o5 @2 U6 e. a
4 y7 l, i' C. x; w# @* R 20200710211139405.png 20200710211620223.png & C% p5 n$ w& Y$ ?- x! P5 U

3 a; P  x- ?3 \2 I. B3 g5、 选择PB7引脚,设置为I2C1_SDA,PB6设置为I2C_SCL,再激活I2C1,I2C Speed Moed选择:Standard Mode(标准模式),其他保持默认参数
' \& H8 ?% K/ q% @" L9 J/ ]" x0 Y, P' b" C% |6 \# E* a# R
20200710212115736.png
# @! u) A  V+ K( e) v  F& M$ @8 m% w3 K* m' X; _6 Z2 X" y( I4 h
6、设置时钟树,HCLK=64MHz$ W( b. x, L3 Y9 A) ~

( V# c' v- G0 R$ _) q% K: T 20200710212802195.png 2 x& B6 j: ^7 U8 ^- m: s
& L- W" s. d5 a; J! n9 O6 \
7、在工程管理里面,设置好参数,生成代码使用MDK打开。' h+ W( q1 m0 W0 F7 v% \/ D
- O, x* Z7 x; ~& u1 t
20200710213244172.png 5 |9 G& S9 b* |4 M7 ~
% ]3 j' n7 @2 f* U( v+ X
20200710213308820.png - O1 |! G5 m, l0 P( |: b1 e3 X
4 W" B8 U5 r2 k' B9 n. g/ M) C3 r
代码部分
7 |+ X5 Y# [" \$ N( l: ^5 P! p: l( u1 i
1、在Debug选项卡中,Flash Download勾上“Reset and Run”
2 r. D. `$ }. V) k0 L& T, A" ?" v2 l3 u. i
2、添加printf打印代码,在usart.c文件添加如下代码
" p: u' u! b1 ~8 H' N, D8 g+ o8 ]! A. h( B; S* T
  1. /* USER CODE BEGIN 0 */8 ?. ~0 ^! s. A1 ?
  2. #include <stdio.h>
    7 {% T' \1 z' A  D, K. A
  3. /* USER CODE BEGIN 0 */
      ?  i7 F* r5 z7 l5 @
  4. #ifdef __GNUC__& ]# Y% t& o) A1 M3 ]  s
  5.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
    % r  `$ K; _1 j, U
  6.      set to 'Yes') calls __io_putchar() */! a. E: m# l! ]: p( N
  7.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)7 d4 l0 g. @$ d1 e% Z! J1 R; K7 p. S
  8. #else
    6 p1 e9 l8 S$ k( P8 E" q$ \
  9.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)3 Q9 k2 h7 I$ X& A1 E; `7 H9 B
  10. #endif /* __GNUC__ */
    * d/ Z6 m7 L5 f; o  `+ u' f8 I$ t! N
  11. /**5 }% A  f$ z6 D. c- f
  12.   * @brief  Retargets the C library printf function to the USART.8 p7 v  a: r3 R6 F& Q5 H  Y
  13.   * @param  None# m- k/ K- Y/ F  M/ o. @: Q! w7 X
  14.   * @retval None
    * I) _* z/ x- j# S2 M! [
  15.   */) k& ~+ d2 i. [' e  I' |0 Y
  16. PUTCHAR_PROTOTYPE
    2 y6 b( R; D9 Z
  17. {
    1 \" d0 k; T4 H4 @; o9 ?: p$ K5 e
  18.   /* Place your implementation of fputc here */
    8 ~/ W. V- r! U9 A7 h9 a, W1 @
  19.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */$ N  A  O$ b6 Z+ D" j- [) W% |
  20.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
    1 p6 s  p: @6 z1 G8 _( A
  21. + ?  L, r. U0 {& f" K1 W+ Y
  22.   return ch;1 S9 H6 ]+ M: [4 u/ P2 l
  23. }* {0 I8 [0 ^' n% u  [2 ~! y* d
  24. /* USER CODE END 0 */
    ) b0 x1 e0 c; F) Y: ]" @0 Z5 a
复制代码

! d9 k( D' x; `0 G- J3、设置24C08A的地址7 V2 u0 `& k' n

; o, k8 N+ a) R) W) T这里用的是8K的芯片,所以有P1,P0位(),有4个块区域,每个区域有256字节。,这就是8K芯片。A0表示第一块256字节的设备地址,A2表示第二块256字节的设备地址,A4表示第三块256字节的设备地址,A6表示第四块256字节的设备地址
6 x' r( X* E. @  C0 O
# s: A/ k- H1 k5 P# I 20200710214406373.png
2 F% \) T) C4 w& B9 D8 q& A2 c1 E% O+ `, ~) |+ l1 {( |% }
在i2c.h文件中添加如下代码
, l' t2 [) v8 S# \- X& b) y5 `# G2 j4 }. i- Q6 f
  1. /* USER CODE BEGIN Includes */
    0 T. {7 f6 r/ i
  2. ) V$ v7 Y/ a5 |. [2 `  X
  3. #define ADDR_24LC08_WRITE 0XA0                 //设备地址和写指令
    ( P. [% ~0 l( g: p; r/ ^
  4. #define ADDR_24LC08_READ  0XA1                 //设备地址和读指令
    2 h0 J% F" Z( v4 }! u% M; {! ]6 b( B
  5. #define BufferSize 15
    + @) C6 N8 l( e$ `) z2 M

  6. # p& |4 v8 ~: s5 V& y3 \* d2 T
  7. /* USER CODE END Includes */
复制代码
: w9 x6 O- Q$ C' k+ [
4、在main.c文件中添加如下代码
2 f+ G0 ^* t2 v" z$ Z% i% ]2 H/ o& _+ E! E0 s* Z
  1. /* USER CODE BEGIN Includes */3 Q. S, Q0 y7 y& F" t
  2. #include <stdio.h>6 A( S8 L! H$ u4 H
  3. #include <string.h>
    8 E5 u$ M% x" ?7 M5 j
  4. uint16_t i;! Y$ z0 [6 J* }1 W
  5. /* USER CODE END Includes */
    0 O8 M0 D( m& J3 G$ H3 a

  6. ' ]9 X6 q! U/ S2 U+ {: e
  7. int main(void)( I9 b  ?% l. a8 O0 |9 X% t
  8. {
    8 \" A# d- k/ [2 [. B+ |
  9. *
    7 z7 _- E' U8 {
  10. *
    ! V  {" Z" I# V% E; ?
  11. *
    % D* g5 \3 f1 z) G9 {1 f7 |" t: X* ?
  12. /* USER CODE BEGIN 2 */
      K8 V8 B" a# n# X) y( s
  13.   uint8_t writerbuff[BufferSize]="This is a test.";! h! {- M: u( A, y5 N5 F
  14.   uint8_t readbuff[BufferSize];
    : @. p6 Y( g: g2 b0 Y$ `8 H
  15.   HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);             //下拉引脚,激活eeprom芯片
    ) l2 a( C7 S& P3 x

  16. ( v1 p: O( \/ |+ ^
  17. if(HAL_I2C_Mem_Write(&hi2c1,ADDR_24LC08_WRITE,0,I2C_MEMADD_SIZE_8BIT,writerbuff,BufferSize,0x10)==HAL_OK)
    0 B) I# t) O" M: O  M5 \- E, B6 k
  18.   printf("Write succeeded.\r\n");: z# o1 }4 e# ?1 D8 u+ k
  19.   else4 N( D  N8 V  G& {, U" }+ K
  20.   printf("Write failed.\r\n");3 |5 O! W- I9 E7 Q/ W% x
  21.   HAL_Delay(5);                                                   //等待芯片写周期完成% ^. B* `9 p0 q# t8 n6 s* g9 m
  22.   HAL_I2C_Mem_Read(&hi2c1,ADDR_24LC08_READ,0,I2C_MEMADD_SIZE_8BIT,readbuff,BufferSize,0x10);
    ; H- T* `- |. U, |" w4 [( Z' R
  23.   printf("The data in the chip is as follows:\r\n");
    ! _( U) `+ Q: Y4 t, R2 \
  24.   for(i=0;i<BufferSize;i++)                                      //读取的数据通过串口打印出来; M" s2 k" ]) h  C, q
  25.   {! O. G0 d# A( O9 y# B" M
  26.     printf("%c",readbuff<i>);/ O9 V3 p- R- c) }" ^4 V9 Z
  27.   }
    ' _% k, m% l4 ~/ R( j" i
  28.   if(memcmp(writerbuff,readbuff,BufferSize)==0)                  //对比写入数据与读取数据是否一致
    " z  H" T+ O& d% X  Z
  29.     printf("\r\nVerification succeeded.\r\n");. y3 C; ]6 I: Z" G7 ?  ]. n
  30.   else
    $ d& |; u! a! W: {! }
  31.     printf("\r\nVerification failed.\r\n");; C$ D& t1 g; x8 O  ~
  32. *0 x. `% u& C4 X! a
  33. *
    " d  \+ H6 K' Z3 h+ _
  34. *: l; O: e4 v0 Y; y
  35. }</i>
复制代码
  b3 Z( g# F5 o8 G: Q/ a, I+ B; w
% y9 I" S8 {4 `" |1 Y
5、编译好固件后,烧录进去芯片。串口输出如下1 U( {6 c5 B; A9 f6 o/ ^( }5 w

1 |) p' C8 O# U: |6 z! x7 | 20200710233907215.png $ W+ ?  r3 A1 x! Z8 {, C
: _+ B9 ^; T' k9 P& l
————————————————/ O1 j  b: I! K
版权声明:SCCELE$ j9 O6 l9 ^& |% a
6 b7 ?9 d) ~5 }( C8 Y
2 E4 j; L, A( u  o% `$ _
赞 收藏 评论0 发布时间:2022-10-28 18:14

举报

0个回答

所属标签

相似技术帖

官网相关资源

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