欢迎来到课桌文档! | 帮助中心 课桌文档-建筑工程资料库
课桌文档
全部分类
  • 党建之窗>
  • 感悟体会>
  • 百家争鸣>
  • 教育整顿>
  • 文笔提升>
  • 热门分类>
  • 计划总结>
  • 致辞演讲>
  • 在线阅读>
  • ImageVerifierCode 换一换
    首页 课桌文档 > 资源分类 > DOCX文档下载  

    AVR TWI读范例程序.docx

    • 资源ID:1678005       资源大小:36.86KB        全文页数:11页
    • 资源格式: DOCX        下载积分:5金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要5金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    AVR TWI读范例程序.docx

    AVRTWI读写范例程序(AT24C02)本程序简单的示范了如何使用AnHgU6的NI读写AT24C02IICEEPROMUiW(即I1.C协议,谛认克参考IIC汾议的内容,否则根本就不能掌握)一主多从的应用,M1.6作主机(M16做从机和多主多从的应用不多,请自行参考相关文档)中断模式(因为IWR的速度很高,而I1.C的速度相对较低.采用查询模式会长时间独占CP1.I,令CP1.I的利用率明显下降.特别是UC速度受环境影响只能低速通讯时,时系统的实时性产生严笊的影响.杳询帙式可以参考其它文档和软件模拟IIC的文档AT24C02/04/08的操作特点出于简化程序考虑,各种数据没有对外输出.学习时建议使用JTAGICE硬件仿真零"inc1.ude<avrio.h>inc1.ude<avtsina1.h>Sinc1.ude<avrinterrupt.h>Rinc1.ude<avrde1.ay.h>时钟定为外部晶振7.3728MHz,FCPU=7372800JJinc1.udo<cmpattwi.h>定义了各种模式下的状态眄列表(TWSR已屏蔽预分频位),本文后面附上中文描述管脚定义definepinSC1.0/PCOSC1.8definepinSDA1/PC1.SDA为保险起见,见好在SCUSDA接上10K的外部上拉电皿到YCaRdefinefSC1.100OOO/TUI时仲为100KIIz预分频系数=I(TWPS=Q)#if叱CPU<fSC1.*36Sdefine1WBR_SET10;/TIBR必须大于等于10Ke1.se"defineTffBR-SET<F_CPU/fSC1.-16)/2;/计算RBR值#ondifSdefineP1.ACT(1<<TWINT>(1<<TWEN)(1<<TWIE)/TWCR只能IwoIJT,直接赋值比逻辑运算(=&=)更节省空间SdefineS1.A_24CXXOxAO2ICXX系列的厂商器件地址(高四位)defineADDR_24C020x00/AT21C02的地址线A2/1/0全部接地,S1.V*-OxAO*OxOO<<1.OxOO.S1.R-OxO*OxOO<<POx01/TIH_操作状态defineTI_B15Y0defineTI_OK1SdefineTIM1.2m_读写命令状态UdefineOPBuSY0SdefineOP_R1.N/TWI读写操作公共步骤CdfineST-FAI1.SdefineST-STARTRdefineST-S1.AWSdefineSTIADDR/TWI试操作步骤SdefineSTRESTARTRdnfineST_S1jRSdefineST-RDATA/TWI与操作步骤5defineSTWDTRdofineFAn-YAX0出错状态1 START状态检查2 /S1.AB状态检查3 /APDR状态检森4 RESTART状态检查5 /S1.AR状态检近6读取数据状态检杳,循环n字节7 写数据状态检查,循环n字节20 里试次数最大值定义全局变量unsignedchnr0RGDAT8-0xAA,0x5,0x5S,0x5At0x01,0x02,0x03,0x(M>原始数据unsignedcharCMPDATA8j;/比较数据unsignedcharB1.:FFER256;缓冲区,可以装载整个AC21C02的数据structStrJWI/TWI数据结构(vo1.ati1.eunsignedcharSTATUS;/'TW1_操作状态unsignedcharS1.A;/从设篝的器件地址unsignedi11tM)R:/从设备的数据地址unsignedchar*pM.,F:数据缓冲区指针unsignedintDATA1.EN;数据长度unsignedcharSTATE:PH读写操作步骤unsignedcharFAI1.CfJT;失败重试次数);structStJTW1.StrWI;TW1.的数据结构变瘠仿文时在watch窗口,监控这些全局变地。/AT24C02的读写照数(包括随机读,连续流,字节写,页写)/根据S1.a的最低位决定(由中断程序中判断)/ZbitO=ITW-READ读/ZbitO=OTW_WRJTE写/SIa器件地址(不能搞错)/addrEEPRoM地址(01023)/*ptr读写数据腹冲区/Ien读数据长度(厂1024),写数据长度(1or8or16)/返I可伯是否能执行当前操作unsignedcharTW1.RW(unsignedchar$1.a,unsignedintaddr,unsignedchar*>tr,unsignedint1.en)unsignedchari:if(strT,1.STAwS=II1.B1.SY)TWI忙.不能进行操作returnOP_BUSY;StrTWI.STAToS=TWBUSY:i=(addr>>8)<<1.:i=0x06:考虑了24C(M/08的EEPROM地址高位放在S1.A里面StrTWI.S1.A=s1.a+i;StrTWI.ADDR=addr;StrIW1.pB1.F=Ptr:StrTWI.DATA1.EN=Ien;StrTW1.STATE=ST-START:StrTW1.FAI1.CNT=O;TICR=(Km1STA)!TW-ACT;启动Start信号returnOP_RUN;)*TWI中断函数这个函数流程只是考虑了器件地址后有一个字节数据(命令)地址的I1.C器件(大局部IK接口器件都是这种类型,常见的例如AT2ICO"0201081.6,DS1307,DS1721等)对于有两个字节数据地址的IIC器件(例如AT24C32/64/128/256等大容量EEPROM),请稍作改动根据strT,I.S1.A的最低位决定/bit=1.TW_READ读/ZbitO=OTW_WR1TE写虽然中阍效劳程序很长.但每次只执行一个case.所以耗时并不长./S1.GNA1.(SIG_2WIRE_SER1.A1.)I1.C中断unsignedcharaction,state,status;action=str1*1.S1.AtTW_RKAD;取操作模式State=StrTWI.STATE;SIa1.US=TwSR&0xF8;屏蔽预分频位if(status>=0x60)I(status0x00)(总线错误或从机模式引发的中断,不予处理return;switch(state)(caseST_START:/START状态检i5if(Siaius=TI-START)/发送Stf1.rt信号成功IWDR=StrTWI.S1.OxFE;/发送器件地址写S1.AWTwCR=111.AC;触发下一步动作,同晡清SIart发送标忐e1.se(发送Start信号出错state=ST_FAI1.:break:caseST_S1.AW:/S1.AW状态检克if(statusTB_MT_S1.A_ACK)(发送器件地址成功TWDR=StrTW1.ARDR:发送eeprom地址IWCR=TIACT:触发下一步动作e1.se(发送器件地址出错Statc=ST-FAI1.:break:caseSTJMDDR:/AM)R状态检杳if(status=!T_MT_DATA_ACK)/发送eeprom地址成功if(actiOn=TIi1.READ)(读操作模式TWCR=(KOWSTR)TW_ACT:"发送restart信号,下一步将跳到RESTART分支)e1.se(写操作模式TWDR=*str7W1.BUF+:写第一个字节StrTW1.DATA1.EN-:state=ST_UI)ATA-1.;下一步格跳到IDATA分支TWCR=D1.ACT:触发下一步动作e1.se(发送eeprom地址出错Siate=S1.FAI1.:)break;caseSTRESTART:RESTART状态检食,只有读操作模式才能跳到这里if(sia1.US=U-REP-STARn/发送restart信号成功IWDR=StrTW1.S1.A:发器件地址说S1.ARMR=TrACF;触发下一步动作,同时酒Start发送标志)e1.se(/重发Start信号出错State=ST-FAI1.:break:CaSeST_S1.AR:S1.AR状态检查,只有读操作模式才能跳到这里if(status=11_MR_S1.A_ACK)(发送器件地址成功if(strTII.RATA1.EN-)(多个数据TwCR=TWEA)!TW_ACT:设定RCK,触发下一步动作e1.se(只有一个数据三RTW,CT:设定MK.触发下一步动作e1.se(发送器件地址出爆State=ST-FAI!.:break:caseS1.RDATA:读取数据状态检查,只有该操作模式才能跳到这里state-:循环,直到读完指定长度数据ifStatus=TINR_DATA_ACK)读取数据成功,但不是最后一个数据*strTWI.PB1.iFi=TWDR;if(StrTI1.DATA1.EN-)(还有多个数据TUR=(1<<7WE)ITW_ACT:设定RCK,触发下一步动作)e1.se(/旅备读最后一个数据TWCR=7W_ACT;设定NAK.触发下一步动作1e1.seif(Status=TWJIR-DATA-NACK)已经读完Ja后一个数据"StrTW1.pBUF-TWDR;IWCK=(K<TiSTO)B,AC:发送停止信号,不会再产生中断了sir1111,Statcs=P1.OK;e1.se(读取数据出错State=ST-FAI1.:break:caseSTWDATA:写数据状态检查,只有写操作模式才能跳到这里State-;循环,宜到写完指定长度数据if(sia1.us="1.DATA_ACK)/写数据成功if(strTBI.DATAI.EN)(还要写TWI)R=*stHW1.pBUF+;StrTW1.DATA1.EN-:TwCaTW_ACr;触发下一步动作1e1.se(写装了TR=(1<<T*'STO)TWACT:发送停止信号,不会再产生中断了StrIW1.STATUS=IT1.OK;启动写命令后需要IoBS(最大)的编程时间才能真正的把数据记录下来编程期间案件不响应任何命令)e1.se(写数据失败stutc=ST_FAI1.:1break;defau1.t:播误状态state-ST_FAI1.;break:if(state=ST_FAI1.)(情误处理StrTtt1.FAI1.CNT+;if(strT»I.FAI1.CNT<FI1.J!AX)(重试次数未超出鼓大值,TWCR-(1<<7WSTA)TiJCT:发生错误,启动Start信号e1.se(否则停止IWCR-(1<<IWSTO)T>_ACT:发送停止信号.不会再产生中断广Strn1.STAT1.S=TU1.FAI1.;state*+;StrTW1.STATE=State;保存状态)intmain(void)(unsignedchari;上电默认M)RX=QX00,PORTX=OXOo输入,无上拉电阻Porta=OxFF:不用的管脚使能内部上拉电阻。PORTB=OXFF:P0RTC=0xFF;/SC1.,SDA使能了内部的IOK上拉电阻预分频=OF=I主机模式,该地址无效关闭W模块使能全同中断PoRTD-OXFF:/TI初始化TISR=OxOO;TBBR=TWRSET:TiAR-OxOO;TICR=OxOO:sci();StrTW1.STAKIS=T*0K:T»I_RB(S1._24CXX«(ADDR_24C02«1.)»TWWRITE,0x10,i0RGDT0,8):/从OXIO地址开始写入8个字节数据whi1.e(strTWI.STATUS=71_BUSY);等待操作完成if(S1.rTW1.STAT1.S=ITJAI1.)(操作失败?_de1.ay_BS(10):延时等恃编程完成WhiIea)(i=T*1.RW(S1.A24CXX+(APDR_24CO2«1)÷11READ,Ox1.O,ftO1.1.,DATA0,8):从0x10地址开始读出8个字节数据Whi1.e(StrTT11.STATUS=TW_BUSY);等待操作完成如果不加等待,则需要检测返I可伯i才能知道当前悚作是否执行了/0OP_B1.:SY之前的操作没完成,没执行当前操作/1OP_RUN当前操作执行中if(strTII.STAT1.S-T1.FAn.)(操作失败?读取成功,比照ORGDATA和A1.PDATA的数据i=IW1.KW(S1.24CXX÷(IH)R24CO2<<1)÷TBREAD,0x0C.&W.WER0,256);从0x00地址开始读出256个字节数据(整个ATC2-1CO2)WhiIe(StrTII.STATUS=!*'.BUSY);等待操作完成/两线串行接口总线定义两税接口TW1.很适合于典型的处埋器应用.TttI协议允许系统设计者只用两根双向传输规就可以将】28个不同的设备互连到一起。这两根线一是时钟SC3一是数据SDA。外部谀件只需要两个上拉电阻,每根找上一个.所有连接到总线上的设备都(必须)有自己的地址.注意:就是说不能有两个相同地址的设备TWI协议解决了总战仲裁的问题。所有TWI兼容的涔件的总线驱动都是温板开路或集电极开路的.这样就实现了对接U操作非常关犍的线与功能.TWI器件输出为"0°时,TW1.总线会产生低电平.当所有的TWI器件输出为三态时,总战会输出高电平,允许上拉电阻将电压拉高,注意:为保证所有的总线操作但凡与TW1.总线连接的AVR零件必须上电.与总线连接的器件数I受如下条件限制:总城电容要低于100pF,而且可以用7位从机地址进行寻址.两个不同的标准,一种是总线速度低于100kHz,而另外一种是总线速度高达400kHz.SC1.和SDA引脚SC1.与SDA为MCU的TWI接口引脚,引脚的输出驱动器包含一个波形斜率限制涔以满足TWI标准.引脚的输入局部包括尖峰抑制单元以去除小于50ns的毛剌.当相应的箍U设置为SC1.与SDA引脚时,可以使能I/O口内部的IOK上拉电阻,这样可省掉外部的上拉电阻注意:如果要作高速通讯或者从机数以较张,以好还是外接适宜的上拉电阻比特率发生着单元T«I工作于主机模式时,比特率发生器控制时神佶号SC1.的网期.具体由TWI状态存放器TWSR的预分频系数以及比特率存放器TttBR设定。当TWI工作在从机模式时,不需要比照特率或预分频进行设定,但从机的CPU时钟频率必须大于TII时钟线SC1.频率的16倍.注意,从机可能会廷长SC1.低电平的时间,从而降低IMI总线的平均时钟冏期.SC1.的频率根据以下的公式产生;fSC1.=fCPU(16+2(T1.BR)(4'IWPS)TWBR-TW1.比特率存放渊的数值IMPS=TWI状态存放器预分翔的数值Note:WI工作在主机模式时,TiBR值应该不小于10,否则主时机在SDASC1.产生错误输出作为提示信号。网题出现于TW1.工作在主机模式下,向从机发送StartS1.A+R/W的时候(不需要真的有从机与总线连接).控制单元控制单元监听TW1.总线,并根据TWI控制存放器TWCR的设置作出相应的晌应.当TWI总线上产生需要应用程序干预处理的事件时,IM1.中断标志位TWINT置位.在下一个时钟周期,TW1.状态存放器TWSR被表示这个,"件的状态码字所更新。在其它时间里TWSR的内容为一个表示无事件发生的特殊状态字。-STWI1.tfT标志位ST1.".时钟线SC1.即被拉低,暂停TW1.总线上的数据传输,让用户程序处理事件.在以下状况出现时,IMINT标志位置位:?在TWI传送完START/REPEATEDSTART信号之后?在TW1.传送完S1.A+R/I数据之后?在IW1.传送完地址字节之后?在HH总线仲战失败之后?在T(H被主机寻址之后(播送方式或从机地址匹配)?在接收到一个数据字节之后?作为从机工作时,IWI接收到STOP或REPEATEDSTART信号之后?由于非法的START或STOP信号造成总爱错误时TWI存放器说明TWI比特率存放器一TUBR?Bits7.0-TWI比特率存放器TUBR为比特率发牛.落分领因子。比特率发生零是一个分短渊,在主机模式下产生SC1.时钟版率.比特率计算公式请见曲面的比特率发生器通元TWI控制存放器一TWCRTWCR用来控制TII操作.它用来使能N1.通过施加START到总规上来启动主机访问,产生接收器应答,产生SToP状态,以及在写入数据到TWDR存放器时控制总线的暂杵等.这个存放器还可以给出在HDR无法访问期间,试图将数据写入到TIDR而引起的写入冲突信息.?Bit7-TWINT:TSI中断标志当TW1.完成当前工作,希望应用程序介入时TWIyr置位。若SREG的I标志以及TWCR存放器的TWIE标志也置位,则MCU执行TWI中断例程.当”T览位时,SC1.信号的低电平被延长.I1.nNT标志的清等必须通过软件写F"来完成。执行中断时硬件不会自动将其改写为TT。要注意的是,只要这一位被清零,TWI立即开始工作.因此.在清客IWNT之前一定要首先完成对地址存放ZnWAR.状态存放器NSR,以及数据存放器NDR的访问。?Bit6-TUT-A:使能Tw1.应答TqEA标志控制应答肱冲的产生.若UBA议位,出现如下条件时接11发出ACX脓冲:1 .器件的从机炮址与主机发出的地址相符合2 .TWAR的IWCE置位时接收到播送呼叫3 .在主机/从机接收模式下接收到一个字节的数据物TWEA消室可以使器件区时脱窗总线.议位后器件JE新恢复地址识别,?Bit5-T*STA:TUISTART状态标志当CP1.带电自己成为总线上的主机时需要置位TWSTA.TWI硬件检测总线是否可用.若总战空闲,接口就在总线上产生START状态。若总线忙,接口就一口等待,点到检测到一个STOP状态,然后产生STRRT以声明自己希望成为主机。发送START之后软件必须清零TISTA.?Bit-TUSTIWISTOP状态标志在主机模式下,如果置位TWST0,TW1.接口将在总找上产生STOP状态,然后TWSTO自动清零。在从机模式下,SftTUSTOUJ以使接口从锚误状态恢更到未被寻址的状态.此时总线上不会有STOP状态产生,但TW1.返回一个定义好的未被浮址的从机模式且移放SC1.与SDA为高阻态.?Bit3-me:TWI写贷撞标志当TWNT为低时写数据存放器TWDR将置位TW>C,当NNT为高时,每一次对TWDR的写访问都将更新此标志.?Bit2-TWEN:TWI使能TWEN位用于使能TB1.操作与激活TWI接口.当TW心位被写为I"时,TWI引脚将I/O引脚切换到SC1.与SDA引脚,使能波形斜率限制器与尖蜂沌波器.如果该位清零,TWI接口模块将被关闭,所有TIn传输将被终止.?Bit0-TW1.E:使能TN中断当SREG的1以及TWIE次位时,只要T1.1.NT为"1",TII中断就激活.'i状态存放零一TqSR?Bits7.3-HS:TII状态这5位用来反映TWI逻辑和总线的状态。不同的状态代码将会在后面的局部描述。注意从TWSR读出的值包括5位状态值与2位预分嫉值.检测状态位时设计者应屏蔽预分肺位为F”,这使状态检测独立于预分物涔设置.?Bits1.0-TUPS:T>I预分嫉位这两位可读/写,用于控制比特率预分频因子.预分频系数为1的n次方计算比特率的公式见前面的比特率发生器单元TIn数据存放器一TWDR在发送模式,TWDR包含了要发送的字节;在接收模式,TWDR包含了接收到的数据。当IW1.接口没有进行移位工作(TBINT置位)时这个存放器是可写的.在第一次中断发生之前用户不能鲂初始化数据存放器.只要TTHNT商位,TWDR的数据就是稳定的.在数据移出时,总城上的数据同时移入存放器,TW)R总是包含了总线上舟现的最后一个字节,除非Mct是从掉电或省电模式被TW1.中断唤醒.此时TWDR的内容没有定义.总规仲裁失败时,主机将切换为从机,但总线上出现的数据不会丧失。ACK的处理由TW1.送轼自动管理,CPU不能直接访问ACK。?Bits7.0-TUD:TW1.数据存放渊根据状态的不同,其内容为要发送的下一个字节,或是接收到的数据.TW【(从机)地址存放器一TWRRTWAR的高7位为从机地址.工作于从机模式时,IWI将盘据这个地址进行响应”主机模式不需要此地址。在多主机系统中,TttAR需要进行设火以便其他主机访问自己。TUAR的1.SB用于识别播送地址(0x00)4器件内有一个地址比较器.一旦接收到的地址和本机地址一致,芯片就请求中断.?Bits7.1-TWA:TK1.从机地址存放JB其值为从机地址.?Bit0-T1.GCE:使能播送识别置位后Mc1.可以识别HH总线播送.使用TWIAVR的TII接口是面向字节和基于中断的.所有的总线事件,如接校到一个字节或发送了一个START信号等,都会产生一个T1.1.中断.由于TW1.接口是暴于中断的,因此TW1.接口在字节发送和接收过程中,不需要应用程序的干预.TUCR存放器的”1中断允许位TWIE和全局中断允许位I一起决定了应用程序是否响应HINT标志位产生的中断请求.如果TME被清率,应用程序只能采用轮沏HHNT标志位的方法来检测HH总线状态.当N1.NT标志位Wn”时,表示T1.n接口完成了当前的操作,等待应用程序的响应。在这种情况1.TWI状态存放港TWSR包含了说明当前Tw1.总线状态的值。应用程序可以读取TBCR的状态码.判别此时的状态是否正确,并通过设置T1.CR与TmR存放器,决定在下一个TH总觌周期TIr1.接口应该如何工作.各种模式卜的状态码列表(TISR己屏蔽颈分频位)twi.h里面有定义,现附上中文描述主机发送状态码RdefineT1.START0x08/START已发送SdefineT»_REP_START0x10曲复START己发送CdvfincTBMTS1.AACKSdefineTTMT_S1.A_NACKRdefine1.1._MT_DATA_ACKSdefineTVMT.RATA.NACKMefineTIYTARB_1.OST0x18/S1.A+I已发送收到ACK0x20/S1.*W已发送接收到NoTACK0x2«数据已发送接收到ACK0x30数据已发送接收到NOTACK0x38/S1.A7或数据的仲裁失败从发送状态码SdefineTI_ST_S1.A_ACK0xA8自己的S1.A4己羟被接收ACK已返回defineTISTARB1.OSTS1.A_ACKOxBOS1.A-RN作为主机的仲裁失败;自己的S1.A+R已经被接收ACK已返RdefineT>_STJ)ATA_AeK"defineT»_ST_DATA_NACKdefineTBST1.ASTDATAOxIW/T1.DR里数据已羟发送接收到ACKOxCO/TWPR电数据已经发送接收到NOTACK0xC8/IWDR的一字节数据已经发送(TwAE="0"):接收到ACKAT24C02/04/08IIC接口EEPRoM的特点(不同公司的2-1系列EEPROM特性有局部不同,请为考数据手册)1AT21C02/04/08是一个2K/4K/8K位串行Q1.OSE2PR0M内部含有256/512/1024个8位字节2AT24C02有一个8字节页写援冲器,AT24C01/08/16有一个16字节页写缓冲涔3通过器件地址输入端AO.A1.,A2可以实现招最多8个21C02器件4个24C04器件2个24C08帮件

    注意事项

    本文(AVR TWI读范例程序.docx)为本站会员(夺命阿水)主动上传,课桌文档仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知课桌文档(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-1

    经营许可证:宁B2-20210002

    宁公网安备 64010402000986号

    课桌文档
    收起
    展开