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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 16:08
I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。
0 F( [6 n0 k0 j) D) {4 B" I
7 S: g- w; L0 V) _  `: C* m这里使用的是G071RB开发板,已经自带有24C08A芯片,是一个8K的EEPROM芯片,使用I2C总线来控制这个芯片,写入数据。9 e$ D8 i+ X$ a: z8 ^7 Q

+ e0 |% J3 N' T: I) c! D5 N实验步骤# A3 [# }& L$ Y' g* k6 W) T
1、CubeMx中芯片选择STM32G071RBTx,新建工程! H3 x/ j/ }0 U# N3 d* V$ Y

0 D# ~# I& ?1 L7 K, L2、开启SWD调试、HSE2 ~. `. g7 V5 o+ U, T

+ ]& N( c, `; z1 u
20200710210326903.png

' @% R  `" P- x1 c% U
. W. o$ c; E8 T) {, _1 {
20200710210417612.png
) b. Y) n4 @4 y8 n
( \9 G, D: U9 d; F2 [! X% j; `9 o0 C
3、开启USART1 ,设置波特率115200、8bit、None(无奇偶检验)、停止位1
5 B- _8 Y/ B7 {! d* L# z7 A0 s. e& t5 j/ g; t" X
2020071021064272.png

8 r. h5 T3 Z! C5 g% V
) j% Z! b1 A% ?+ Y: \4、 设置PB5为推挽输出模式,默认上拉,用于控制eeprom的WP引脚
. e9 W  H" r0 G5 T4 j' n( C8 X: K% H3 K1 x
20200710211139405.png 20200710211620223.png
' T* E& I6 F; e) \

! m- r2 y, b/ x! z' z+ ^0 j- j5、 选择PB7引脚,设置为I2C1_SDA,PB6设置为I2C_SCL,再激活I2C1,I2C Speed Moed选择:Standard Mode(标准模式),其他保持默认参数
; k2 k: R) j0 u( Y
1 b5 j6 S6 z( Q) q
20200710212115736.png

9 ?6 n" W; g* R% D  H& v/ q4 I
0 c+ J) V# Q- C' t  h6、设置时钟树,HCLK=64MHz( d' Q- {6 T: R( b

2 I+ i3 A4 i# O! C2 j2 \/ k9 d4 h
20200710212802195.png

' z/ O- e$ q8 Y" V1 V) j9 D4 y5 O+ J3 N, u- Q
7、在工程管理里面,设置好参数,生成代码使用MDK打开。# s6 @8 U9 ^: g0 I" o& l" m

, M' P2 L- }- M$ h$ e
20200710213244172.png

8 _: j& V8 r8 k: b
/ [# v7 K9 D$ c
20200710213308820.png
# D5 \7 {, R  u+ c' G

8 \" _! u2 m' r1 z3 m, F; A代码部分
3 ~+ f9 P/ G% K- b  N1、在Debug选项卡中,Flash Download勾上“Reset and Run”
) h- [7 z: R- s7 l4 J
  A( ^; z5 v; H2、添加printf打印代码,在usart.c文件添加如下代码( x8 R. E& w, s% `2 @

( P5 A% w; I3 H. [+ N
  1. /* USER CODE BEGIN 0 */5 S) l; F2 Z3 O) ~
  2. #include <stdio.h># `. n' K4 G. `$ I1 x6 R5 m
  3. /* USER CODE BEGIN 0 */
    * B6 X0 T& f1 e3 Z& }
  4. #ifdef __GNUC__
    . p, z% h* B: b2 I. E
  5.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
    2 F. G" ~" B1 r: k7 @! u8 d* N
  6.      set to 'Yes') calls __io_putchar() */" n: @. C; m4 l; U
  7.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)) G/ |' N+ N4 l' q
  8. #else
    2 R( |$ o9 t3 c1 C
  9.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)" m" a7 P, L% g& h5 L5 f/ n4 R
  10. #endif /* __GNUC__ */
    ! x) ^$ O# n/ S
  11. /**
    : y  c; i& K; f' t6 |
  12.   * @brief  Retargets the C library printf function to the USART.& d; D+ ^8 t9 \
  13.   * @param  None5 _' C7 j  s7 C1 ~' e/ V' T5 S$ `
  14.   * @retval None0 ^& |/ |: G) d3 w3 ?; j
  15.   */* M4 ]: u- A+ u( E6 ^+ T5 d1 S, c
  16. PUTCHAR_PROTOTYPE
    9 j& i1 w* g) M% T$ {5 A) A1 I$ l
  17. {
    7 ^8 N5 ?" ^4 j! P( ?+ o3 K
  18.   /* Place your implementation of fputc here */" N, W. n1 o- _0 H3 F8 J
  19.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
    , A9 F8 t2 V& G1 ?. |" R/ d
  20.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
    ; N- F4 |. G8 F$ I* |: L

  21. 6 a& |  p9 s6 m* O4 y1 A9 g) U8 ^
  22.   return ch;
    8 [# c$ v9 }. U$ D+ k& _" [3 j
  23. }
    ! D5 ?! U4 a4 h' g4 k8 U
  24. /* USER CODE END 0 */
复制代码
9 R5 ~/ }: d2 X7 c+ h: I8 H
3、设置24C08A的地址4 X3 c5 D. ~* k( T" H+ `- k

/ A) H! p9 V2 d9 q* {; i这里用的是8K的芯片,所以有P1,P0位(),有4个块区域,每个区域有256字节。,这就是8K芯片。A0表示第一块256字节的设备地址,A2表示第二块256字节的设备地址,A4表示第三块256字节的设备地址,A6表示第四块256字节的设备地址5 x+ y0 m0 V: f; b) e8 L8 V" H7 k

) a2 [) e8 y. v1 P. T, F
20200710214406373.png

. o5 V7 ^" ~* b" L) c0 F2 R
4 M+ L) ?* ]. ?; n在i2c.h文件中添加如下代码
  1. /* USER CODE BEGIN Includes */1 |" Y+ K: f( f5 f; Q9 w) O

  2. % V# d6 q/ r7 m' ]% ]
  3. #define ADDR_24LC08_WRITE 0XA0                 //设备地址和写指令
    8 |# y* n# J! i; j2 x& i! N
  4. #define ADDR_24LC08_READ  0XA1                 //设备地址和读指令
    : i! N" K/ t# I
  5. #define BufferSize 15  W$ X3 p6 J. h
  6. 6 t; a% n* x' z: }* O$ E2 e
  7. /* USER CODE END Includes */
复制代码

+ h& }& n# E9 r, c* `* P% |4、在main.c文件中添加如下代码
3 F- ~. Q  o& j6 m2 R/ X  M; w: G9 l, E8 i' D; O1 {0 s$ W7 x
  1. /* USER CODE BEGIN Includes */- @% S+ R% L. n8 j, q
  2. #include <stdio.h>
    6 Z  H8 N% g7 ?' {
  3. #include <string.h>0 w& G, Q* D. G
  4. uint16_t i;  G) |9 |5 A; j& U/ M, g* S- L$ e
  5. /* USER CODE END Includes */
    $ N, K6 _1 d1 q5 D- R4 o! b4 [
  6. ; p2 z1 ~; L7 R5 `
  7. int main(void)/ \, u/ W1 Q8 L" l
  8. {
    - t7 L! _, e' ~) Z4 U
  9. */ P2 j1 K% a8 q" _/ \  t
  10. *4 P+ Q1 Q9 @  O
  11. *& h8 K# g( @, x( H/ W
  12. /* USER CODE BEGIN 2 */$ }) K. o; z! w" S5 O: F- B
  13.   uint8_t writerbuff[BufferSize]="This is a test.";/ ~  b, l/ r( v# L: }
  14.   uint8_t readbuff[BufferSize];
    : x9 X8 X* X8 K) X# p. _6 H
  15.   HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);             //下拉引脚,激活eeprom芯片
    : n; B5 K; D$ ?: h* L

  16. % q) U/ ?. X' O2 B' |$ X
  17. if(HAL_I2C_Mem_Write(&hi2c1,ADDR_24LC08_WRITE,0,I2C_MEMADD_SIZE_8BIT,writerbuff,BufferSize,0x10)==HAL_OK)% O- ]8 J9 R) \4 ?" s6 h
  18.   printf("Write succeeded.\r\n");
    7 |  q% b+ F5 T( Y  j
  19.   else* R6 }+ L# Z9 K$ m
  20.   printf("Write failed.\r\n");
    + k5 U- u) ~* L. h6 i0 N$ t
  21.   HAL_Delay(5);                                                   //等待芯片写周期完成6 f# ~9 j4 }9 {. G
  22.   HAL_I2C_Mem_Read(&hi2c1,ADDR_24LC08_READ,0,I2C_MEMADD_SIZE_8BIT,readbuff,BufferSize,0x10);
    3 e. u9 @4 h' G! s7 L: J
  23.   printf("The data in the chip is as follows:\r\n");/ |, q0 x" c1 t
  24.   for(i=0;i<BufferSize;i++)                                      //读取的数据通过串口打印出来- C$ X5 r. O, O9 X! H+ x, T
  25.   {/ [; U% S0 o2 o3 y& H
  26.     printf("%c",readbuff<i>);5 z6 s; F. W3 N# C$ u6 B
  27.   }
    & [3 k; y$ i+ R+ X" u) ?
  28.   if(memcmp(writerbuff,readbuff,BufferSize)==0)                  //对比写入数据与读取数据是否一致: ~4 s' T0 u0 [
  29.     printf("\r\nVerification succeeded.\r\n");2 J4 d0 Z& @2 q  x+ W4 G
  30.   else" O2 |( x" W1 C2 P' S+ T
  31.     printf("\r\nVerification failed.\r\n");
    3 ^6 a; S6 K, b
  32. *# C0 I. a4 S) r! O( I" S
  33. *
    3 N2 f2 P1 @: @3 D
  34. *" `6 x" ~5 Y+ s7 S7 Z* l0 R, H
  35. }</i>
复制代码
0 R+ {4 Q- K" t3 c- A2 k4 o$ H' C9 ^
5、编译好固件后,烧录进去芯片。串口输出如下5 B" m# j; W5 T

7 N) s" u7 U1 Z6 _8 ~; O
20200710233907215.png

5 b# A! d" a" d
收藏 评论0 发布时间:2021-11-8 16:08

举报

0个回答

所属标签

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