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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 16:08
I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。. P/ }3 u- y+ d7 T

; T! ?3 m/ D# a5 `. |3 _: w这里使用的是G071RB开发板,已经自带有24C08A芯片,是一个8K的EEPROM芯片,使用I2C总线来控制这个芯片,写入数据。5 H$ O+ z/ U1 H; A% i
6 r2 |1 ]  j* c+ m2 E0 R
实验步骤
% p+ H$ p0 H( W+ ~- P! e2 |1、CubeMx中芯片选择STM32G071RBTx,新建工程
4 K* \9 m- F$ G; g5 i& Q" J0 }1 i) r6 L5 C) U
2、开启SWD调试、HSE# v, ~  O- l* D2 P: Z% Y
. O% ?. K% w# J+ K: [
20200710210326903.png

! o! k+ B6 t; m8 ]( x) ^3 g' v9 W  p# z4 m
20200710210417612.png

! {; N+ i& ^1 {0 k) o* V. T; [/ o  L" M8 K$ z8 A! ]
3、开启USART1 ,设置波特率115200、8bit、None(无奇偶检验)、停止位1
5 X0 ?* J, D9 q- ~
% O3 D7 B. M* L. |8 V- A+ x* `
2020071021064272.png
! l& m# D8 Q% i  d5 [
9 t: q9 e% M! z
4、 设置PB5为推挽输出模式,默认上拉,用于控制eeprom的WP引脚: L0 E( S! k9 |1 |5 l1 k! Y

" F  K( T& P  f
20200710211139405.png 20200710211620223.png

: J3 N3 |* P# c2 y. Q4 b6 g! |" M5 u( _# I9 t
5、 选择PB7引脚,设置为I2C1_SDA,PB6设置为I2C_SCL,再激活I2C1,I2C Speed Moed选择:Standard Mode(标准模式),其他保持默认参数
% O5 p( z5 [( z- ^; R, C9 Y9 H0 Q7 C! h" G% `
20200710212115736.png

. ?( A! c- D! Y
2 k" J9 |5 A( V4 D+ ?! ~$ y6、设置时钟树,HCLK=64MHz
' r- T2 C* I5 M$ b+ \- z/ `# ~4 @, K- A3 ^  p
20200710212802195.png
/ ^5 ^: _4 n4 y7 }- D- M
: j. ?! z% a. G2 m0 \2 ^$ l; O
7、在工程管理里面,设置好参数,生成代码使用MDK打开。2 Y6 K, M9 J% ]; B) p9 B( \
/ @, z( }; `) y- D  Y  p. m- I
20200710213244172.png

! @  K" O$ `# N9 ^. D
2 j5 O& c5 e; P
20200710213308820.png

; Y. w, K; v3 l) n' [4 A
) p$ f' i+ v; j代码部分0 I2 a0 p, S. r% m5 ]
1、在Debug选项卡中,Flash Download勾上“Reset and Run”
* S% A7 I) R& p9 Y5 T- a1 n, {! X
$ W: {! m8 P( g2 R& I. B9 D; _2 k. s) l2、添加printf打印代码,在usart.c文件添加如下代码2 b* {' {" ?& B1 l
; @; O6 ]' z) J9 N
  1. /* USER CODE BEGIN 0 */
    ) J# A, T+ [4 z: T5 b
  2. #include <stdio.h>0 S1 s8 \& R0 }, E; }4 `9 ]7 h, A
  3. /* USER CODE BEGIN 0 */' i: Y. y7 Z+ \, i: W; U+ y9 P
  4. #ifdef __GNUC__
    0 D$ x  Y. ?( r
  5.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
    6 e. A. K5 G. x; M
  6.      set to 'Yes') calls __io_putchar() */: D$ [7 H- _5 @7 {7 k# h
  7.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
      Q7 X( p# l- T. _" G. V( D% T
  8. #else: |7 u  {7 c4 r0 ^8 J9 \- ^9 I
  9.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)+ y8 @7 G" y& Y" u2 E& c4 L! b
  10. #endif /* __GNUC__ */+ y% D1 d5 k1 L3 E0 e  M8 I
  11. /**4 w* B1 D0 ]9 V  e5 V( l4 A7 C" r
  12.   * @brief  Retargets the C library printf function to the USART.
    7 Q% }. L9 \- N( o) z
  13.   * @param  None2 }5 g' D0 y$ v2 ?* |/ F" j- d
  14.   * @retval None
    + S5 K) I, N# l3 i8 K' K- b, A" \# l
  15.   */6 H' |) F5 g( p% `' l, [9 M5 {% t
  16. PUTCHAR_PROTOTYPE. K3 T3 [- m7 I& m' ^  w* ^
  17. {* p6 ]% G* n! o7 `5 [
  18.   /* Place your implementation of fputc here */
    " v- s+ |7 }9 c; W* E
  19.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */- v: Y3 N+ E- ?2 @
  20.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);% W7 m5 N% E2 @4 N* s' [+ p7 y8 A

  21. 4 v$ G0 k7 L8 @" o* j/ [; N
  22.   return ch;; T, e7 X) [6 c8 L
  23. }" e+ L2 }7 F5 A' E
  24. /* USER CODE END 0 */
复制代码

8 d1 E$ b5 i; x+ J9 K* K- V3、设置24C08A的地址! p; {# j' t- _* I# e7 d, w

$ D1 o6 B5 N* p- C  _这里用的是8K的芯片,所以有P1,P0位(),有4个块区域,每个区域有256字节。,这就是8K芯片。A0表示第一块256字节的设备地址,A2表示第二块256字节的设备地址,A4表示第三块256字节的设备地址,A6表示第四块256字节的设备地址
8 q0 o4 t2 o& ]7 ]
. t, }3 C# Q) n2 B
20200710214406373.png

3 |6 B/ u1 z3 @2 E7 l8 m3 e( \. X. a/ O" P  p5 u7 O; f
在i2c.h文件中添加如下代码
  1. /* USER CODE BEGIN Includes */
    / _2 i- o: g! v5 v* y+ b. M

  2. & Z2 f0 K; Y7 U# S6 |( n
  3. #define ADDR_24LC08_WRITE 0XA0                 //设备地址和写指令
    : D" o' L0 h# Z8 B9 D) I
  4. #define ADDR_24LC08_READ  0XA1                 //设备地址和读指令, f# b5 _- q9 i+ }
  5. #define BufferSize 15: v+ b# y" t0 J: S5 D
  6. ) }' |1 S  ^- r& S7 T0 [! l) _
  7. /* USER CODE END Includes */
复制代码
: R: |5 z9 [$ D$ b5 X
4、在main.c文件中添加如下代码; a; p( c4 |; O: q! F3 L. D& @
& Q4 T+ x, s" V" y
  1. /* USER CODE BEGIN Includes */8 U0 p3 K, @1 B' e& ^$ P
  2. #include <stdio.h>
      }# w$ V% [8 ~8 P8 b- w
  3. #include <string.h>) M  q) X0 U: R; W# d1 ?5 Y- g
  4. uint16_t i;* q0 }0 n5 e% H- d: h
  5. /* USER CODE END Includes */
    ' o( M  B, D5 F/ j& a
  6. 2 ?0 W( K0 f% ?% g1 @
  7. int main(void), l. ~! v3 x0 d7 Z
  8. {
    : D( _" N( a; D4 K
  9. *+ N9 Q# |4 k+ }# ^7 y& Z% |
  10. *" C4 L1 N- O8 X( D/ E6 ?' p9 E
  11. *
    / E: o: p8 ~- y/ J
  12. /* USER CODE BEGIN 2 */
    / u8 V0 L9 a% Q5 n7 L& d' f
  13.   uint8_t writerbuff[BufferSize]="This is a test.";
    - ]; M2 c7 W4 r
  14.   uint8_t readbuff[BufferSize];) \/ H7 F+ z4 f9 {/ Q# B5 Q
  15.   HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);             //下拉引脚,激活eeprom芯片& o: Q4 Q# n+ Y. [4 |" A

  16. 1 v% Y* @* c1 r7 {4 Y! S
  17. if(HAL_I2C_Mem_Write(&hi2c1,ADDR_24LC08_WRITE,0,I2C_MEMADD_SIZE_8BIT,writerbuff,BufferSize,0x10)==HAL_OK)2 J+ k: }$ i* R5 A- n
  18.   printf("Write succeeded.\r\n");2 w7 S! c* q1 W5 A: h
  19.   else3 H7 L  L2 V, j% j
  20.   printf("Write failed.\r\n");
    5 V4 [- z7 V4 B! V: h
  21.   HAL_Delay(5);                                                   //等待芯片写周期完成
    0 Y; _  H/ }  f6 d; y) f- D7 K
  22.   HAL_I2C_Mem_Read(&hi2c1,ADDR_24LC08_READ,0,I2C_MEMADD_SIZE_8BIT,readbuff,BufferSize,0x10);' k; E. \3 w! o  W" I' v
  23.   printf("The data in the chip is as follows:\r\n");
    , \  W! v7 p; u: e
  24.   for(i=0;i<BufferSize;i++)                                      //读取的数据通过串口打印出来# R) u& t; s0 M6 i9 K7 M
  25.   {
    2 U% m) V  U. P7 g" q0 }2 w9 R
  26.     printf("%c",readbuff<i>);7 }# \) \" {; C) d
  27.   }4 n) A- ?& D( e( C; G! r+ T4 `
  28.   if(memcmp(writerbuff,readbuff,BufferSize)==0)                  //对比写入数据与读取数据是否一致
    , W: T  i1 _4 P0 d6 ]
  29.     printf("\r\nVerification succeeded.\r\n");; K  H+ k( j: v: e+ `$ r6 E
  30.   else
    4 l* n8 g0 |% t2 P1 G% t
  31.     printf("\r\nVerification failed.\r\n");
    - E' s% v3 Y8 Z$ Y0 t' r8 x- j
  32. *
    ( r  ]. `# m8 T' c$ J# Z
  33. *
    ; J$ j6 O' `/ n7 Y! A- ?2 ^& r3 R) U
  34. *
    * N' G  @" E  q+ ]8 N( V
  35. }</i>
复制代码

. b3 a9 t2 c. C1 Q7 p$ O9 ]. Y5、编译好固件后,烧录进去芯片。串口输出如下) ~, b/ {, Z: ~9 T

" o9 Q+ x" K4 C) S  G' p( i
20200710233907215.png

! H" T2 z/ t7 K9 n
收藏 评论0 发布时间:2021-11-8 16:08

举报

0个回答

所属标签

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