AVR TWI读范例程序.docx

上传人:飞**** 文档编号:44040153 上传时间:2022-09-20 格式:DOCX 页数:13 大小:28.66KB
返回 下载 相关 举报
AVR TWI读范例程序.docx_第1页
第1页 / 共13页
AVR TWI读范例程序.docx_第2页
第2页 / 共13页
点击查看更多>>
资源描述

《AVR TWI读范例程序.docx》由会员分享,可在线阅读,更多相关《AVR TWI读范例程序.docx(13页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、AVR TWI读写范例程序(AT24C02)3 b$ X8 q+ B0 本程序简单的示范了如何使用ATMEGA16的TWI 读写AT24C02 IIC EEPROM新洁家园) c# bA. h. F* TWI协议) f9 Y9 : S! O1 j7 z (即IIC协议,请认真参考IIC协议的内容,否则根本就不能掌握)! P0 X! f$ |; X9 & |/ u. J$ g机械、电子电气、编程技术 一主多从的应用,M16作主机$ R! R, n WT (M16做从机和多主多从的应用不多,请自行参考相关文档)0 w; C* q( h+ w$ : e9 7 中断模式新洁家园$ e; _: B8 b

2、$ T (因为AVR的速度很高,而IIC的速度相对较低,机械、电子电气、编程技术 x0 z6 G J, X4 M 采用查询模式会长时间独占CPU,令CPU的利用率明显下降。% q- s7 M8 qP( p) o 特别是IIC速度受环境影响只能低速通讯时,对系统的实时性产生严重的影响。0 ; ?, C4 ?; ! A) B; W2 t 查询模式可以参考其它文档和软件模拟IIC的文档)9 e5 Q! pa H5 j9 I8 R# M) y AT24C02/04/08的操作特点- # 6 N+ i- K新洁家园出于简化程序考虑,各种数据没有对外输出,学习时建议使用JTAG ICE硬件仿真器& o:

3、U$ M+ J9 L) c! R& F0 A8 - L: O+ d; k- J& y7 O7 q8 D, m/ x# D机械、电子电气、编程技术#include ! L! C h! J1 K A2 / z#include 新洁家园0 x& ? d, j8 ! a# N6 e#include k% L- k5 ?$ w% X, h#include 4 n: U+ : f) |+ c) |新洁家园/时钟定为外部晶振7.3728MHz,F_CPU=7372800* p) J1 ?* V; x# t- #include A# m) O! W6 Y3 C/定义了各种模式下的状态码列表(TWSR已屏蔽预分

4、频位),本文后面附上中文描述 i: T7 n2 T0 |1 r) 8 ?机械、电子电气、编程技术/管脚定义* D) h/ F# s2 Y0 P9 h2 # d2 #definepinSCL 0 /PC0 SCL. R h# X9 J( j$ h2 J6 h/ O% _#definepinSDA 1 /PC1 SDA+ H2 M7 K0 I! G; U1 D- G/ B/为保险起见,最好在SCL/SDA接上110K的外部上拉电阻到VCC。4 % f* 3 W. O* U#define fSCL 100000 /TWI时钟为100KH6 * 8 w/ + 5 M9 q: Y- n/预分频系数=1(

5、TWPS=0)$ . ?! E# j0 ?F2 #if F_CPU fSCL*362 P% e; y+ |& j; U& O机械、电子电气、编程技术#define TWBR_SET 10; /TWBR必须大于等于10+ C# I+ C 9 i+ J7 D! y. #else4 |/ |# * e6 7 X#define TWBR_SET (F_CPU/fSCL-16)/2; /计算TWBR值+ N X! E W# z L2 X/ u) H机械、电子电气、编程技术#endif: W- i* R2 F* V# c8 l0 N; q#define TW_ACT (1TWINT)|(1TWEN)|(1

6、TWIE) P: a) a3 a5 X, M# H p9 D/TWCR只能IN/OUT,直接赋值比逻辑运算(|= &=)更节省空间fq, v& d( P5 p2 |新洁家园#define SLA_24CXX 0xA0 /24Cxx系列的厂商器件地址(高四位) lU$ A8 b3 _4 t1 / E#define ADDR_24C02 0x006 i EF2 T% f0 P1 o+ F AT24C02的地址线A2/1/0全部接地,SLAW=0xA0+0x001+0x00,SLAR=0xA0+0x008)1;7 m% U0 |& T2 G1 |5 i&=0x06; /考虑了24C04/08的EEP

7、ROM地址高位放在SLA里面( v! o1 M0 1 q( M) o8 0 D9 strTWI.SLA=sla+i;: fk# u- u% H! d1 n- V机械、电子电气、编程技术 strTWI.ADDR=addr;. m m$ T; d( v7 B) I* strTWI.pBUF=ptr;/ I; p- k, X0 ?! E( 机械、电子电气、编程技术 strTWI.DATALEN=len; # % s$ f. d8 U8 j; ? strTWI.STATE=ST_START;- D4 ?! U7 J6 0 2 A strTWI.FAILCNT=0;机械、电子电气、编程技术8 O) 4

8、o7 T P$ u2 L T TWCR=(1=0x60)|(status=0x00)/ X2 6 N4 U+ R2 w/ C /总线错误或从机模式引发的中断,不予处理1 z- Z B# R; p j# I7 j q return;4 * W; b/ c8 py( L $ c$ B/ d* e% j) % S( t3 I5 f switch(state)机械、电子电气、编程技术 g j7 y2 l, ) _1 o- k. m ; m/ f8 r. N8 T5 A ?6 S. E% O B新洁家园 case ST_START: /START状态检查4 L/ % X9 X; c if(status=

9、TW_START)% I& v6 W8 I2 R6 N- N8 N /发送start信号成功; j: , v6 j: M* u I TWDR=strTWI.SLA&0xFE; /发送器件地址写SLAW新洁家园+ v n3 V# C& p1 H7 Q2 TWCR=TW_ACT; /触发下一步动作,同时清start发送标志机械、电子电气、编程技术2 y1 S3 3 W( A ! U& |( Y, P; x else新洁家园 X$ r/ 1 e) B* c /发送start信号出错新洁家园3 T. T+ c- e( y: F state=ST_FAIL;. q* jBm& K, D, ; ) a)

10、O 3 YV- V+ F/ B机械、电子电气、编程技术 break; C0 W$ t8 0 a! d case ST_SLAW: /SLAW状态检查! 6 H0 R: R; Hg& e( W; h. W机械、电子电气、编程技术 if(status=TW_MT_SLA_ACK)7 z+ b: : w- H) ?. /发送器件地址成功, g9 v: B6 ?9 , d, b1 O& r TWDR=strTWI.ADDR; /发送eeprom地址4 F$ a8 L# J/ l 1 新洁家园 TWCR=TW_ACT; /触发下一步动作; J# v- gR# a, M 新洁家园# f- |7 Y9 z*

11、 % : T/ B7 p else T, q- m4 f5 p- y. ; F /发送器件地址出错+ u% _7 A3 L1 3 7 state=ST_FAIL;+ p/ 6 A. ) n* B n a机械、电子电气、编程技术 l- J& U% Q. l8 P break;+ : o! X+ V/ u4 H* A case ST_WADDR: /ADDR状态检查1 n9 O/ Y# L7 T; m7 if(status=TW_MT_DATA_ACK)新洁家园! c6 v5 mf5 w. N) a+ Q7 K3 T( U /发送eeprom地址成功, l6 u2 s L2 XR3 h I6 n.

12、 m6 H if (action=TW_READ)3 N5 O& k4 z5 q% Q, c, 8 9 | /读操作模式3 d; HB 0 E# L1 l) h1 TWCR=(1TWSTA)|TW_ACT; /发送restart信号,下一步将跳到RESTART分支$ % F2 ( X4 l4 u9 P ( g新洁家园 . N, ! W! y) A% e7 z W else( g& t; _9 i l c. e /写操作模式* S$ G4 y3 r3 s. _! m8 2 P* m新洁家园 TWDR=*strTWI.pBUF+; /写第一个字节, j: 6 s; |7 H- strTWI.DAT

13、ALEN-;6 s( I: y, 9 Z( N4 |: G; 机械、电子电气、编程技术 state=ST_WDATA-1; /下一步将跳到WDATA分支6 B2 % w3 S: L3 TWCR=TW_ACT; /触发下一步动作 R0 a$ e, l1 U8 S# u+ E 新洁家园) ; e: k8 j1 & c/ yc6 V( H e8 I* a$ 4 f8 # d9 n机械、电子电气、编程技术 else% n, z6 n 1 + r /发送eeprom地址出错& R1 Vl+ G+ R: q, state=ST_FAIL;2 O. N6 a& e6 r6 Z; r( x9 H) J w*

14、1 W + g5 q/ L+ Q- q# break;( Pl; D0 h, H 1 M! w case ST_RESTART: /RESTART状态检查,只有读操作模式才能跳到这里4 x3 T) d6 l3 J! 0 l9 Q y if(status=TW_REP_START)! * a3 q7 E$ J /发送restart信号成功 s. ! s! c D2 u# G TWDR=strTWI.SLA; /发器件地址读SLAR+ / Z1 s) r9 f TWCR=TW_ACT; /触发下一步动作,同时清start发送标志新洁家园- f1 c* M- A9 ; C, M. s ; X% b2

15、 Ns+ i else , i: n1 C) /重发start信号出错8 U5 k% Os: T* i/ n. N+ w state=ST_FAIL;$ g$ y6 w7 W) o机械、电子电气、编程技术 机械、电子电气、编程技术- U4 u4 m- T C& L$ t K. ! m break; V9 U! f6 n* W$ T4 c case ST_SLAR: /SLAR状态检查,只有读操作模式才能跳到这里4 L6 kb+ & u+ y* w机械、电子电气、编程技术 if(status=TW_MR_SLA_ACK)$ b, K0 ?% B8 | /发送器件地址成功& J: ow! S0 D

16、 a# Mm* X) M新洁家园 if (strTWI.DATALEN-)$ Ms( F- B ?$ i# HL /多个数据; h/ j- g7 P$ r) I* u4 B/ D! | TWCR=(1TWEA)|TW_ACT; /设定ACK,触发下一步动作机械、电子电气、编程技术$ l8 a9 R: n m8 M 2 |0 6 l2 y m else- k* F/ ) w, f( ?! f; l机械、电子电气、编程技术 /只有一个数据机械、电子电气、编程技术7 * u; ; u/ b6 L0 Z3 P TWCR=TW_ACT; /设定NAK,触发下一步动作4 b. ( Q$ k, D8 K6

17、新洁家园$ t- l& * u* 2 $ 1 y6 o$ S1 q7 b2 y( y$ R机械、电子电气、编程技术 else: N8 o2 B: e$ _ rt0 /发送器件地址出错9 b; Yl6 P2 cY6 7 t新洁家园 state=ST_FAIL;0 d1 $ a+ + D4 L M 3 Q% A. 7 I! T( d, break;& O8 v5 p8 c4 g) r case ST_RDATA: /读取数据状态检查,只有读操作模式才能跳到这里新洁家园; Z8 o# 4 5 + Q |6 S, ) L state-; /循环,直到读完指定长度数据6 9 1 F: N% B- X C

18、 if(status=TW_MR_DATA_ACK)3 |) - M& V% i% Q3 X! u /读取数据成功,但不是最后一个数据 e& ?; v) z1 V8 j2 i% O0 c* . i *strTWI.pBUF+=TWDR;# v6 z, z. k9 w+ J O4 v if (strTWI.DATALEN-). W7 & g8 f$ _9 Y. v /还有多个数据 o; A4 0 N& pN TWCR=(1TWEA)|TW_ACT; /设定ACK,触发下一步动作Z. W. l0 ! c/ S8 l9 X8 q新洁家园 r, h& P) d! b1 G9 q* m4 j W机械、电

19、子电气、编程技术 else# V% w j1 P+ R5 ! L# o /准备读最后一个数据机械、电子电气、编程技术0 p: _ q& 0 _1 C0 |* |- g TWCR=TW_ACT; /设定NAK,触发下一步动作, w- n& % b* r7 c7 e/ h新洁家园 4 w; 3 ?; o3 Q; A机械、电子电气、编程技术 3 R5 H& 1 N+ F8 d7 w5 1 else if(status=TW_MR_DATA_NACK)8 4 O6 b: T) X) T机械、电子电气、编程技术 /已经读完最后一个数据* X0 f+ n6 S o: VF *strTWI.pBUF+=TW

20、DR; s( u* ZL6 I机械、电子电气、编程技术 TWCR=(1TWSTO)|TW_ACT; /发送停止信号,不会再产生中断了& A4 V. t1 B$ C( G: p( p! u- o R8 w机械、电子电气、编程技术 strTWI.STATUS=TW_OK;6 D% h- k, + m8 h6 R9 t新洁家园 机械、电子电气、编程技术3 N+ q: l0 P4 U- l else# c$ g( _5 ?; h3 a/ r /读取数据出错/ J* Q: f4 n1 e R* k9 ! A4 state=ST_FAIL;* N- 3 i0 Y5 |4 ?机械、电子电气、编程技术 机械、

21、电子电气、编程技术R( d3 E0 F) w6 f- , p break;q; v P: L+ v! |u4 F4 8 case ST_WDATA: /写数据状态检查,只有写操作模式才能跳到这里新洁家园) i+ I: i# O5 W5 D4 v6 y! ? state-; /循环,直到写完指定长度数据$ s! 4 T2 d9 W8 ; 4 3 u+ p机械、电子电气、编程技术 if(status=TW_MT_DATA_ACK) e6 X) r% X; H7 L* K /写数据成功/ A+ K5 , % r机械、电子电气、编程技术 if (strTWI.DATALEN)新洁家园! ?K9 F3

22、?. K( p! d+ n+ j /还要写6 # / # K z& p( r3 w; _6 j TWDR=*strTWI.pBUF+;8 E1 R K* y5 j5 v x, q strTWI.DATALEN-;: & E$ g! ( | TWCR=TW_ACT; /触发下一步动作机械、电子电气、编程技术3 7 e g4 b3 m W 7 Bv# % H4 v6 u3 Y% U7 q) a/ Q else9 M( s6 A) f; E I+ Z /写够了 F; K3 t( : b9 m TWCR=(1TWSTO)|TW_ACT; /发送停止信号,不会再产生中断了5 ?9 J0 S& v. z#

23、 E8 P6 P* T9 o1 z strTWI.STATUS=TW_OK;新洁家园) E$ zj1 Z1 J /启动写命令后需要10ms(最大)的编程时间才能真正的把数据记录下来. b+ k o( Aj2 x /编程期间器件不响应任何命令3 + Z4 r M8 R 7 f( q; o1 F6 B. N, z* d9 m . e( l$ w; ! * S) d9 y机械、电子电气、编程技术 0 T! I+ l( X( F- G5 7 l3 b /写数据失败% : C. E3 h% 2 ?9 p: m state=ST_FAIL;$ N* K# d* J# E# b8 0 c - w4 N R3

24、 I break;# ; F9 & m) b8 d) |( a新洁家园 default:9 s* N3 E w& V% M4 T2 b8 /错误状态: j6 * H8 u# e6 x, | 5 s机械、电子电气、编程技术 state=ST_FAIL;机械、电子电气、编程技术( G$ j* y2 b, # l3 ? break;, Z/ V ?& b. P * W0 B% R- h! F9 o if (state=ST_FAIL)9 a8 g m3 g/ b& m, A% . Y /错误处理; X- 2 j9 U7 4 l+ ?; a& w% U$ L strTWI.FAILCNT+;* a/

25、V+ w! s0 G( X8 D. W if (strTWI.FAILCNTFAIL_MAX)$ B- z8 X( u0 k# b新洁家园 /重试次数未超出最大值,* u _8 j X8 S7 c# q% ?% j TWCR=(1TWSTA)|TW_ACT; /发生错误,启动start信号3 M o( J5 U7 h! l. p0 r ! R4 N- k0 C7 else机械、电子电气、编程技术3 W1 j8 rv# o Q& N$ J: # w /否则停止+ ?! A( Xv1 c7 H2 c TWCR=(1TWSTO)|TW_ACT; /发送停止信号,不会再产生中断了机械、电子电气、编程技术 / 2 ?- e1 R$ z. G0 ? strTWI.STATUS=TW_FAIL;1 D5 g# A U( B7 s 6 7 d t- V* u) K; v- W+ 5 j7 U$ A: 9 a& f, H机械、电子电气、编程技术 state+;. O# W: L3 W# J, T5 K T3 G strTWI.STATE=state; /保存状态# % A- E5 $ i& H1 b( k! A6 l9 |0 _- U3

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 工作报告

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com