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

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

[复制链接]
STMCU小助手 发布时间:2022-10-28 18:14
实验步骤- f/ {0 d- u- O$ C% {$ w3 H) q
1、CubeMx中芯片选择STM32G071RBTx,新建工程
3 @+ W/ F9 J8 }9 p% A5 I; N
  n0 J2 L3 r: [% w, E/ ?: u2、开启SWD调试、HSE
7 w$ U) n# ?" n0 s9 f  A9 r, _" T
20200710210326903.png
% \8 z7 K) u, T& M, N 20200710210417612.png
9 @) K& c! `& z( n  c  V, {7 C* Q! J2 s6 r1 }# O+ s
3、开启USART1 ,设置波特率115200、8bit、None(无奇偶检验)、停止位1
& N6 b+ Q" y; P6 y: F& W# `* Y, Q8 {$ z( H: E  p
2020071021064272.png
6 D" J; g  I& x4 O5 m  k; [! j# i3 r: T& u) X
4、 设置PB5为推挽输出模式,默认上拉,用于控制eeprom的WP引脚' U' ^7 x0 \* Z0 z! f# v
) i, e; k) I; p0 M) ?
20200710211139405.png 20200710211620223.png
! m+ Y# D# j1 ]. E% A( M4 \% a
5、 选择PB7引脚,设置为I2C1_SDA,PB6设置为I2C_SCL,再激活I2C1,I2C Speed Moed选择:Standard Mode(标准模式),其他保持默认参数
# v* T2 ~. f& z! e8 |- G$ \4 `# E/ ~2 f& @3 P; j% [6 D! C
20200710212115736.png 4 X! O7 }$ ^  z7 M2 x, |7 E

: \5 X- b3 @& D) ]  o9 v" O/ T2 }+ _6、设置时钟树,HCLK=64MHz
/ N; }6 L( i, b" d4 e7 i: R) M
4 |/ K0 K. s8 K9 {2 D- \ 20200710212802195.png
6 h0 l+ ~' j/ O* G& T/ M0 U
4 S8 u. m! m7 a- x2 L; A4 C9 v 7、在工程管理里面,设置好参数,生成代码使用MDK打开。
$ `7 K7 F2 A# V  P- W& ]/ B
$ V! t1 `$ w/ T; f' ?1 s 20200710213244172.png
  d8 t6 M$ d: L, L" m
' ^. n; N- ]" K9 V& b: H! y, u 20200710213308820.png % N( l/ ~7 J* w
4 N% Q  y( k; ?
代码部分
# a; W' w: a0 G1 b. e% q6 ?) A
1、在Debug选项卡中,Flash Download勾上“Reset and Run”/ e1 x$ ?) ?" N+ |" v# h+ g' `
2 a$ M  V3 B- W: D" w' Z
2、添加printf打印代码,在usart.c文件添加如下代码
9 l7 f: `! T$ F+ |. k5 \
$ |9 X" d2 G8 g; n$ k$ {
  1. /* USER CODE BEGIN 0 */
    + Q! O6 _* i. y) K  ]4 ^! J
  2. #include <stdio.h>3 P* ~, Q, ?$ Q7 A( f+ e
  3. /* USER CODE BEGIN 0 */% b. b$ e4 d* @3 L
  4. #ifdef __GNUC__
    0 E0 J5 i* q, a
  5.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
    ; V3 n! w- J! \7 K' ]1 ]
  6.      set to 'Yes') calls __io_putchar() */
    , M# S+ D2 T) ?) e$ u
  7.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)' |( b. i2 \- I' L7 Z
  8. #else4 a9 M0 v- n9 I( _5 J% x
  9.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    * \* ?8 P  {5 h: ^3 l; Q
  10. #endif /* __GNUC__ */: g1 E. U7 ]/ e4 s
  11. /**
    . E9 F9 v, {2 Z, I$ R9 ^
  12.   * @brief  Retargets the C library printf function to the USART.
    % a$ L' O" T. a$ |0 ^, u) Z
  13.   * @param  None" e2 i: H( r0 F, L6 ]
  14.   * @retval None
    & G& @# j. w8 w" @0 Y
  15.   */
    3 Z  r6 e. `! a, q
  16. PUTCHAR_PROTOTYPE7 B5 D5 t5 |( W/ |; X/ |: k9 o
  17. {4 S/ D  }7 P/ J( g
  18.   /* Place your implementation of fputc here */
    4 d+ V4 I) A2 p$ c# A7 V3 U
  19.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
    6 r* c: k" L; j# t0 K( V
  20.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
    5 s1 t2 ~% V! C. E# g  e
  21. ; A$ ~; N. u4 v& @2 e2 ~& V$ P
  22.   return ch;8 U+ ?$ _2 i' U( c6 |
  23. }
    ) o, F; N. ~! E: ^
  24. /* USER CODE END 0 */
    . C7 y3 L% o, C7 O% ]) |
复制代码

% \8 l2 V1 k- z) G( Z3、设置24C08A的地址
* v! I* y+ E! u3 Z( {; e- B/ C
5 M1 s! k2 e: K这里用的是8K的芯片,所以有P1,P0位(),有4个块区域,每个区域有256字节。,这就是8K芯片。A0表示第一块256字节的设备地址,A2表示第二块256字节的设备地址,A4表示第三块256字节的设备地址,A6表示第四块256字节的设备地址
% d* s  B7 Z9 D) ]& d( k5 d( y+ ^& l$ z# E  K4 o$ P' o5 A
20200710214406373.png
" w0 r2 S0 f5 K; a$ [% s
) j; D6 \3 _7 T0 D在i2c.h文件中添加如下代码
* g) h$ \! N, g7 _1 C
. [; b! m/ n+ l
  1. /* USER CODE BEGIN Includes */! L9 S! C% y( N% l* @
  2. ; ~7 ?) f+ _/ q' J3 {6 W
  3. #define ADDR_24LC08_WRITE 0XA0                 //设备地址和写指令8 d+ c' a- |7 H7 G2 X* j
  4. #define ADDR_24LC08_READ  0XA1                 //设备地址和读指令1 {3 K* h9 |+ q* m' s
  5. #define BufferSize 15
    , }: T" ~% w5 M$ [9 K5 t+ O
  6. 7 u2 Q8 {. y5 K7 Y7 h! W
  7. /* USER CODE END Includes */
复制代码
, Q- {' w4 o: G
4、在main.c文件中添加如下代码
! I: M/ B# ?) ~1 A  y( K3 v1 C0 ~7 S
  1. /* USER CODE BEGIN Includes */  u, I% J' |% w9 ^2 H1 _0 Y7 M& x
  2. #include <stdio.h>% f) c0 x6 j- `  l& [9 O+ J
  3. #include <string.h>
    $ Y- _: J8 `$ H! ~
  4. uint16_t i;! a- ^0 L5 K) d( b( ?. K
  5. /* USER CODE END Includes */
    0 o% N1 E+ y! q

  6. 7 e0 a7 B: |/ [1 S: W! z. D
  7. int main(void)+ |7 a* z1 d% K0 B  |4 w: S7 @0 j
  8. {2 a3 X: \1 y+ T. k4 ]
  9. *
    5 U- {5 s9 i. }* C6 G
  10. *  |( H; ?( b, [
  11. *8 |* @9 Q+ x% s
  12. /* USER CODE BEGIN 2 */
    / i2 c+ S) }& H/ ?6 [+ r( k$ p
  13.   uint8_t writerbuff[BufferSize]="This is a test.";
    * U8 a  V' U% m# g; I; W- u# p
  14.   uint8_t readbuff[BufferSize];
    + e3 [8 J4 k  i  P8 y: c
  15.   HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);             //下拉引脚,激活eeprom芯片
    1 }+ W& V! a) r) F

  16. # q$ L7 d% _( w+ X) }
  17. if(HAL_I2C_Mem_Write(&hi2c1,ADDR_24LC08_WRITE,0,I2C_MEMADD_SIZE_8BIT,writerbuff,BufferSize,0x10)==HAL_OK)
    7 u) ^* n9 `9 v  ~( @7 f
  18.   printf("Write succeeded.\r\n");
    % @3 X2 ^/ p) r5 k9 O
  19.   else
    - s( Q9 \1 X# P3 N: i. g- K8 B4 n9 E
  20.   printf("Write failed.\r\n");1 o3 ^% g) P$ s, s$ r
  21.   HAL_Delay(5);                                                   //等待芯片写周期完成
    2 `2 t3 o6 S% W  V- j$ g3 Y6 X
  22.   HAL_I2C_Mem_Read(&hi2c1,ADDR_24LC08_READ,0,I2C_MEMADD_SIZE_8BIT,readbuff,BufferSize,0x10);
    + W0 V5 s5 G4 r% _1 S% L
  23.   printf("The data in the chip is as follows:\r\n");5 s- T( C* X; T2 t/ K3 P
  24.   for(i=0;i<BufferSize;i++)                                      //读取的数据通过串口打印出来
    * H5 _8 a, m  X) |( I' ~
  25.   {) W1 p0 R/ O9 N0 r( o! @0 ~) a
  26.     printf("%c",readbuff<i>);
    2 h# `1 h7 u. T' W0 o
  27.   }
    ; L- Q+ \- A4 k% f$ p
  28.   if(memcmp(writerbuff,readbuff,BufferSize)==0)                  //对比写入数据与读取数据是否一致
    1 `6 T8 `& E- l7 h6 J
  29.     printf("\r\nVerification succeeded.\r\n");! E* Q. {- `/ ~2 \# v7 e
  30.   else
    9 p9 o5 t( }" ~+ b
  31.     printf("\r\nVerification failed.\r\n");
    3 u( E  l/ Y' K' F2 y+ \
  32. *
    7 U+ P( |% S1 e6 `! t8 q
  33. *
    0 ?0 _! M5 z! Z
  34. *
    4 M) I- p5 F+ {! I0 S% A
  35. }</i>
复制代码

8 B. w' T* H% B  m0 g4 U" Q- E# o9 |$ v7 c4 \
5、编译好固件后,烧录进去芯片。串口输出如下& {% d) I- [6 u3 c. a; q
! ?0 X) C' P# Q' m& `
20200710233907215.png & Y2 w) S! j" w3 `

/ C" k" Z" M+ T8 J* [————————————————
! b1 U7 o$ f7 e; M: Z. {6 o( M版权声明:SCCELE; i3 }/ r0 Q1 g
  |! N/ D1 u# X" A' C2 k

3 |6 P5 ^2 w4 Z& F) k: `0 a
赞 收藏 评论0 发布时间:2022-10-28 18:14

举报

0个回答

所属标签

相似技术帖

官网相关资源

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