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

【STM32G4 NUCLEO G431RB】+ I2C通讯终于完成

[复制链接]
老牛洋车 发布时间:2019-9-20 21:19
    之前完成了GPIO模拟I2C驱动DS1307和AT24C32之后,便继续测试如何使用硬件I2C。在热心版主和坛友的帮助下,经过几天的反复测试,硬件I2C也基本完成,在阻塞方式下完成了对DS1307和AT24C32的操作,下图为测试过程:
1 R& y# i4 x) B3 H2 j, g9 T I2C_Bus_Ok.jpg
  Z( i1 L9 A9 q/ v6 S  o% t5 D. w- V% g& w4 f. q
    屏幕下部的日期和时间是从DS1307芯片读取的,利用systick的毫秒中断进行秒计时,每分钟读取一次DS1307的日期数据,并用秒、分、时数据对AT24C32进行一次先读后写的操作,读出的数据(也就是上次写入的数据)显示在倒数第三行,当前写入的数据显示在倒数第二行。对DS1307读取数据交替采用HAL_I2C_Master_Receive()和HAL_I2C_Mem_Read()函数,读写的代码如下:
* F1 E" O- ^# h* W" G0 I4 f* P
  1. /******************************************************************************************
    4 G& d, c) f- v2 p
  2. * 函数名称: DS1307_I2C_Transmit(uint8_t size)
    * U& z. L$ E' F8 W
  3. * 功能说明: 写数据到DS1307
    + \0 C: D. m; T3 s5 y
  4. * 输    入: size 数据个数(要写入数据在全局数组DS_Buff中)
    $ Q3 N) Z4 f$ }- |( S( x5 e
  5. * 输    出: 0 = 成功写入  1 = 写数据过程中出现错误4 g. C$ p/ N4 r8 k& g
  6. ******************************************************************************************/" d0 B$ _! H/ a  E
  7. uint8_t DS1307_I2C_Transmit(uint8_t size)( _  b; K( q7 S6 R. H5 [) u
  8. {8 U- [, s$ j0 Y5 b! H: i9 s4 o/ t
  9.     uint8_t addr = 0;
    / c$ N2 Z: H0 U4 R
  10.         DS1307_DataToBuff();      //将时间及日期数据转换到Buff数组中
    3 S$ {1 V. g( g# ^7 t3 }
  11.         HAL_I2C_Master_Transmit(&hi2c1,0xD0,&addr,1,10000);//发送起始地址1 i4 B4 _7 r" o8 Z
  12.        
    5 n$ O9 k$ Y' U3 e1 }. K
  13.         if(HAL_I2C_Master_Transmit(&hi2c1,0xD0,(uint8_t*)DS_Buff ,size,10000) != HAL_OK)$ f2 S1 ^# B% O' i4 a" x, m" h
  14.     {$ o# M* K7 x/ t% ^" U( Y: @
  15.         return 1;2 |' G& k  p1 J- W
  16.     }
    7 ]0 _$ I; S  R' K/ G8 f1 I3 k
  17.         return 0;
    1 ~; ]0 j  C* N$ s% H; q) Z
  18. }
    % c& S3 ~+ h- _$ ?

  19. % N6 I* c, ?1 S
  20. /******************************************************************************************
    ; A; E. c. Y' ~  x+ D
  21. * 函数名称: DS1307_I2C_Receive(uint8_t size). r5 p0 A. G  g, k! c; F
  22. * 功能说明: 从DS1307读出数据
      p9 k" u& `8 u, U; u6 j
  23. * 输    入: size 数据个数(读出的数据在全局数组DS_Buff中)& K3 o8 f$ W. @8 Q2 g2 v* A3 t, y
  24. * 输    出: 0 = 成功读出  1 = 读数据过程中出现错误
    9 a0 A3 o6 a" O2 @
  25. ******************************************************************************************/" Q8 u* j5 j5 M9 m1 f/ ^$ B/ |
  26. uint8_t DS1307_I2C_Receive(uint8_t size)
    % h% S8 f, @  y* x
  27. {  Q1 \3 g- R& ?: v& s7 t
  28.         uint8_t addr = 0;
    $ `' [/ B  y! n2 U! H4 C% @& v
  29.         HAL_I2C_Master_Transmit(&hi2c1,0xD0,&addr,1,10000);//发送起始地址
    7 W3 y- \) U$ X* c
  30.         # ]% x$ J2 }. C3 ]1 {' |( V2 g
  31.     if(HAL_I2C_Master_Receive(&hi2c1,0xD0,DS_Buff,7,10000) != HAL_OK)
    1 |1 N$ z- m7 R9 o! a" t5 @/ n
  32.     {+ n: Y* E1 }6 Z; I; w
  33.         return 1;
    ) Q& a0 c9 g- C  T- j, ^
  34.     }. V9 v4 \/ n2 Q$ [& q* D9 t
  35.     if(size == 1){               //检查DS1307是否需要初始化
    6 h) k8 F- Z! F4 C
  36.                 if(DS_Buff[0]>127){
    1 E+ A3 R9 f) X( U9 S5 l$ V/ Z4 J
  37.             year = 2019;  d* M+ _$ U; B* r" l
  38.                     month = 9;
    2 g) C% t0 j( K0 R
  39.                     day = 18;+ x- V3 I% z3 s" m; \0 q) s
  40.                     week = 3;
    3 ^1 i' P% r  V
  41.                     hour = 9;% S, ^+ _& E* S8 q
  42.                     minute = 1;7 X  Z  g, j; Z$ R; ~2 a9 i
  43.                
    ' g; h$ x3 }0 P9 @6 x
  44.             DS1307_DataToBuff();
    * m! A' }$ g1 L3 ~$ {9 c
  45.                         DS1307_I2C_Transmit(8);
    6 u4 W: h" I, W, H: B
  46.                 }
    8 [# @! y  i* |( i% H
  47.         }
    0 T' ], A# @, s2 i$ |3 _, h( S
  48.         else{
    ; [! i1 Y" j9 c0 b" b9 B& C2 k
  49.             DS1307_BuffToData();
    0 j5 c* d: O; q
  50.     }6 d: R8 J3 _" o) g5 W! g9 J
  51.         return 0;       
    ! m, F) k3 ?) d  b* a/ y* ~
  52. }
    * @- j: B# n# \3 {5 n* S# ?. g/ v
  53.                  
    / s4 m$ z+ u+ T1 c' k& S
  54. /******************************************************************************************
    % R8 q% ~3 f& `9 [
  55. * 函数名称: DS1307_I2C_Read()
    . j# f9 J5 ~  p( ]' w/ v6 L! R- V
  56. * 功能说明: 读DS1307的日历数据,并转换为各自的变量值# V+ z: i* K' A
  57. * 输    入: 无
    . S- r0 R9 Q! q$ U# m
  58. * 输    出: 0 = 成功从DS1307获取数据  >0 = 从DS1307获取数据过程中出现错误
    # i5 r4 R7 H# `1 X) g( G$ ^
  59. ******************************************************************************************/& F$ {0 s- O+ Y. e
  60. void DS1307_I2C_Read(void)
    % I" J' \7 g/ J* b( `# M; @9 S
  61. {' N0 y7 C7 f; C$ K* K% F3 O

  62. . q0 R3 K, [& E1 s- p1 q* w
  63.     while (HAL_I2C_Mem_Read(&hi2c1,0x00D0,0,I2C_MEMADD_SIZE_8BIT,(uint8_t*)DS_Buff,7,10000) != HAL_OK); q. J$ X; Y* P8 U+ J3 r4 E
  64. //        while (HAL_I2C_Master_Receive(&hi2c1, 0, (uint8_t *)DS_Buff, 7, 10000) != HAL_OK)
    ; {% Q( T4 X7 c& B
  65.     {  L" h/ Q9 g8 C$ i. W8 \
  66.         if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
    4 {; o# R7 K; Z) q, b' W0 p
  67.         {# T* a! k; \0 R6 W2 F
  68.             LCD_write_ASCII(0,3,1,(uint8_t *)"DS_Read_Error!");0 w6 O; C, G& q0 Z
  69.         }* A3 p+ v5 t$ ~/ I9 s
  70.     }2 F- y; l5 ^6 k) H+ v

  71. " I7 G% O$ R4 l- x! ^6 c
  72.         DS1307_BuffToData();
    8 M- @0 q0 a. q& m0 X; N
  73.           D' P+ P9 w# P  u
  74. }
    ( I% I7 ^. W$ A) A# O2 D
  75. 7 Q$ A: t' V& C
  76. /****************************************************************************************** 3 U" b) i) F) R* E
  77. * 函数名称: DS1307_I2C_Write()2 @. p1 i( T0 h& z7 ?  D
  78. * 功能说明: 将当前的日历数据写入DS1307
    2 t8 q4 v, x" I* x9 s
  79. * 输    入: 无' W+ S) k( P4 m  k! [6 a' F) V3 x
  80. * 输    出: 0 = 成功写入数据  >0 = DS1307写入数据过程中出现错误  A" F# n/ R$ f2 y
  81. ******************************************************************************************/
    ( f, h1 }! u% Z
  82. void DS1307_I2C_Write(void)" C+ m) B( k" m; o1 p& ]
  83. {
    " D4 S% k9 l. a* O5 r8 Q$ e
  84.     DS1307_DataToBuff();           //时间日期数据转换存入Buff数组中# W5 R& R- ?! q' D6 ~
  85.        
    7 v, Z! i" a5 D8 z3 X5 Y
  86.     while (HAL_I2C_Mem_Write(&hi2c1,0x00D0,0,I2C_MEMADD_SIZE_8BIT,(uint8_t*)DS_Buff,7,10000) != HAL_OK)
    / `; k: q6 V0 R0 K
  87. //    while (HAL_I2C_Master_Transmit(&hi2c1, 0, (uint8_t *)DS_Buff, 7, 10000) != HAL_OK)
    2 {' G, I7 P/ ~0 J$ X% T! c
  88.     {5 {$ F# E& x  k$ I
  89.         if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
    ! }2 x" R- g7 _* d; b; ?$ \: N
  90.         {$ i( Z) \  I' p+ G
  91.             LCD_write_ASCII(0,3,1,(uint8_t *)"DS_Write_Erro!");( ~$ }8 L5 G. {$ r. }0 b
  92. //                        return 2;
    / ?/ k5 ?+ _# s7 m6 {7 B" g
  93.         }& A5 a% j- ]% Q0 y9 e
  94.     }6 E; [3 j" b+ y/ a
  95. //        return 0;
    / \. o# {+ K" E1 t/ |. \! Q
  96. }/ T! l1 M% @5 h. E" F

  97. 5 k& L# ^2 N8 U& ]
  98. /****************************************************************************************** . u3 V7 d" g  G1 ~+ m+ w+ d
  99. * 函数名称: DS1307_Chick()
      L% z! C8 m6 h# z9 l7 v
  100. * 功能说明: 检查DS1307是否已经初始化,若未初始化则用特写日期进行初始化
    * O3 ?: t5 ^7 N% [! ~: v
  101. * 输    入: 无
    % A" _# N) S3 y( T' O. {
  102. * 输    出: 无
    8 u% E( L5 E0 ?' u0 E( r
  103. ******************************************************************************************/
    $ E  v6 ^% E0 S" @" _3 a8 M
  104. void DS1307_Check(void)& T' h# C: @5 ^
  105. {$ e8 T. }2 r& i9 _$ d

  106. 1 d2 W( X5 C3 C7 C$ b
  107. //        LCD_write_ASCII(0,3,1,(uint8_t *)"Check_Begin...");, G0 s. B' Y  I" B6 t4 Y
  108.     while (HAL_I2C_Mem_Read(&hi2c1,0x00D0,0,I2C_MEMADD_SIZE_8BIT,(uint8_t*)DS_Buff,1,10000) != HAL_OK)' y! ?$ _% P% M" }( _. I4 w
  109.     while (HAL_I2C_Master_Receive(&hi2c1, 0, (uint8_t *)DS_Buff, 1, 10000) != HAL_OK)$ @5 P: i/ D5 |+ b0 @- Y" G. A7 X( Q
  110.     {! s  Q; a2 `. p- l4 Z4 ?% B. H
  111.         if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)- q2 Z5 j. B' p
  112.                 {
    6 O9 E% n* d8 l$ t9 e* c/ r* d
  113.                     LCD_write_ASCII(0,3,1,(uint8_t *)"CheckReadErro!");
    , O! V0 \; ~  a* B$ ]9 `2 M' ?0 K
  114.                 }
    / B$ ^& {$ t% L/ r1 A% c: r) q: H
  115.         }
    - j' j1 L' [3 Q) H  L5 K7 }
  116.         LCD_write_value(0,4,3,0,1,DS_Buff[0]);
    : u# c8 @" l* @' s4 r( g
  117.         if(DS_Buff[0]> 127){  Z7 J6 m! h) _) d1 `4 U
  118.         year = 2019;0 U# P6 S- k3 ^2 @6 P* t
  119.                 month = 9;
    . r& g# w/ `& z
  120.                 day = 18;8 [' J& {& i( o
  121.                 week = 3;% e, f/ k- j, B& O! J$ r& q+ [  X
  122.                 hour = 9;# Z% P8 {1 @, u5 y$ F$ Q/ a9 E
  123.                 minute = 1;
    ) m" {# p9 O! y2 W& h# H
  124.                
    ! X* H! K- s) r2 m; a6 A3 \
  125.         DS1307_DataToBuff();
    % h6 G4 t( `7 M0 P! [9 l. D+ ?
  126. 7 `8 x% ], S. {0 _$ h/ N% E
  127.         while (HAL_I2C_Mem_Write(&hi2c1,0x00D0,0,I2C_MEMADD_SIZE_8BIT,(uint8_t*)DS_Buff,1,10000) != HAL_OK)
    / o6 W8 h; n8 W6 j4 s! [1 _
  128. //        while (HAL_I2C_Master_Transmit(&hi2c1, 0, (uint8_t *)DS_Buff, 8, 10000) != HAL_OK)
    4 r8 g) B  ~( m$ y
  129.         {
    $ n+ \3 p- k- N% L
  130.             if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)% R* h( J- d+ ?( ^5 C& y
  131.             {
    / o" z  q% ^0 p! w8 R( r
  132.                 LCD_write_ASCII(0,3,1,(uint8_t *)"CheckWriteErr!");
    * @$ p2 k- ~% N6 O( I. O9 L9 N$ f
  133.             }
    2 {) J+ p* e  ~" s( }6 Q
  134.         }
    ( ~  \- E. }: A7 |: {; C% ~- x
  135.         }3 q# {, q6 w' L9 j
  136. }
    8 e8 W- E* t! u0 T

  137. $ c& S$ ~/ @6 ~- i; K
  138. /******************************************************************************************
    ) z7 f% [9 G* v
  139. * 函数名称: DS1307_DataToBuff()8 ?0 y/ l* S' i3 E# a9 \0 b
  140. * 功能说明: 将时间日期变量数据转换到数组Buff中' y/ I. G4 s8 f' g# M
  141. * 输    入: 无
    7 Q2 s! i$ M% X3 P  F( ?
  142. * 输    出: 无
    3 r5 Q3 ]4 C5 e$ Q' B9 S
  143. ******************************************************************************************/  t% l" ?7 ?: K! }
  144. void DS1307_DataToBuff(void)! i. v3 }( x* o9 _/ b* R" O
  145. {
    % s2 V# k0 P( u2 K) i0 @. V
  146.     uint8_t temp;  }/ V/ J+ c7 o+ `3 O/ a$ E7 ]
  147.         DS_Buff[0] = 0;                  //秒% g" B. u% l$ B2 e1 w1 ~1 {$ h* F
  148.     temp = ((minute/10)<<4|(minute%10));* q7 B3 l% p+ t# G1 H
  149.     DS_Buff[1] = temp;               //分
    0 b' x) ?! u+ y" \  @3 s1 g1 u
  150.     temp = ((hour/10)<<4|(hour%10));3 B, B6 Y3 x6 M) o
  151.     DS_Buff[2] = temp;               //时
    ! }7 @* n1 ?$ e7 l  ?; v3 X: p
  152. ( l$ s( P* g' _2 `* T0 V1 \
  153.     DS_Buff[3] = week;               //星期  F+ m. e3 ]1 W- u9 s4 k8 ^5 q
  154. 9 h: N/ z" t3 ^" `% B6 e
  155.     temp = ((day/10)<<4|(day%10));( z9 `  z( m' b3 T
  156.     DS_Buff[4] = temp;               //日
    " m/ f7 C4 |1 G  c5 z1 _( S3 Y# ?0 U
  157.     temp = ((month/10)<<4|(month%10));
    & R! B6 T' o  \; G6 E
  158.     DS_Buff[5] = temp;               //月1 d9 Y7 \* J, r& S9 C3 o( g, k
  159.     temp = ((year%100)/10<<4|(year%10));/ h4 ~9 S: |+ W
  160.     DS_Buff[6] = temp;               //年. G4 a, O4 Q( O& q7 C+ Q: X0 Y) Q% Y9 G
  161.     DS_Buff[7] = 32;                 //0010 0000 = 允许按1Hz输出方波; r" o3 Y1 r/ V6 z8 s
  162. }
    & v! Z8 s, N. u; _4 i$ B

  163.   P# ^3 N% E" i& b$ K
  164. 5 b: S# j- a2 \, c4 t& A% Z
  165. /****************************************************************************************** 7 q' M" w, z' U3 w3 }: E) _3 V& [7 ^
  166. * 函数名称: DS1307_BuffToData()% m/ N+ l0 Z9 |$ O5 d
  167. * 功能说明: 将数组Buff数据转换到时间日期变量中* b5 C. ~% ^7 X, u# O
  168. * 输    入: 无( R' @- d5 F  t. b) [+ F4 |: m6 I
  169. * 输    出: 无
    , `- ^7 {6 z! H% k# U0 R) b: y
  170. ******************************************************************************************/. i, L. V! B0 a
  171. void DS1307_BuffToData(void)! V7 k' ~8 {0 W- f1 K- u  I
  172. {
    ; l. f1 C# j4 {# B( \6 |
  173.     second = ((DS_Buff[0]&0x70)>>4)*10 + (DS_Buff[0]&0x0F);//秒,屏蔽秒的第7位的标志6 o* v$ G+ _4 \$ D! R) `) C0 F. W0 E
  174.     minute = ((DS_Buff[1]&0x70)>>4)*10 + (DS_Buff[1]&0x0F);//分(取低7位)
    2 @- d/ s' I- o$ N  L4 P% [
  175.            hour = ((DS_Buff[2]&0x30)>>4)*10 + (DS_Buff[2]&0x0F);  //时(取低5位)
    + R7 u/ `4 X$ i
  176.            week = (DS_Buff[3]&0x07);                              //周(取低3位)
    ) h6 ~6 W8 t: L5 h0 A' x
  177.     day = ((DS_Buff[4]&0x30)>>4)*10 + (DS_Buff[4]&0x0F);   //日(取低6位)
    0 X6 Y; D. E8 ?3 n
  178.     month = ((DS_Buff[5]&0x10)>>4)*10 + (DS_Buff[5]&0x0F); //月(取低5位)) J; l9 a  w; u) J! E1 o, ]
  179.     year = 2000 + (DS_Buff[6]>>4)*10 + (DS_Buff[6]&0x0F);  //年2 p1 q# ~# ]7 S" a5 Y6 y
  180. }+ k7 F& W/ i, g+ B
  181. 5 `  l' y! p5 f1 p
  182. /****************************************************************************************** 9 u2 m" H4 z5 l, _7 m$ Z7 j/ G* F0 H
  183. * 函数名称: AT24C32_I2C_Read()
    6 Y0 i, }2 a1 U4 I) G% V
  184. * 功能说明: 读取AT24C32的数据(存放在DS_Buff数组中)( V# _5 C+ e* C8 p8 c  s) D
  185. * 输    入: adrr(起始地址),size(读取的字节长度)
    ; n2 Z! }8 i+ G" h
  186. * 输    出: 无) A( ~" H* o) ]2 E; ?6 \
  187. ******************************************************************************************/
    " C$ F% e( S- j: ^0 B# d8 j
  188. void AT24C32_I2C_Read(uint16_t addr,uint8_t size)& M5 S# I6 |( F) r- B' v
  189. {
    ' p& @2 H1 A6 a

  190. # ^9 Z4 r& u& F) H: C% r
  191.     while (HAL_I2C_Mem_Read(&hi2c1,0x00A0,addr,I2C_MEMADD_SIZE_16BIT,(uint8_t*)DS_Buff,size,10000) != HAL_OK)& M  ?% o1 F1 [% U/ T! c
  192.     {
    8 O+ x% t( m4 p
  193.         if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
    7 K. j' h: ]! u- T8 ^; t* I" L
  194.         {3 f. }/ q/ k& ^/ z9 W. b
  195.             LCD_write_ASCII(0,3,1,(uint8_t *)"AT_Read_Error!");4 ], y  x" }" X1 B9 N
  196.         }. n7 W' Q7 P3 W2 o; q
  197.     }
    2 ?# n4 [/ A8 V, S7 r
  198. ! J3 o* V5 {: C! i5 Z/ H2 p
  199. }
    ( Y% x+ z! ^2 K

  200. / B0 ~  Q1 v1 U& T, e
  201. /******************************************************************************************
    $ |( Q8 j  `1 K+ q$ V: F5 ]: F/ {
  202. * 函数名称: AT24C32_I2C_Write(uint16_t addr,uint8_t size)
    9 {. Q  y. g4 ~
  203. * 功能说明: 写入数据到AT24C32(要写入的数据存放在DS_Buff数组中)3 f) a- w  U, r4 y  o
  204. * 输    入: adrr(起始地址),size(写入的字节长度)
    ! `! p# b& ~  S9 \2 _) ?- r
  205. * 输    出: 无
    ) }* C6 }/ P) q
  206. ******************************************************************************************/$ \5 O6 X. O2 e3 w& M  S  G
  207. void AT24C32_I2C_Write(uint16_t addr,uint8_t size)
    + @3 y2 B- u; M6 d* g
  208. {
      M( A8 C  W. D
  209.     while (HAL_I2C_Mem_Write(&hi2c1,0x00A0,addr,I2C_MEMADD_SIZE_16BIT,(uint8_t*)DS_Buff,size,10000) != HAL_OK)- @& G% `, g4 h9 x  j4 x1 K
  210.     {/ u  ]- h! ~* R+ ^2 r* M
  211.         if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)2 l/ R3 ~- t, t) V, A( \, D6 N
  212.         {
    8 H$ {! K0 N2 f, R, y4 C$ s
  213.             LCD_write_ASCII(0,3,1,(uint8_t *)"AT_Write_Erro!");
    - L; a. q1 |" e
  214.         }
      |: d, X* u6 Q: l1 ^
  215.     }! A& K9 W( @) I8 I: m

  216. 4 g3 V2 l& q- w# V2 R8 [
  217. }
复制代码

5 i: l! g5 [2 M% l4 d. }
! W- F' w  y* |* p" N- J; s8 k) s  t! x( x. G+ ]5 X4 q, y2 k

0 M6 l, P: `, N
* t8 s* Y* X# e4 t2 Z8 h: p+ m8 S
收藏 1 评论4 发布时间:2019-9-20 21:19

举报

4个回答
Litthins 回答时间:2019-9-22 22:01:27
DS1307和DS1302区别大吗?
老牛洋车 回答时间:2019-9-23 12:10:18
有区别,DS1307要依靠器件地址来选定,也就是说可以挂在标准的I2C总线上使用,而DS1302则不需要器件地址,直接发送要操作的内存(寄存器)地址就行,按我的理解就是在这个总线上只能一个器件。
香醋 回答时间:2019-9-23 13:50:32
顶一下~~!
kongxiangtong28 回答时间:2019-11-16 12:08:07
您好,能给我发一下G4的pack吗?官网下载老是提示错误,谢谢
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版