历史上的今天
返回首页

历史上的今天

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

正在发生

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

2019-11-07 来源:51hei

使用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;

推荐阅读

史海拾趣

Gem Asia Enterprise Co Ltd公司的发展小趣事

面对电子行业供应链复杂多变的挑战,Gem Asia积极实施供应链优化和数字化转型战略。公司引入先进的ERP系统和物联网技术,实现了从原材料采购、生产制造到物流配送的全链条数字化管理。这一举措不仅提高了生产效率和产品质量,还降低了运营成本,增强了企业的市场竞争力。同时,Gem Asia还加强了与上下游企业的合作,共同构建了一个高效协同的供应链生态系统。

CALMIRCO公司的发展小趣事

CALMIRCO公司自成立以来,一直致力于电子技术的研发与创新。在公司发展初期,CALMIRCO团队便成功研发出一款具有划时代意义的智能芯片,该芯片在性能和稳定性上均达到行业领先水平。这一技术突破不仅为CALMIRCO公司赢得了大量市场份额,更推动了整个电子行业的进步。此后,CALMIRCO公司继续加大研发投入,不断推出创新产品,引领行业变革。

AVX公司的发展小趣事

XXXX年,AVX公司迎来了一个重要的转折点,它与日本Kyocera公司达成了战略合作。这次合作使AVX在技术上获得了强大的支持,并在市场上获得了更广阔的发展空间。通过整合双方的优势资源,AVX在贴片陶瓷电容、连接器等领域取得了显著的成绩,进一步巩固了其在电子元件市场的地位。

倍思特(BEST)公司的发展小趣事

XXXX年,AVX公司迎来了一个重要的转折点,它与日本Kyocera公司达成了战略合作。这次合作使AVX在技术上获得了强大的支持,并在市场上获得了更广阔的发展空间。通过整合双方的优势资源,AVX在贴片陶瓷电容、连接器等领域取得了显著的成绩,进一步巩固了其在电子元件市场的地位。

Alorium Technology公司的发展小趣事

AVX公司的历史可以追溯到XXXX年,当时它由一群热衷于电子技术的工程师创立。在创立初期,AVX主要专注于电容器的研发与生产,凭借其独特的技术和卓越的品质,很快在市场中脱颖而出。随着业务的扩展,AVX逐渐在电感器、电阻器等领域也取得了显著进展,为公司的后续发展奠定了坚实的基础。

Capital Advanced Technologies公司的发展小趣事

随着产品技术的不断升级和完善,CAT开始积极寻求市场拓展的机会。公司不仅在国内市场取得了显著的成绩,还逐步打开了国际市场的大门。CAT的产品远销海外,赢得了全球客户的信赖和好评。同时,公司还注重品牌塑造,通过参加国际电子展会、举办技术研讨会等方式,不断提升品牌知名度和影响力。

问答坊 | AI 解惑

现在貌似找工作时都没要求同时得会arm和fpga

如果同时掌握了arm和cpld会不会有所帮助? 来自EEWORLD合作群:arm linux fpga 嵌入0(49900581)群主:wangkj…

查看全部问答>

记录波形

1、  想把一个时间段的波形录制下来再看,或者传到电脑上进一步分析,有没有这样的示波器?或者有这样功能的仪器叫什么,大家有用到的介绍下…

查看全部问答>

求ADC0809资料,电路图或小程序

那位大哥有的话发一个到我邮箱行吗?谢谢! sodik@126.com…

查看全部问答>

sigmatel 9200 HD 声卡没有混音功能怎么办

能够记录机器里面播放的声音,或者使用麦克可以录音,但就是不能同时实现卡拉ok混音功能。怎么办,网上找到的补丁都用过了,就是不能用混音。 高手在哪里?…

查看全部问答>

单片机通信能发送浮点数据吗?

请问各位经过AD转换后存放在单片机里的浮点数据,要发送给其他单片机,需要把浮点转换成字符型或其他型数据吗?如果要转换,算法是什么?谢谢指点!…

查看全部问答>

NDIS的一点疑问?

我的是一个协议层驱动,有个疑问就是 A.使用CreateService,OpenService,QueryServiceStatus及StartService等一系列API安装起来的驱动 B.使用Inf文件及INetCfg的COM接口安装的驱动 问题是 1.这两种方式有什么不同? 2.为什么A安装后\"本地连接\" ...…

查看全部问答>

当我开辟一个大的数组到外部sram,lcd就不能正常显示了

我现在做图片解码显示,用的是ze的片子,我开辟了的一个大的数组在sram里,请放心这个数组确实在外部,我去过地址查看,0x6800xxx位置,现在的问题是,我如果把这个数组开辟的小一点,比如几百字节,lcd显示正常,开辟大来人比如几百k &n ...…

查看全部问答>

全国电子设计竞赛A题交流群101126312

本帖最后由 paulhyde 于 2014-9-15 04:03 编辑 全国电子设计竞赛A题交流群101126312  …

查看全部问答>

TI课堂进不去

上周学习了前三讲,后面的几次课就没有办法进去了,登陆不上去,不知怎么解决…

查看全部问答>

【TI课程ppt】开关电源组件选择

开关电源组件选择 开关电源组件选择 (Switch-Power-Supply-Component-Selection) 开关电源深入浅出之设计选型篇,作为能量转换的装置-电源,此篇告诉你想了解的储能元器件类型和如何选择,理解并能优化选择电容和电感 课程大纲: 拓扑敏感回路 ...…

查看全部问答>