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

STM32G431RBT6笔记之IIC总线

[复制链接]
STMCU小助手 发布时间:2023-3-2 11:32
一、EEPROM24C021 w8 ?# n& M8 G, }" }) i2 I/ d
IIC的文件不需要CubeMX配置,官方已经给了.c文件,只需要复制过去就行
% X/ ^- R: b2 l5 y$ c, ^: D- M- Z; {2 x: e% o
d81a877abbd44dc0af7052c48bb4acf6.png ) k( y/ d& C" E0 r' Q
+ I5 }# o6 {* U4 x- V2 _; L
31044936e11a4de187196436312b53b4.png & n/ N( F! v- O* K

1 U6 Q- G' i/ T' V3 EI2C(IIC,Inter-Integrated Circuit),两线式串行总线,由PHILIPS公司开发用于连接微控制器及其外围设备。它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps以上。IIC是半双工通信方式。
( Q% Y0 I/ c) G7 j/ i& q* J' H
5 C% ~5 i: V7 ~$ u6 m0 ?; D在上一个模板的基础上添加iic的模板,首先还是建立文件夹、添加文件、编译链接,头文件的添加3 e% l0 M( Y+ D7 q$ O/ U+ `

9 M: a' h. c* b
846647620b4e4dcc898fb1e1defed5a3.png ) v) l# H( C6 e& A  @( X6 K6 Y

3 p# _" Y! W  W; p9 t2 }# O6 e
c4be7c9b7a7a47c7b3c2dfeadc4e9a73.png ! ^, b0 r/ j/ g8 M/ [" n
! Q/ J7 Y3 X2 _& H8 e
自己写read和write的代码
  1. //24C02的代码; P' Q. Y9 y  f' H% O
  2. void i2c_24c02_write(unsigned char *pucBuf,unsigned char ucAddr,unsigned char ucNum), C1 P5 m, u2 t4 D
  3. {4 C- C( U2 t# Q/ z3 K
  4.         I2CStart();0 j8 p1 g0 j6 F4 v  L- l) R/ y
  5.         I2CSendByte(0xa0);//器件地址
    % u+ T% }, E. y  B: U% Q
  6.         I2CWaitAck();
    0 W- {( H6 a4 q( o
  7.        
    7 B3 Q  D0 d# I& s. X# n
  8.         I2CSendByte(ucAddr);
    ( M- y) R7 e- A
  9.         I2CWaitAck();/ M. \1 N4 _/ `
  10.        
    , c% O3 H3 F% K) D$ {
  11.         while(ucNum--)5 @8 {6 \, h$ Y. `& [1 d
  12.         {2 p; S/ M: Y% c4 m
  13.                 I2CSendByte(*pucBuf++);
    & N& H2 ?7 X7 [5 |
  14.                 I2CWaitAck();5 R$ n; ^; ~2 c% Q) [6 R+ c- |% ~
  15.         }
    5 R. g& Y% p9 j+ ^' U) ~) `- C
  16.         I2CStop();
    5 L. O# O! p  A6 n1 s( |
  17.         delay1(500);
    ( [; b+ {* l7 n
  18. }
复制代码
  1. void i2c_24c02_read(unsigned char *pucBuf,unsigned char ucAddr,unsigned char ucNum)
    * {& ]) Y9 s4 k
  2. {/ K) D, i6 s" G) t& w9 V( h
  3.         I2CStart();
    3 y) s8 b9 b) X% q3 c# e
  4.         I2CSendByte(0xa0);//器件地址
    : x9 C& s. d; ?7 `+ S
  5.         I2CWaitAck();
    - t# s' n9 L8 b" k+ A
  6.         , R" t6 N2 I% q% r+ W
  7.         I2CSendByte(ucAddr);# @. h; _* a0 \2 Z- {) |+ M* E
  8.         I2CWaitAck();1 \! r+ |6 e3 u5 K& s0 Q
  9.        
    8 j0 w9 t! t+ z5 l& H4 ~
  10.         I2CStart();! u. u; d, A! K/ K$ B- X- C+ _" [
  11.         I2CSendByte(0xa1);//器件地址
      R2 K7 J1 M' Y  y* B1 a
  12.         I2CWaitAck();4 N( e' a) j$ }- j, G. i$ T4 U' J
  13.        
    7 [4 a+ ?; c5 G* L, _
  14.         while(ucNum--)
    8 C$ H4 i) W7 T3 B% R+ n" L
  15.         {( T0 _" K/ u' k( @
  16.                 *pucBuf++ = I2CReceiveByte();
    , a8 C: M3 Y* X3 Q) u5 k5 U; R4 v
  17.                 if(ucNum)+ N$ P% K; s( ?$ u/ ~, a3 D
  18.                         I2CSendAck();
    7 j( m' d2 a' o+ a/ w1 d
  19.                 else
    8 G( e# N+ v  T) D/ I3 ^
  20.                         I2CSendNotAck();5 ?7 W4 i4 P7 _9 P: y8 t$ C% i# q
  21.                 I2CWaitAck();0 w  p. i* T5 w3 c9 g8 @) Q
  22.         }
      a$ \3 E0 |' m' c* @
  23.         I2CStop();' |0 B' n6 K" {* y6 l. p
  24. }
复制代码
$ L$ Z# C' ~6 \! H
void i2c_24c02_write(unsigned char *pucBuf,unsigned char ucAddr,unsigned char ucNum)
& ?9 ]3 l: R7 e参数解释:*pucBuf:写的内容所在地;ucAddr:要写进哪里去;ucNum:要写的个数2 `! a$ U, r9 r0 W: |7 i6 I
void i2c_24c02_read(unsigned char *pucBuf,unsigned char ucAddr,unsigned char ucNum)
5 Y  W+ ]5 t. ~: T/ B& v0 c% A5 w参数解释:*pucBuf:读到哪里去;ucAddr:从哪里读;ucNum:要读的个数
! c: T9 e% J' m* R' o" c6 l# e- z0 Z " |  n3 F) j  G. d4 l: o7 @
21b7376230e5489e8843ee41955ef7ba.png * C+ q% E, h2 H3 j
" z5 l! n$ n* V7 F4 d
7907668187c34f6facdb2807d4924186.png 7 b7 O! `6 v' l' a

: F" X7 {' M. b- ~1 O接下来就借助LCD屏幕显示出来读出来的内容 。
9 K0 ]- A* K+ ~& C+ [
' o: K7 |5 W1 @: _+ Y8 h
7ffd926206e047cb9c4f362bcd8b1f64.png
1 x0 S4 N* a( s5 c. ^3 G' W! o: P, D' W4 g3 x
b264510015094ad5b5f8a775c5cbf98b.png
4 F% T8 f! E) _# L  a: Y# O( ]# l! Y7 s' I. S- ~; x; M
f7218915bdc74195901bd2ef84528c1d.png 8 c* U% [1 w( m  g5 N. w

1 k9 E! a5 u, v$ w1 e8 B 实验结果:3 N, i2 F: ~9 u) L

$ f1 w* V6 O8 n9 Z# j) j( g
ef7c258cc11a4c0188be771e391a8e10.png 1 ?" Q* s& I$ C: G5 i# C3 E$ |
$ J. i) K: c( r- d: a0 e
二、可编程电阻:通过软件的方式改变电阻:$ q2 M% r* Q$ O6 x. L! @: _
& ^3 @. u# S# ~1 ^5 {/ ~! g/ I5 _
238cebb9ee564cf3b88fea7519e863d7.png   P. v6 p% e8 o2 D. _& Z7 l% g
$ x6 f) g+ ?% l
dc4af04fc30449159b0bba4a0515c1b6.png
; g: G" P% G( o# N$ e2 M* a
; W6 k# R1 h5 _ ce95643e07c0424ebb52491dff57cd3f.png 3 Q4 {! D6 Y/ O3 k
. i, X8 Z% B1 s) R1 E9 S  Z, x1 w
bda9e16ace5b4acf8e92e2e93b1ec967.png " O0 w: Y; i% F) L2 w& _& u
4 ], l1 @# p# ^& Z+ Q7 W" }! ^
  1. //MCP4017可编程电阻相关代码可编程
      |* {; o7 b' T% L; K
  2. void write_resistor(uint8_t value)
    - }" w% Z* T9 L6 A! n
  3. {
      r+ q: E' j% i/ T  H% ^+ V
  4.         I2CStart();
    3 }& z: ]0 g" S) a2 W- _8 V
  5.         I2CSendByte(0x5E);//器件地址
    - r8 T$ S5 P5 C9 f' V, ^( b, |
  6.         I2CWaitAck();
    , o$ }0 e6 f% x1 e( W7 `
  7.        
    ( a# _$ X+ c0 b" z3 h0 Q2 k: {  {
  8.         I2CSendByte(value);
    ' e" i  l) @$ l- @/ O% ^
  9.         I2CWaitAck();, u" ?" a  a/ f: N% j
  10.         I2CStop();
    & q1 A8 E# _' x0 N9 E4 z6 h" E% t
  11. }
    7 j' {2 g8 L: l( J. |
  12. uint8_t read_resistor(void ). C) M* b4 G' U$ f& m
  13. {
    7 N( T1 T3 A% F$ h
  14.         uint8_t value;1 g6 d; a) L: v& H- u
  15.         I2CStart();
    , l) [9 y  k# w5 l1 Q
  16.         I2CSendByte(0x5F);//器件地址
    5 ^- u- y+ P" [
  17.         I2CWaitAck();4 j5 S7 Q/ x# s
  18.         9 ?, D+ c; d, _" \' Q) }  r* U* B  [. u
  19.         value = I2CReceiveByte();4 \5 Y: a& y8 e
  20.         I2CSendNotAck();
    ( s# U; Q" Z, n- }0 |
  21.         I2CStop();3 `' n) t/ L* j& ~# R
  22.         : I9 r! R# B1 ]$ R: ]
  23.         return value ;& V7 Y$ O/ C5 p: Z4 p" X1 q+ O
  24. }- [# m9 S* O; r1 P7 r6 ]/ [
复制代码

( N- Y7 |4 u1 @4 ]+ y- }9 n9 P 71ea6f0b34444d56bd7ef8e165b1d5f1.png 8 a# K/ |, z" K: t0 G4 y
* a3 f& k3 ]- n4 I
e8ac5ed9985d4508af2b62b0a265a8cb.png
6 P7 q) B3 f, k9 b) k, J% ^1 y; U( d7 N( p* l
5074b056b264465c91526718bc02e86b.png
4 ?4 j! U' [. x* K3 I. W4 s8 |5 k* s1 A. |2 U
1a5cc70c2394447f8241a774a0800900.png
3 b! W! Z: w  L7 m+ j3 p+ X% S# e
  1. void Lcd_Proc(void )//显示部分用到的东西
    % U0 q8 k0 @  v2 u  m; P
  2. {$ T8 V9 l0 J* n
  3.         if((uwTick-uwTick_Lcd_Set_Point)<500) return ;% z* L4 l$ z2 p2 |2 c! i$ }
  4.         uwTick_Lcd_Set_Point = uwTick;
      S" N% W1 U% R# q
  5.        
    8 w9 D1 ?5 b2 l
  6.         i++;- U' p6 T% y$ j) ]9 c/ U
  7. //        sprintf((char *)Lcd_Disp_String,"    i num:%03d      ",i);
    ; B, y2 |7 m+ W$ Q" M
  8.         sprintf((char *)Lcd_Disp_String,"EE:%x%x%x%x%x R:%x",EEPROM_String_1[0],EEPROM_String_1[1],EEPROM_String_1[2],EEPROM_String_1[3],EEPROM_String_1[4],RES_4017);
    , E. W! Y! `3 u7 a5 N1 e  _
  9.         LCD_DisplayStringLine(Line2, Lcd_Disp_String);
    4 d2 x6 \  @. t1 j
  10.         sprintf((char *)Lcd_Disp_String,"RES_4017:%5.2fK",0.7874*RES_4017);
    / B8 g1 \6 b6 H: c7 Y; w7 d6 [
  11.         LCD_DisplayStringLine(Line3, Lcd_Disp_String);
    2 w" R% L" w+ \9 B. M( w/ d8 j  _2 E
  12.         sprintf((char *)Lcd_Disp_String,"VOLTAGE:%6.3fV",3.3*((0.7874*RES_4017)/(0.7874*RES_4017+10)));
    ) [  i' M3 f; j4 n8 W
  13.         LCD_DisplayStringLine(Line4, Lcd_Disp_String);6 `& k! I* d1 j( }
  14.        
    ) d) G) @( u+ o  m  h8 B; c) c
  15. }
复制代码
! y, v* F, Z- S1 r
6 |/ g* E% m6 b! `1 ?/ x& U) r
bb9ccfcf730f4fdaa4a8cc25bfd0a30f.png
9 f. C: N: w* e% A4 R4 u% U8 F6 U8 P* f; y4 k5 y2 h# C
用万用表的时候,一头接GND,一头接J15上。大致是一样的电压) a* L2 Q1 n' k: ~' {
————————————————
" H4 @* R9 h7 U5 p版权声明:想要优秀点儿$ l, R, e; O5 E

* g7 d5 J1 h3 w' A" }  _
9 B4 Y/ _# o0 z% o+ i6 U
赞 收藏 评论0 发布时间:2023-3-2 11:32

举报

0个回答

所属标签

相似技术帖

官网相关资源

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