AVR TWI读范例程序3451.docx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《AVR TWI读范例程序3451.docx》由会员分享,可在线阅读,更多相关《AVR TWI读范例程序3451.docx(27页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、AVR TWI读写范例程序(AT24C02)3 b$ X8 q+ B0 本程序简单的示范了如何使用ATMEGA16的TWI 读写AT24C02 IIC EEPROM TWI协议 (即IIC协议,请认真参考IIC协议的内容,否则根本就不能掌握)! P0 X! f$ |; X9 & |/ u. J$ g机械、电子电气、编程技术 一主多从的应用,M16作主机$ R! R, n WT (M16做从机和多主多从的应用不多,请自行参考相关文档)0 w; C* q( h+ w$ : e9 7 中断模式 (因为AVR的速度很高,而IIC的速度相对较低, 采用查询模式会长时间独占CPU,令CPU的利用率明显下降
2、。% q- s7 M8 qP( p) o 特别是IIC速度受环境影响只能低速通讯时,对系统的实时性产生严重的影响。 查询模式可以参考其它文档和软件模拟IIC的文档)9 e5 Q! pa H5 j9 I8 R# M) y AT24C02/04/08的操作特点- # 6 N+ i- K新洁家园出于简化程序考虑,各种数据没有对外输出,学习时建议使用JTAG ICE硬件仿真器& o: U$ M+ J9 L) c! R& F0 A8 - L: O+ d; k- J& y7 O7 q8 D, m/ x# D机械、电子电气、编程技术#include #include #include #include 4
3、n: U+ : f) |+ c) |新洁家园/时钟定为外部晶振7.3728MHz,F_CPU=7372800#include /定义了各种模式下的状态码列表(TWSR已屏蔽预分频位),本文后面附上中文描述 i: T7 n2 T0 |1 r) 8 ?机械、电子电气、编程技术/管脚定义* D) h/ F# s2 Y0 P9 h2 # d2 #definepinSCL 0 /PC0 SCL#definepinSDA 1 /PC1 SDA+ H2 M7 K0 I! G; U1 D- G/ B/为保险起见,最好在SCL/SDA接上110K的外部上拉电阻到VCC。4 % f* 3 W. O* U#defi
4、ne fSCL 100000 /TWI时钟为100KHz/预分频系数=1(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
5、; q#define TW_ACT (1TWINT)|(1TWEN)|(1TWIE) P: a) a3 a5 X, M# H p9 D/TWCR只能IN/OUT,直接赋值比逻辑运算(|= &=)更节省空间fq, v& d( P5 p2 |新洁家园#define SLA_24CXX 0xA0 /24Cxx系列的厂商器件地址(高四位)#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;
6、 /考虑了24C04/08的EEPROM地址高位放在SLA里面( v! o1 M0 1 q( M) o8 0 D9 strTWI.SLA=sla+i;: fk# u- u% H! d1 n- V机械、电子电气、编程技术 strTWI.ADDR=addr; 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; TWCR=(1=0x60)|(status=
7、0x00) /总线错误或从机模式引发的中断,不予处理 return;4 * W; b/ c8 py( L switch(state) ; m/ f8 r. N8 T5 A ?6 S. E% O B新洁家园 case ST_START: /START状态检查 if(status=TW_START) /发送start信号成功; j: , v6 j: M* u I TWDR=strTWI.SLA&0xFE; /发送器件地址写SLAW TWCR=TW_ACT; /触发下一步动作,同时清start发送标志 ! U& |( Y, P; x else /发送start信号出错 state=ST_FAIL;
8、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) /发送器件地址成功 TWDR=strTWI.ADDR; /发送eeprom地址4 F$ a8 L# J/ l 1 新洁家园 TWCR=TW_ACT; /触发下一步动作 else T, q- m4 f5 p- y. ; F /发送器件地址出错 state=ST_FAIL;+ p/ 6 A. ) n* B n a机械、电子电气、
9、编程技术 l- J& U% Q. l8 P break;+ : o! X+ V/ u4 H* A case ST_WADDR: /ADDR状态检查 if(status=TW_MT_DATA_ACK) /发送eeprom地址成功 if (action=TW_READ)3 N5 O& k4 z5 q% Q, c, 8 9 | /读操作模式 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 /写操作模式
10、* S$ G4 y3 r3 s. _! m8 2 P* m新洁家园 TWDR=*strTWI.pBUF+; /写第一个字节, j: 6 s; |7 H- strTWI.DATALEN-;6 s( I: y, 9 Z( N4 |: G; 机械、电子电气、编程技术 state=ST_WDATA-1; /下一步将跳到WDATA分支 TWCR=TW_ACT; /触发下一步动作 R0 a$ e, l1 U8 S# u+ E e8 I* a$ 4 f8 # d9 n机械、电子电气、编程技术 else% n, z6 n 1 + r /发送eeprom地址出错 state=ST_FAIL; + g5 q/ L
11、+ 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) /发送restart信号成功 TWDR=strTWI.SLA; /发器件地址读SLAR TWCR=TW_ACT; /触发下一步动作,同时清start发送标志 else , i: n1 C) /重发start信号出错8 U5 k% Os: T* i/ n. N+ w state=ST_FAIL;$ g$ y6 w7 W) o机械、电子电气、编程
12、技术 break; case ST_SLAR: /SLAR状态检查,只有读操作模式才能跳到这里4 L6 kb+ & u+ y* w机械、电子电气、编程技术 if(status=TW_MR_SLA_ACK)$ b, K0 ?% B8 | /发送器件地址成功& J: ow! S0 D a# Mm* X) M新洁家园 if (strTWI.DATALEN-) /多个数据; h/ j- g7 P$ r) I* u4 B/ D! | TWCR=(1TWEA)|TW_ACT; /设定ACK,触发下一步动作 else- k* F/ ) w, f( ?! f; l机械、电子电气、编程技术 /只有一个数据 TW
13、CR=TW_ACT; /设定NAK,触发下一步动作4 b. ( Q$ k, D8 K6 2 $ 1 y6 o$ S1 q7 b2 y( y$ R机械、电子电气、编程技术 else /发送器件地址出错9 b; Yl6 P2 cY6 7 t新洁家园 state=ST_FAIL; 3 Q% A. 7 I! T( d, break; case ST_RDATA: /读取数据状态检查,只有读操作模式才能跳到这里 state-; /循环,直到读完指定长度数据6 9 1 F: N% B- X C if(status=TW_MR_DATA_ACK)3 |) - M& V% i% Q3 X! u /读取数据成功
14、,但不是最后一个数据 *strTWI.pBUF+=TWDR;# v6 z, z. k9 w+ J O4 v if (strTWI.DATALEN-) /还有多个数据 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机械、电子电气、编程技术 else# V% w j1 P+ R5 ! L# o /准备读最后一个数据 TWCR=TW_ACT; /设定NAK,触发下一步动作, w- n& % b* r7 c7 e/ h新洁家园 4 w; 3
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AVR TWI读范例程序3451 TWI 范例 程序 3451
![提示](https://www.deliwenku.com/images/bang_tan.gif)
限制150内