找回密码
 注册
关于网站域名变更的通知
查看: 121|回复: 1
打印 上一主题 下一主题

AT32 与EEPROM 通信--AT_SURF案例

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-6-14 09:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
AT32-SUFR板载了一颗型号为24C02的EEPROM芯片,该芯片容量为256字节,使用I2C总线和AT32 mcu连接。本章节描述了如何使用AT32的I2C接口实现对EEPROM芯片的读写,并将读写结果通过串口打印出来。4 ^7 T# |. \5 a/ r! }0 I! j1 |* z

  I- J2 J0 h/ o2 F" WI2C总线(Inter-Integrated Circuit bus)是飞利浦半导体开发的一种双向两线制总线,用于不同芯片间的通讯。I2C总线是事实上的世界标准,现在已在50多家公司制造的1000多种不同IC中实施。此外,I2C总线用于各种控制架构,例如系统管理总线(SMBus)、电源管理总线(PMBus)。7 @$ f: g( u! l3 `+ g* R

7 s2 l) p1 F. |+ TI2C总线的一些特性:/ x0 q3 y: O1 B) B( N
―   只需要两条总线:一条串行数据线SDA和一条串行时钟线SCL;
( a6 o: w0 p$ O. J―   连接到总线的每个从机都有一个唯一的地址,主机可以通过发送不同的地址寻址从机;
4 H. }! K* c! Z9 h0 p; y―   真正的多控制器总线,包括冲突检测和仲裁,以防止两个或多个控制器同时启动数据传输时数据损坏;
9 H# ?# O0 I9 m―   传输速度在标准模式(Standard-mode)可达100 kbit/s,在快速模式(Fast-mode)下可达 400 kbit/s,在增强快速模式(Fast-mode Plus)下可达1 Mbit/s;
/ ^0 d6 y6 c6 f8 W6 Y, j―   可以连接到同一总线的IC数量仅受最大总线电容的限制。
* g& B; Y2 x7 Y9 V. G& M7 B( G! U. X
I2C总线数据传输总是以START条件开始,STOP条件结束,当每个字节(8Bit)传输完成后,在第9个bit接收数据方将SDA总线拉低回复ACK,如果没有拉低代表回复NACK,当主机在收到NACK后结束通讯。5 l$ [' P" O; W! d3 N! A' K
% Q, \8 R6 M% E/ G/ o, b1 b
本案例主要介绍三种通讯方式实现对EEPROM的访问,用户可以根据应用灵活选择通讯方式。3 {7 j" t& v; R1 i/ `
―        轮询方式通讯:使用软件查询的方式传输数据;6 ?- z  Z/ i* `3 E5 B
―        中断方式通讯:使用中断方式传输数据;+ B" j+ b* N/ g% b& p2 b4 Q
―        DMA方式通讯:使用DMA传输数据。
5 k! ?4 {  f$ b9 d. v+ [
0 k4 v' {: M! F5 l. }7 F' K

% P- o) J$ b/ Z! X, a$ N/ F6 S资源准备
6 D/ E$ a% f2 M8 v  V硬件环境:
4 l. R( H" T- W, N- U    对应产品型号的AT-SURF-F437 Board
4 j0 U! h3 ~# c0 H. v软件环境:
- C( v3 I: s1 {, d3 o  [( f+ t    AT32F435_437_Firmware_Library_v2.x.xprojectat_sufr_f437exampleseeprom5 \/ r2 O, b; u. j* X! ~
硬件设计
. c. A0 K, d/ k6 M. @! r本案例使用的硬件资源有24C02,对应的引脚如下:; z! Y7 T  s* H6 C
! V# R8 [% B5 F1 |) y; U
对应的电路原理如下:) e+ F2 q5 n5 M) M2 }
# o/ V2 z) R  f% [0 u0 S
软件设计2 c: E: X# E: N$ I4 v: r
1)使用不同方式和EEPROM通讯
: ^4 Y5 K9 W; ^9 W- c初始化I2C接口
& _- P) i; G5 a5 F1 s用轮询模式写数据# v8 k: S6 H$ O0 A( \) _
使用轮询模式读数据% Y. h4 w' G" w8 n* @: u* U
使用中断模式写数据$ Z. p7 @( ?  q8 w+ _; M8 m. m
使用中断模式读数据! C, ~. b: c9 d" |5 B2 M2 \3 Y# L1 N
使用DMA模式写数据
  M, a- e8 r; X4 I* n: D5 y2 O使用DMA模式读数据
/ q+ U- w( c  j) i2)代码介绍
- }+ \9 {' C& _* }- mmain函数代码描述
0 a! C5 c  O; H/ p; _int main(void); D' }% J" L; K. d0 d& X
{% b' D# a# V: E
  i2c_status_type i2c_status;
+ I- d) k$ U' ^5 A9 t; ], p( Q  1 f- n  a$ j- i6 f1 _
  /* 初始化系统时钟 */  
0 Q, b' E- d1 u( Q  c, c  system_clock_config();  6 r3 m  D5 U0 [- F
  
, Z4 p+ Y$ i# L# R0 D3 M$ D- c4 Y  /* 初始化中断优先级分组 */   
  z# O6 y) z8 O* [- C  nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
9 Q) L7 X, z& Z  T" d6 o( i3 U( T# f' m% m0 I( e- K
  /* 初始化延时函数 */
0 J# }& Z5 \% O. o  delay_init();
2 s& G" m6 I3 m  4 T% W4 q* N; ^
  /* 初始化LCD */% D. E. U9 b! C" z( O  E
  lcd_init(LCD_display_VERtiCAL);0 i. M) S1 m: }7 l; D1 p' x
0 @# l; a) Z9 Y/ }* N0 q  V* b
  /* 初始化EEPROM */
( y( y$ o: a( G9 ]  eeprom_init(EE_I2C_CLKCTRL_400K);
' Y2 q" q/ Q: l+ \, f) b' g  - w  u  ?$ t* ?- z! c3 B, w
  /* 显示信息 */  
: a7 [" c# n4 @5 P8 d, I" Z  lcd_string_show(10, 20, 200, 24, 24, (uint8_t *)"EEPROM Test");
+ [1 o/ ]- X+ |) b8 S" z) [/ _4 t$ q" d
  x% A. }! W1 H4 {' h0 V  /* 轮询方式写数据到EEPROM */  
7 ]: @; ^5 g2 m) n  if((i2c_status = eeprom_data_write(&hi2c2, EE_MODE_POLL, EEPROM_I2C_ADDRESS, 0, tx_buf1, BUF_SIZE, I2C_TIMEOUT)) != I2C_OK)
( x' M. K" j# [( }8 x9 w  {
& C6 S# O" X0 |+ i0 O    error_handler(i2c_status);
! H" C! i8 w2 h  }
) K8 M5 B/ h  }6 e3 J9 W  . }. q; F5 X$ e# z1 a
  delay_ms(1);
+ Q" O; s  \! ]6 w  
# I( \, n* s+ t  /* 轮询方式从EEPROM读数据 */
6 @5 m% m1 a5 R6 ^* ~+ w  if((i2c_status = eeprom_data_read(&hi2c2, EE_MODE_POLL, EEPROM_I2C_ADDRESS, 0, rx_buf1, BUF_SIZE, I2C_TIMEOUT)) != I2C_OK)
/ M* j6 l# b/ U+ n2 I  {
. n* _* w+ }3 M+ N) ~    error_handler(i2c_status);
% L* p' @$ ^' o3 K" R1 @  }
0 G0 T& A0 |8 P  ( P. E! a) s# [8 U' s! d
  delay_ms(1);) G$ _- t* V; b# t! _
  
8 v* i1 [* o) {. q0 @- n  /*中断方式写数据到EEPROM */  : ~! _, I/ d6 {6 B7 X
  if((i2c_status = eeprom_data_write(&hi2c2, EE_MODE_INT, EEPROM_I2C_ADDRESS, 0, tx_buf2, BUF_SIZE, I2C_TIMEOUT)) != I2C_OK)
0 V: j% J# ~: P7 P2 ~: Y; b* k  {# Q! M4 [  n7 _& x; ~: h
    error_handler(i2c_status);: }9 B. h, z+ z5 z* M
  }
2 e. X& n, k' U0 A4 G  - I6 h; m! o& Y6 q
  delay_ms(1);
5 r, [1 t4 ]+ i9 x9 ]5 m$ }8 b  
# E7 L4 g5 a0 H; @4 r  /* 中断方式从EEPROM读数据 */
- G1 v0 }/ N' S* q& f& n  if((i2c_status = eeprom_data_read(&hi2c2, EE_MODE_INT, EEPROM_I2C_ADDRESS, 0, rx_buf2, BUF_SIZE, I2C_TIMEOUT)) != I2C_OK)
# f! T" Y# w6 `3 t( h/ k  {
$ |2 z. F  |) K3 U    error_handler(i2c_status);% m. t& G! W9 ~0 W
  }
; ]' q! B0 K& G, q; m; p. N  - B2 t1 c- ~. r* ^  F2 b
  delay_ms(1);
1 R  j2 L7 t4 Y" L  
7 x0 G: D/ g1 Q" }2 W3 |1 F/ J5 @  /* DMA方式写数据到EEPROM */  
8 x5 F9 N; ], H7 \) X  if((i2c_status = eeprom_data_write(&hi2c2, EE_MODE_DMA, EEPROM_I2C_ADDRESS, 0, tx_buf3, BUF_SIZE, I2C_TIMEOUT)) != I2C_OK). V* O. `% I# R& Z, r
  {5 C( ^9 ^& Z7 o: O& _- J; S
    error_handler(i2c_status);
' l! L9 g1 n7 T; E  }
! S6 p* w* l) \  
# b8 |/ B8 p& l' [( ?8 K( g, ^  delay_ms(1);( m# H/ s  g4 l
  6 @$ M8 \( V: Y9 {; O. \, E" x: O
  /* DMA方式从EEPROM读数据 */
8 W# A: |0 ~1 R$ q1 x0 ~  if((i2c_status = eeprom_data_read(&hi2c2, EE_MODE_DMA, EEPROM_I2C_ADDRESS, 0, rx_buf3, BUF_SIZE, I2C_TIMEOUT)) != I2C_OK), t2 q  M7 }& a0 ~% _' n
  {; w& C$ t( |& K+ @0 U" r# j6 A
    error_handler(i2c_status);2 ]  C. `4 E+ k+ n
  }" `2 a  a; g" x+ l5 g" ?
  3 U5 A* d& X" J% s9 [
  /* 比较写入和读取的数据是否正确 */4 S% Z# ^0 m' Q6 y
  if((buffer_compare(tx_buf1, rx_buf1, BUF_SIZE) == 0) &&& `0 y/ X/ }  T
     (buffer_compare(tx_buf2, rx_buf2, BUF_SIZE) == 0) &&5 t0 `( _, f3 G$ X) K/ z
     (buffer_compare(tx_buf3, rx_buf3, BUF_SIZE) == 0))
5 H  T/ s1 X1 ?6 X0 l/ o  {! a# S0 p* K2 L! h3 R" G
    lcd_string_show(10, 60, 310, 24, 24, (uint8_t *)"eeprom write/read ok");/ p, ]6 f, }3 s; {+ L. }" p
  }
& {( D8 g% o1 j4 b! k1 W  else1 u4 F; l7 [) _7 a$ h
  {$ z$ z& ^& B/ M( K. r# y, P
    error_handler(i2c_status);
2 |6 ^  T  l6 p$ U" {  }
8 O6 N& X0 L/ }8 s3 l" y  
& \# \0 `$ O  |  while(1)
, o0 E' X" T6 T& \4 P7 U+ L  {6 M9 [4 N1 U2 V: N
  }% Z5 |4 Q( j9 T" ]0 n0 S5 q& v1 T) B
}
. V" ?4 w  w1 M- m
- b. B4 Y5 Q* W4 W* b$ C

" C1 a% S0 o6 {0 L: r# y0 q4 avoid eeprom_init(void)函数代码描述
% p% X- A+ |4 F1 D! T" [& s/**
5 J& B4 O* T1 N) x/ i! {  * @Brief  eeprom_init.
1 W0 ^  a+ Q, l6 W; u5 q7 R  * @param  none.: c5 g8 w0 b( q3 J
  * @retval none.
# P3 F3 a2 ?7 M2 x  */1 t6 I( M0 ~' T! n" B# K$ T3 f
void eeprom_init(void)
2 S4 }$ _3 A% L7 T5 t0 M; n: U
/ M! _' a) Q' U' ?# A- t
eeprom_data_read()函数代码描述
5 _+ D5 ~) A1 J/**8 N; F. l, Z! j/ L
  * @brief  read data from eeprom.
8 r9 _3 {- O, Z, g  * @param  hi2c: the handle points to the operation information.  l5 b. k1 p+ H' m
  * @param  mode: i2c transfer mode.9 I! P+ J9 O# {% N! M5 W8 I
  *         - EE_MODE_POLL: transmits data through polling mode.
) c2 h2 B" g- m7 L6 L$ G' K8 C  *         - EE_MODE_INT: transmits data through interrupt mode./ G$ Y1 w. J& U6 y* ~
  *         - EE_MODE_DMA: transmits data through dma mode.
8 |0 I$ W  u* n% Y0 ~0 B  * @param  address: eeprom address.
  |/ S# a  K/ o7 }  * @param  mem_address: eeprom memory address.
' x' Q9 P8 x- E7 q# q  * @param  pdata: data buffer.
2 t4 ~' E- T3 l$ {, g  * @param  number: the number of data to be transferred.
" b) d  b: B* ^+ \  * @param  timeout: maximum waiting time.) L# ?. {  Y6 I, h+ ^1 I
  * @retval i2c status.
4 `, R6 K% G: K& z  */. \) C2 T. g1 i- v1 J  ]
i2c_status_type eeprom_data_read(i2c_handle_type* hi2c, eeprom_i2c_mode_type mode, uint16_t address, uint16_t mem_address, uint8_t* pdata, uint16_t number, uint32_t timeout)
9 m, N# o# i8 y

7 A0 {+ t$ T2 S+ a( |5 qvoid eeprom_data_write()函数代码描述
( u$ |; Z; G- q, x/**
4 [/ Z1 Y% N/ P5 s7 }  * @brief  write data to eeprom.7 u( g" Z3 e1 I
  * @param  hi2c: the handle points to the operation information.
6 v% j2 M/ _# b9 Y  * @param  mode: i2c transfer mode.$ Q) y2 J' B# e1 c7 ~; A/ K
  *         - EE_MODE_POLL: transmits data through polling mode.
- I- Z0 b. X7 X9 {  G9 w  *         - EE_MODE_INT: transmits data through interrupt mode." H2 \3 I1 F3 o* ?) A' O# R) n9 d
  *         - EE_MODE_DMA: transmits data through dma mode." O; l4 [3 C' S2 n. x6 r
  * @param  address: eeprom address.. h" p; r- s2 \* R- ?8 g
  * @param  mem_address: eeprom memory address.3 C1 P  O) y* h9 g& R/ N4 L/ S. o
  * @param  pdata: data buffer.
; @/ N9 a; B0 ]) n* D  * @param  number: the number of data to be transferred.8 P, s" ^5 ]4 L% Y  ^  o
  * @param  timeout: maximum waiting time.
$ J0 h" m/ ]1 h# G  * @retval i2c status.* ^# x7 X  b/ @6 D- `8 |. K' ~
  */
, L" ^7 h8 n, i- r* x* Vi2c_status_type eeprom_data_write(i2c_handle_type* hi2c, eeprom_i2c_mode_type mode, uint16_t address, uint16_t mem_address, uint8_t* pdata, uint16_t number, uint32_t timeout)
; o6 o, ^1 r! c- e( ~
6 d" ^( G9 M. C8 [6 o/ P
下载验证3 Y% [: D2 m6 y; l9 ~2 i
如果通讯正常,写入和读取的数据相同LCD屏显示eeprom write/read ok% |) j" a5 B# d) X4 }
如果通讯错误,LCD屏显示eeprom write/read error
7 q. U  h( |3 i
2 g7 S, J8 B% P. Z                [url=][/url]                        01 R$ [. l( N6 \. Z3 d. w7 Q& G5 R

' C0 e$ R! J4 Q" S

该用户从未签到

2#
发表于 2022-6-14 10:47 | 只看该作者
很好,内容全面,讲解详细,太厉害了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-29 07:36 , Processed in 0.078125 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表