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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 16:08
I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。
5 Y: Q: n* l3 B7 i/ h, N  U0 t, B7 H! E2 ~4 i7 ^4 i! t1 P
这里使用的是G071RB开发板,已经自带有24C08A芯片,是一个8K的EEPROM芯片,使用I2C总线来控制这个芯片,写入数据。
2 E4 u$ i( G! w* B
8 Q/ n( Y0 ?; K* G实验步骤+ }/ F- i5 S# \2 C; l" [' [
1、CubeMx中芯片选择STM32G071RBTx,新建工程' q$ J- q" X( O7 j/ x- k; Y  F

- `8 F  Q* b) @8 a$ Q# z/ X/ S; I2、开启SWD调试、HSE& h, x3 `6 y" {1 i- Y' E+ [

, H. m* f) `& y5 k7 R% C( y
20200710210326903.png

0 M4 Q: \0 h8 x9 i/ Z, F5 U! l8 ~. b% @  x: x% a2 y9 m
20200710210417612.png
! G$ }  d1 Q8 `  r% w* m6 h
5 U1 {. L5 B% h  x" k
3、开启USART1 ,设置波特率115200、8bit、None(无奇偶检验)、停止位1
: |+ x. z6 |" D# X& K
2 g6 ~. b/ a) c, O0 }) g8 r) _
2020071021064272.png

1 y: W1 a- e& i  h: X. `6 g; }3 X% [: ?& m' I$ A
4、 设置PB5为推挽输出模式,默认上拉,用于控制eeprom的WP引脚
4 x8 [- ^* P. P1 j/ F2 r5 A; r- c7 n+ [' L
20200710211139405.png 20200710211620223.png

) [/ K$ Z/ d) D0 Z, x; A& H( Y( S! Z( P) z+ A% |4 _% B5 h
5、 选择PB7引脚,设置为I2C1_SDA,PB6设置为I2C_SCL,再激活I2C1,I2C Speed Moed选择:Standard Mode(标准模式),其他保持默认参数
9 z8 V: c+ V: B! ^9 R  e; y6 F5 E9 H/ f' h1 U) Q
20200710212115736.png
: {1 P2 Y) p% [- `6 u& n1 G
' C* j" H  P! X3 t6 h- X7 f  u* b
6、设置时钟树,HCLK=64MHz
! \2 A' J$ [! ]
4 O) L) V* y2 ?0 D9 ]0 I0 @
20200710212802195.png
; M2 J6 k1 x1 y, B* W

( ], P7 h6 S* i9 P2 r% e 7、在工程管理里面,设置好参数,生成代码使用MDK打开。
+ |* @$ m; H+ [. ^* l+ j" f6 X% u
( a" n) O2 K! g0 A. z. H( }. u. j
20200710213244172.png
0 R- c+ e% g- [; @

* I# U" t6 |7 b! b% f7 N8 E, N! R
20200710213308820.png

! V5 u1 W# _9 n. Z# t* o2 L" u; x0 m. U/ i& M" ]+ c& ~! i' [2 t' J5 M5 o
代码部分% c6 Y& Q. X# z% |/ A) x) P2 U, X. a
1、在Debug选项卡中,Flash Download勾上“Reset and Run”
4 ~* G8 a$ I$ A3 c( N& X0 N7 ^- s$ R( w, s& j
2、添加printf打印代码,在usart.c文件添加如下代码# d7 }" u" `7 b

1 n2 N& H. |8 `6 R+ ]5 T! S& t
  1. /* USER CODE BEGIN 0 */& S5 M7 j! C3 t, Z+ W% N$ P: q
  2. #include <stdio.h>: W, ?. T8 y6 C* o2 o
  3. /* USER CODE BEGIN 0 */7 a+ b( S( E$ Y# R1 N9 {+ f# L5 c
  4. #ifdef __GNUC__
    6 [* E/ C3 h+ K5 t
  5.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf# k/ z. U, X4 R0 D# p2 W
  6.      set to 'Yes') calls __io_putchar() */
    . p# v! P% b# w/ y
  7.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    & n) L6 ~1 X" X1 ^& N8 _9 x
  8. #else
    & G( R6 ~* T# N
  9.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)9 F/ |4 Y0 e8 ^% K* [  `
  10. #endif /* __GNUC__ */
    $ o5 j, L4 |, M$ z% h' s/ j, ?! `
  11. /**
    $ K3 H% U# O' Z; W/ Y, S# _$ N* m; Y
  12.   * @brief  Retargets the C library printf function to the USART." d0 l! C+ D: b# N) w; M+ ]! f+ I
  13.   * @param  None1 H& i  u- g8 q* k9 X: b. B
  14.   * @retval None
    ! C1 [9 h# v- G  C; ~) ?
  15.   */
    + S  M9 Z0 D1 [. u. w
  16. PUTCHAR_PROTOTYPE3 b6 P6 g5 N2 k, O4 |
  17. {
      _  B5 ~9 n" W7 K7 w) ~) e
  18.   /* Place your implementation of fputc here */
    ! N( ?9 {& P4 ]
  19.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
    & l1 w+ p4 Y" W2 N) F6 n
  20.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
    , F6 e+ G6 n& A$ {. n" ^/ c" h

  21. ; u4 ~$ Z0 A8 d& V- }% R9 e
  22.   return ch;0 L* \- Y4 j# ^1 [& p
  23. }
    ) I8 ]1 F' `3 W; C1 [1 h
  24. /* USER CODE END 0 */
复制代码

6 w- S3 P, L) j, j! M4 M3、设置24C08A的地址( \9 R8 q; O1 V0 J: n$ N4 J
. O) d2 X8 b9 j, a7 H  o
这里用的是8K的芯片,所以有P1,P0位(),有4个块区域,每个区域有256字节。,这就是8K芯片。A0表示第一块256字节的设备地址,A2表示第二块256字节的设备地址,A4表示第三块256字节的设备地址,A6表示第四块256字节的设备地址
0 x6 p& B; i: \. J+ [1 O
* w% y) D1 k8 ^, C, b6 m/ f
20200710214406373.png
0 [3 O& e, C. v4 P1 J2 f3 u
9 k, P; g$ I$ W8 Y6 d0 w
在i2c.h文件中添加如下代码
  1. /* USER CODE BEGIN Includes */0 ]# }( v0 B1 s( J* D: Z
  2. & o6 K2 S$ Z5 O' a5 w5 \. Q  G$ q
  3. #define ADDR_24LC08_WRITE 0XA0                 //设备地址和写指令$ }4 e! L" q6 \
  4. #define ADDR_24LC08_READ  0XA1                 //设备地址和读指令
    # a+ G7 C5 g9 }  Z
  5. #define BufferSize 15
    + I8 n% W0 c  V! E) g4 F: N9 A( R

  6. ) M8 p4 }, R& \5 ~2 s
  7. /* USER CODE END Includes */
复制代码

( b' b! Y' @0 T3 h- \: k! B4 Q0 g* p5 b4、在main.c文件中添加如下代码& ]: e8 ?0 G" z- v+ G6 @- T4 P

7 W3 {% S5 V# A* O. r
  1. /* USER CODE BEGIN Includes */8 G6 d2 s0 L5 p& }: A3 l$ s: X$ E' o% M
  2. #include <stdio.h>) ^4 W/ a9 A" O3 m/ u
  3. #include <string.h>6 B6 y- }( }' D* R9 I
  4. uint16_t i;
    ! }' J; e1 G: }/ g
  5. /* USER CODE END Includes */
    / G+ }2 e. L, e! z2 c
  6. - I5 W, e/ P0 @  F: y3 |  P" M
  7. int main(void)
    ! f: k5 d) a. ?6 b* b6 r0 _
  8. {0 M! ~! s" H4 N; _2 Q1 v
  9. *
    4 K4 Q$ t( q% r. \, n
  10. *, x/ T- R' w% x8 O. S# B+ r
  11. *4 {2 `+ H) V+ x5 b# g
  12. /* USER CODE BEGIN 2 */+ d& h# z4 ?2 Y- p( x% C
  13.   uint8_t writerbuff[BufferSize]="This is a test.";
    5 E3 A/ M4 _3 _  Y4 X! P- I# J
  14.   uint8_t readbuff[BufferSize];/ Q  B4 c) U2 h& N7 o
  15.   HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);             //下拉引脚,激活eeprom芯片7 Y" ^* s$ j7 x1 P+ Q, u
  16. % Q7 |+ \, s5 b% \- ^1 Z) u
  17. if(HAL_I2C_Mem_Write(&hi2c1,ADDR_24LC08_WRITE,0,I2C_MEMADD_SIZE_8BIT,writerbuff,BufferSize,0x10)==HAL_OK)6 a/ ?: e/ _3 b* |; q' G5 `
  18.   printf("Write succeeded.\r\n");
    $ u3 S7 H3 n8 B! u7 p
  19.   else9 {$ L" u/ S5 n
  20.   printf("Write failed.\r\n");
    + ~$ W( P' N+ y8 c0 a
  21.   HAL_Delay(5);                                                   //等待芯片写周期完成
    % }+ J$ |- p3 T- M7 W: o
  22.   HAL_I2C_Mem_Read(&hi2c1,ADDR_24LC08_READ,0,I2C_MEMADD_SIZE_8BIT,readbuff,BufferSize,0x10);4 d  D7 y+ G8 n3 e/ F" P
  23.   printf("The data in the chip is as follows:\r\n");6 ]: J9 g/ \8 V% C
  24.   for(i=0;i<BufferSize;i++)                                      //读取的数据通过串口打印出来
    ; Z& _; o% B% Y( }! y
  25.   {
    / ^) |" {: P9 S
  26.     printf("%c",readbuff<i>);
    & G0 @# m6 M$ ~4 z/ X  {
  27.   }+ G! _! B9 |! M! j
  28.   if(memcmp(writerbuff,readbuff,BufferSize)==0)                  //对比写入数据与读取数据是否一致$ }; s; `& O% n/ _& v
  29.     printf("\r\nVerification succeeded.\r\n");, H: T" N2 @9 N' z& w. x' x: p3 z
  30.   else2 Q+ s. ?7 ^5 N  B+ Z4 d0 O
  31.     printf("\r\nVerification failed.\r\n");3 T( ^/ c* X7 K! t5 F# b
  32. *
    / ^/ D. `1 ]( J/ \
  33. *
    & h6 g7 Z9 {* C
  34. *
    + U# b0 {' H' z+ ~3 s8 w% |1 \
  35. }</i>
复制代码
6 R8 X1 T, s. |4 A3 \* k8 Q/ W
5、编译好固件后,烧录进去芯片。串口输出如下& X) [4 M; Z3 T2 V- i

, G6 d  F+ k1 Q& X- j2 `3 T
20200710233907215.png

& u- D- g. A8 W1 V8 W, J! l& _! \
收藏 评论0 发布时间:2021-11-8 16:08

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版