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

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

[复制链接]
STMCU小助手 发布时间:2022-10-28 18:14
实验步骤3 ^7 p! `5 n5 D! P. P) O
1、CubeMx中芯片选择STM32G071RBTx,新建工程
9 U5 t. W/ e4 Z+ z- D0 r9 u7 z" u) I3 K! J. F
2、开启SWD调试、HSE
5 z1 [2 i: E- L: F# A8 }' o% o1 o  n8 q: v: L; x
20200710210326903.png
) `% }6 W2 G. t# W" J! v4 O6 ] 20200710210417612.png
2 k* Y/ m' M# J+ e* T9 e$ f9 n/ B: c4 U. f( K
3、开启USART1 ,设置波特率115200、8bit、None(无奇偶检验)、停止位1
# a7 Z$ a1 W- f5 v5 W2 P3 w0 h8 g( S# @# M( \; o$ y
2020071021064272.png 7 r0 Q+ u7 S8 Y! r! d

" O$ u3 V' V2 O$ ]# B7 s4、 设置PB5为推挽输出模式,默认上拉,用于控制eeprom的WP引脚* j+ t' b+ R, {4 |( Q6 O
6 ~0 U& F+ F2 g  _. T& L
20200710211139405.png 20200710211620223.png , R' R3 [/ _2 l; Q: G' o0 C4 O! n$ ]

" y) O" p$ F; ^2 w: V0 C5、 选择PB7引脚,设置为I2C1_SDA,PB6设置为I2C_SCL,再激活I2C1,I2C Speed Moed选择:Standard Mode(标准模式),其他保持默认参数6 I. m" k# t( L" K9 P8 b

4 h5 W5 P+ Y+ K- [4 c 20200710212115736.png . ]! R4 a( k5 c$ g. @3 \$ n6 Y$ ?! i

+ O) C5 w6 x8 n6、设置时钟树,HCLK=64MHz
# D  W# O" m7 J* ]2 p5 e; J; ]& B, ?& K" L- a# B
20200710212802195.png
+ B% B" Y$ n* L* p. b
3 G/ x, D& M( Y" {' h7 ]' n 7、在工程管理里面,设置好参数,生成代码使用MDK打开。
1 L, [( i# [! j* E' d- L( e. w5 ]' N( [; e
20200710213244172.png
( V8 X& E, a7 `( y4 Q4 `3 p
1 L# s- ~. R  G3 p5 w4 p/ {) i3 m 20200710213308820.png
5 |+ F& W$ P) w% A. W2 J4 U  B
: s. R$ r/ L$ B* s代码部分
5 U6 U  F# y! O  l( l# J5 o1 W
1、在Debug选项卡中,Flash Download勾上“Reset and Run”
* V# V2 `8 x5 h: l* h/ L
4 J; o/ \/ J  {4 K2、添加printf打印代码,在usart.c文件添加如下代码
+ s8 G( E$ z( I% X6 k" G; c3 G
2 P$ @$ k4 t, L' i5 R
  1. /* USER CODE BEGIN 0 */
    9 Y3 T+ Z$ P/ @: K- X  h
  2. #include <stdio.h>
    $ G) e0 O3 I( W$ s: C
  3. /* USER CODE BEGIN 0 */$ W3 a; C3 p3 V' ?# i
  4. #ifdef __GNUC__; _, S7 X1 m* Z7 S
  5.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf1 C* g; S. k% d8 W! E
  6.      set to 'Yes') calls __io_putchar() */
    : Q% T" K$ T4 q8 w+ k* ]5 z, X' N
  7.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    - s& w! h& u5 N+ \8 k6 i7 E
  8. #else
    * E& {( }) `/ q1 d0 A. k
  9.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)+ j$ f4 C( K9 g/ ^" R( [" `
  10. #endif /* __GNUC__ */
    % m8 P3 z. m6 K" w- p; o
  11. /**
    0 K  t" _5 |7 _+ f4 b
  12.   * @brief  Retargets the C library printf function to the USART.5 ^- ^6 B/ I6 ]
  13.   * @param  None
    - D: r/ m" H# J3 e' l3 y: g. o
  14.   * @retval None
    5 N' _) a1 t; g2 R( E. ?: Y
  15.   */: h& [* ^" T$ w  l: ^: r+ ~% c
  16. PUTCHAR_PROTOTYPE
    3 }! h2 R! y: U$ X  ^5 a* }
  17. {* h1 F2 _6 l, e! `: Z8 V$ y
  18.   /* Place your implementation of fputc here */& R# j$ N5 c: e5 w( G" U
  19.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
    7 n: ^! y5 M% ?6 j. C- g' ^7 O
  20.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
    9 B/ M7 p( o, a% z5 D3 q
  21. ( A6 E0 X+ ^1 J. S% Z
  22.   return ch;
    * y* f% B, z6 l5 s/ a
  23. }" a8 n9 R9 n) R, E" {' f2 _
  24. /* USER CODE END 0 */
    5 G; H6 X7 U% X" R) c4 R
复制代码

3 T1 j7 ?+ H7 D3、设置24C08A的地址
  b, s# i: R/ C, p
$ A: {9 A: q" X8 ]$ O7 t5 H这里用的是8K的芯片,所以有P1,P0位(),有4个块区域,每个区域有256字节。,这就是8K芯片。A0表示第一块256字节的设备地址,A2表示第二块256字节的设备地址,A4表示第三块256字节的设备地址,A6表示第四块256字节的设备地址1 E' r# e! R. D4 F' I' f! }; b

' ?5 p8 `# b* j' B, U5 A' N1 i6 a 20200710214406373.png ! Z* b+ V8 U  S8 n$ r: y
) L- d) z- J( A) ^# R( G
在i2c.h文件中添加如下代码* X! a# |* c& x6 D) z# M0 O) o

4 J* g' j6 T. P( I5 d6 @* |9 B
  1. /* USER CODE BEGIN Includes */' @: H# c5 D5 b& U
  2. , ?$ q/ R/ O1 L9 ~9 W
  3. #define ADDR_24LC08_WRITE 0XA0                 //设备地址和写指令
    0 r9 p# E' p+ o* k6 z
  4. #define ADDR_24LC08_READ  0XA1                 //设备地址和读指令9 Z" H( F+ M  N5 w' X, I! ?, q7 P
  5. #define BufferSize 15
    * g  Y& V5 x+ R$ D

  6. ; }: j$ x  t. b7 t
  7. /* USER CODE END Includes */
复制代码
+ S" T% {: x3 j) R" V6 y. O/ k
4、在main.c文件中添加如下代码
' K9 ?! a9 t# |5 J& v, L; J' O" t! q7 E3 r" `
  1. /* USER CODE BEGIN Includes */
    + [+ W3 h1 l4 n4 S% K/ u5 T
  2. #include <stdio.h>; M7 d1 t9 Q  ^; G1 }% b/ \
  3. #include <string.h>
    0 u1 ]* o  ?2 {9 d: Z+ X+ S! R
  4. uint16_t i;/ P& y5 P( D/ O  S. A4 c# w
  5. /* USER CODE END Includes */7 Q" u% Y4 j+ `; R4 s
  6.   C8 h1 X+ G6 ]. T
  7. int main(void)( y. y3 f3 i2 G
  8. {0 X; K7 [0 u3 q" N5 N- G: v9 Z
  9. *
    % m& u+ ], q9 N3 N$ M
  10. *! c% A/ D$ B- b6 v0 D! c5 Z: _
  11. *: s% g6 C7 |5 j9 V- z/ y
  12. /* USER CODE BEGIN 2 */) @3 i- f! n+ f" d
  13.   uint8_t writerbuff[BufferSize]="This is a test.";. F9 {+ A% X+ k% f: I/ f
  14.   uint8_t readbuff[BufferSize];
    " M0 a6 O  |. d; L
  15.   HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);             //下拉引脚,激活eeprom芯片
    ! N: m3 @- l, C& i$ f/ O

  16. ; ^2 y# D( n" [8 `
  17. if(HAL_I2C_Mem_Write(&hi2c1,ADDR_24LC08_WRITE,0,I2C_MEMADD_SIZE_8BIT,writerbuff,BufferSize,0x10)==HAL_OK)8 ^' b+ V% z$ R
  18.   printf("Write succeeded.\r\n");. `' ?+ e0 P* k7 m' F" G: h
  19.   else
    ) q4 l3 p* l# V' B- J% @1 x
  20.   printf("Write failed.\r\n");
    . q% {0 L0 Z" h
  21.   HAL_Delay(5);                                                   //等待芯片写周期完成
    ; \: o; b; p8 j6 `0 O
  22.   HAL_I2C_Mem_Read(&hi2c1,ADDR_24LC08_READ,0,I2C_MEMADD_SIZE_8BIT,readbuff,BufferSize,0x10);. c9 A% L) h5 O3 z. ~
  23.   printf("The data in the chip is as follows:\r\n");
    3 ^! t% g4 z! f8 J, q
  24.   for(i=0;i<BufferSize;i++)                                      //读取的数据通过串口打印出来
    3 ?# p4 ~1 j. [' {# S7 g4 f3 J$ j
  25.   {
    , _  S' Y8 p! P, c) g8 F& u
  26.     printf("%c",readbuff<i>);( ?* Y5 z5 x/ t6 F& `  C
  27.   }1 {& X! d! b* |' T
  28.   if(memcmp(writerbuff,readbuff,BufferSize)==0)                  //对比写入数据与读取数据是否一致
    / ~' q* h3 J  d3 F) e$ t
  29.     printf("\r\nVerification succeeded.\r\n");# a3 P$ @7 G6 B& a* f* S2 g& y
  30.   else( {$ S7 D( a7 T
  31.     printf("\r\nVerification failed.\r\n");( T2 s4 u! ^; V3 v: |& b
  32. *
    " s0 k/ i" k$ C. n/ m2 F( ~2 I. N
  33. *
    4 l; l' W9 [0 B; ?* l0 F7 [
  34. *
    6 ?/ h& j+ @' [7 r
  35. }</i>
复制代码
) ~. V. {" v0 g2 G0 n* c* \; {

* }8 b0 Q; G- Y5 o9 D. ?5、编译好固件后,烧录进去芯片。串口输出如下
# `( Y! h* Z4 Z) N* I2 U" f3 j
. ~7 S: ]: E* J4 G7 Q 20200710233907215.png # u3 ~. X' a3 o2 f
" F5 t) d7 I; y( o" K6 {4 W
————————————————2 k  N2 z( X  @  T
版权声明:SCCELE
3 W0 b) x0 m) }( x9 ]" S# F) v" B3 ~5 x1 i; S
8 d: k" N4 t* l, X# p, |
收藏 评论0 发布时间:2022-10-28 18:14

举报

0个回答

所属标签

相似技术帖

官网相关资源

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