历史上的今天

今天是:2024年11月07日(星期四)

正在发生

2019年11月07日 | AVR单片机的TWI中断模式

发布者:星尘之泪 来源: 51hei关键字:AVR单片机  TWI  中断模式 手机看文章 扫描二维码
随时随地手机看文章

使用AVR单片机内部的TWI功能,并采用中断工作模式,可以很好的使用Atmega系列的内部资源,并提高程序的稳定性;

#include


unsigned char i2c_sla;

unsigned char i2c_addrh,i2c_addrl;

unsigned char i2c_wr;

unsigned char i2c_sub_flag;

unsigned char i2c_num;

unsigned char *i2c_buf;

unsigned char i2c_end;


/***********************************************************************************************************************************************************************

函数名称:interrupt [TWI] void twi_isr(void)

函数功能:i2c底层中断处理函数(时钟SD2201和AT24C256共同的)

***********************************************************************************************************************************************************************/

interrupt [TWI] void twi_isr(void)

{


     unsigned char i2c_sta,tmp = 0;

     i2c_sta = TWSR;

     switch(i2c_sta)

     {

          case 0x08:

                   if(i2c_sub_flag == 1)

                   {

                        TWDR = i2c_sla&0xfe;

                   }

                   else

                   {

                        TWDR = i2c_sla;

                   }

                   //TWCR &= 0xcf;

                   //TWCR |= 0x80;

                   TWCR = 0x85;

                   break;

          case 0x10:

                   TWDR = i2c_sla;

                   //TWCR &= 0xcf;

                   //TWCR |= 0x80;

                   TWCR = 0x85;

                   //i2c_sub_flag = 1;

                   break;

          case 0x18:

                   if(i2c_sub_flag == 0)

                   {

                        if(i2c_num > 0)

                        {

                             TWDR = *i2c_buf;

                             //TWCR &= 0xcf;

                             //TWCR |= 0x80;

                             TWCR = 0x85;

                             i2c_buf++;

                             i2c_num--; 

                        }

                        else

                        {

                             //TWCR &= 0xdf;

                             //TWCR |= 0x90;

                             TWCR = 0x95;

                             i2c_end = 1;

                        }

                   }

                   if(i2c_sub_flag == 1)

                   {

                        TWDR = i2c_addrh;

                        //TWCR &= 0xcf;

                        //TWCR |= 0x80;

                        TWCR = 0x85; 

                        i2c_sub_flag = 2;

                   }

                   break;

          case 0x28:

                   if(i2c_sub_flag == 3)

                   {

                        if(i2c_wr == 0)

                        {

                             if(i2c_num > 0)

                             { 

                                  

                                  TWDR = *i2c_buf;

                                  i2c_buf++;

                                  //TWCR &= 0xcf;

                                  //TWCR |= 0x80;

                                  TWCR = 0x85;

                                  i2c_num--; 

                             }

                             else

                             {

                                  //TWCR &= 0xdf;

                                  //TWCR |= 0x90;

                                  TWCR = 0x95;

                                  i2c_end = 1;

                             }

                        }

                   }

                   if(i2c_sub_flag == 2)

                   {

                        TWDR = i2c_addrl;

                        //TWCR &= 0xcf;

                        //TWCR |= 0x80;

                        TWCR = 0x85;

                        i2c_sub_flag = 3;

                   }

                   

                   if(i2c_sub_flag == 3)

                   {

                        if(i2c_wr == 1)

                        {

                             //TWCR &= 0xef;

                             //TWCR |= 0xa0; 

                             TWCR = 0xa5;

                        }

                   }

                   if(i2c_sub_flag == 0)

                   {

                        if(i2c_num > 0)

                        {

                             TWDR = *i2c_buf;

                             //TWCR &= 0xcf;

[1] [2] [3]
关键字:AVR单片机  TWI  中断模式 引用地址:AVR单片机的TWI中断模式

上一篇:M16单片机l红外线解码程序+led数码管显示
下一篇:单片机AD接收UART发送模块电路图PCB与vb上位机源码

推荐阅读

11月5日,美国商用无人机公司PrecisionHawk宣布收购Uplift Data Partners,这已经是该公司在2108年内的第五次收购。其它四次分别是今年的三月收购Droners和AirVid,今年九月收购Hazon和InspecTools,其中Hazon和InspecTools分别专注于为公用事业和可再生能源市场开发无人机和技术服务。而此次收购的Uplift Data Partners是一家为建筑与设施管理行业无...
对于新能源从来就不止电力这一种形式,而电力在汽车上的应用也从来就不止电池这一种,为了突破人们对于新能源汽车的刻板印象,兰博基尼和麻省理工合作打造了一款用于电动汽车的超级电容器。超级电容器比目前的电池技术更稳定、容量也更大。麻省理工学院和兰博基尼三年前开始一起研究超级电容器,目前这项技术已经开始应用在了一些限量版的车型中,而现在工...
现在有不少爱好者手上有数字万用表,但却没有测量温度的功能。这里向大家介绍一种DIY温度测量仪,其测量精度±0.1℃,测量范围-10~110℃。该温度计用途广泛。测量准确,读数直观,温度时间响应快。是家庭和监控温度的好帮手。以下介绍具体的制作方法。一、材料1.外壳 旧遥控器外壳1只,按照图2的样子在底盖上打两个发光二极管孔、1个电源开关孔、1个调...
摆脱芯片供应短缺问题 双芯片代工策略见效 11月4日,高通股价飙涨逾12%,相较同业,高通在面对芯片更显得心应手,并看好明年业绩将持续成长。 高通执行长 Crisano Amon 于电话会议上表示,预计12月底供应问题将明显好转,明年下半年将有足够的供应满足需求,预期 2022财年EPS有望年增20%。 Lily点评:芯片短缺一直影响5G手机的出货量。高通作为全...

史海拾趣

问答坊 | AI 解惑

求高手分析下面这个电路

c11,是信号耦合作用,这个我知道,R23,R39,R40,C32这几个元件的作用是什么?越详细越好 谢了!…

查看全部问答∨

matlab第五课预告

主要将符号表达式 主要内容 符号表达式的微分,几分,绘图,符号方程的求解 等等吧…

查看全部问答∨

运放~~模电的重点

本帖最后由 paulhyde 于 2014-9-15 09:17 编辑 运放~~模电的重点~~~~~~~~~~~~~~~~~~  …

查看全部问答∨

集成电路封装概述

集成电路封装概述…

查看全部问答∨

集成RF混频器与无源混频器方案的性能比较

摘要:本应用笔记比较了集成RF混频器与无源混频器方案的整体性能,论述了两种方案的主要特征,并指出集成方案相对于无源方案的主要优点。 过去,RF研发人员在高性能接收器设计中使用无源下变频混频器取得了较好的整体线性指标和杂散指标。但在这 ...…

查看全部问答∨

Pause trigger

Pause Trigger,它根据触发信号的电平来决定是否执行采集,也就是说可以在采集开始后暂停或继续采集. 可以在时钟属性中设置这种方式。一般需要采用外部时钟或计数器时钟。…

查看全部问答∨

请介绍一下SD卡(SDIO接口)的PIN脚

什么地方有SD卡(SDIO接口)的PIN脚描述?(电源PIN,数据时钟PIN等)…

查看全部问答∨

vs2005开发环境,C#语言开发的pda程序怎么不能操作sqlce2.0数据库怎么办

    我现在做的pda程序就是要操作sql ce2.0,但是用的vs2005和c#语言开发的程序好像不能操作它(能操作3.0)。     我现在数据库是不能动了,只能想办法来操作这个数据库,听说vs2003+c#是可以操作sql ce2.0数据库的,除了这 ...…

查看全部问答∨

关于触摸屏校准

我现在的触摸屏已经可以响应点击,在中断处理程序中也已经可以取得触摸屏控制器采样的电压值了(分别对应x和y) 我想请问大家,怎样让这两个电压值和lcd的坐标对用起来? …

查看全部问答∨

急求人才!!!

大家好!我这里是北京的猎头公司,现有几十个通信方面的职位虚席以待!请有意者与我联系,如果适合我们会及时为您做推荐,即使您现在没有这方面的意向,我觉得您跟我们联系对您来说也绝对不是什么坏事!至少我们可以根据您的简历及时向您提供适合的 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved