历史上的今天
返回首页

历史上的今天

今天是:2024年10月15日(星期二)

正在发生

2019年10月15日 | AVR单片机I2C总线程序

2019-10-15 来源:eefocus

#include "iom16v.h"


/*I2C总线主机模式错误处理*/

void error(unsigned char type) {


        switch (type & 0xF8) {

                case 0x20:                                        /*址址写失败*/

                        /*stop 停止*/

                        TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);

                        break;

                case 0x30:                                        /*数据写失败*/

                        /*stop 停止*/

                        TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);

                        break;

                case 0x38:                                        /*仲裁失败*/

                        break;

                case 0x48:                                        /*址址读失败*/

                        /*stop 停止*/

                        TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);

                        break;

                }

}


/*I2C总线单字节写入*/

unsigned char twi_write(unsigned char addr, unsigned char dd) {


        TWBR = 2;


        /*start 启动*/

        TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);

        while (!(TWCR & (1 << TWINT)));

        if ((TWSR & 0xF8) != 0x08) {

                error(TWSR);

                return 0;

                }


        /*SLA_W 芯片地址*/

        TWDR = 0xA0;

        TWCR = (1 << TWINT) | (1 << TWEN);

        while (!(TWCR & (1 << TWINT)));

        if ((TWSR & 0xF8) != 0x18) {

                error(TWSR);

                return 0;

                }


        /*addr 操作地址*/

        TWDR = addr;

        TWCR = (1 << TWINT) | (1 << TWEN);

        while (!(TWCR & (1 << TWINT)));

        if ((TWSR & 0xF8) != 0x28) {

                error(TWSR);

                return 0;

                }

        

        /*dd 写入数据*/

        TWDR = dd;

        TWCR = (1 << TWINT) | (1 << TWEN);

        while (!(TWCR & (1 << TWINT)));

        if ((TWSR & 0xF8) != 0x28) {

                error(TWSR);

                return 0;

                }

        

        /*stop 停止*/

        TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);

        return 1;

}


/*I2C总线单字节读取*/

unsigned char twi_read(unsigned char addr, unsigned char *dd) {


        TWBR = 2;


        /*start 启动*/

        TWCR=(1<        while(!(TWCR&(1<        if ((TWSR & 0xF8) != 0x08) {

                error(TWSR);

                return 0;

                }


        /*SLA_W 芯片地址*/

        TWDR = 0xA0;

        TWCR = (1 << TWINT) | (1 << TWEN);

        while (!(TWCR & (1 << TWINT)));

        if ((TWSR & 0xF8) != 0x18) {

                error(TWSR);

                return 0;

                }


        /*addr 操作地址*/

        TWDR = addr;

        TWCR = (1 << TWINT) | (1 << TWEN);

        while (!(TWCR & (1 << TWINT)));

        if ((TWSR & 0xF8) != 0x28) {

                error(TWSR);

                return 0;

                }

                

        /*start 启动*/

        TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);

        while (!(TWCR & (1 << TWINT)));

        if ((TWSR & 0xF8) != 0x10) {

                error(TWSR);

                return 0;

                }

        

        /*SLA_R 芯片地址*/

        TWDR = 0xA1;

        TWCR = (1 << TWINT) | (1 << TWEN);

        while (!(TWCR & (1 << TWINT)));

        if ((TWSR & 0xF8) != 0x40) {

                error(TWSR);

                return 0;

                }


        /*读取数据*/

        TWCR = (1 << TWINT) | (1 << TWEN);

        while (!(TWCR & (1 << TWINT)));

        if ((TWSR & 0xF8) != 0x58) {

                error(TWSR);

                return 0;

                }

        *dd = TWDR;

                

        /*stop 停止*/

        TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);

        return 1;

}


推荐阅读

史海拾趣

Deutronic Elektronik GmbH公司的发展小趣事

为了进一步提升竞争力,Deutronic Elektronik GmbH开始实施全球化战略。公司在美国和中国设立了子公司,并通过并购等方式加强了在欧洲和亚洲市场的布局。这些举措不仅增强了公司的市场影响力,还为公司带来了更多的资源和优势。通过全球化战略的实施,Deutronic Elektronik GmbH逐渐成为一家具有全球影响力的电子科技企业。

DCD [Digital Core Design]公司的发展小趣事

DCD公司自创立之初,就专注于数字核心设计领域的研发。创始人们凭借对电子技术的深刻理解和市场需求的敏锐洞察,带领团队攻克了一个又一个技术难关。在产品研发初期,公司面临着资金短缺和技术难题的双重压力,但团队凭借着坚韧不拔的精神,成功研发出了首款具有竞争力的数字核心设计产品,为公司的发展奠定了坚实的基础。

Good-Ark公司的发展小趣事
根据实际需要调整电路的灵敏度,避免因为环境因素(如风声、雨声等)引起误报。
HI Microwave Technology Limited公司的发展小趣事

人才是企业最宝贵的资源。HI Microwave高度重视人才培养和团队建设,通过引进和培养高素质的技术人才和管理人才,不断提升企业的核心竞争力。公司建立了完善的人才激励机制和培训体系,鼓励员工不断学习和创新。同时,公司还注重营造和谐、开放的企业文化氛围,激发员工的积极性和创造力。这些措施为公司的持续发展提供了有力的人才保障和智力支持。

E-Mark Inc公司的发展小趣事

GHI公司一直致力于提升产品品质和安全性。为了进入欧洲高端市场,GHI公司决定对其核心产品进行E-Mark认证。在认证过程中,GHI公司不断完善质量管理体系,提升生产工艺水平,确保产品质量的稳定性和可靠性。最终,GHI公司的产品成功获得了E-Mark认证,并在欧洲市场获得了良好的口碑和市场份额。

富信半导体(FOSAN)公司的发展小趣事

GHI公司一直致力于提升产品品质和安全性。为了进入欧洲高端市场,GHI公司决定对其核心产品进行E-Mark认证。在认证过程中,GHI公司不断完善质量管理体系,提升生产工艺水平,确保产品质量的稳定性和可靠性。最终,GHI公司的产品成功获得了E-Mark认证,并在欧洲市场获得了良好的口碑和市场份额。

问答坊 | AI 解惑

如何修改bsp

有没有这方面的书籍,想学bsp的开发,修改。 会克隆别人的bsp,但是要如何修改呢,要如何下手? …

查看全部问答>

vxworks下的u盘问题

我目前在做vxworks下的u盘数据采集,请问:在工程中包含usb组件后,怎样在应用程序中实现对u盘的控制呢?这需不需要涉及到接口芯片的固件编程?…

查看全部问答>

[请教]关于STM32F107的OTG开发

在F107上,个人打算使用OTG下host模式完成U盘的读写操作 目前有几个问题想请教大家: 1. STM32仅仅提供了OTG操作的库函数,关于OTG的上层协议没有任何的涉及对吧?提供的demo还是bin格式的; 2. 如果我打算完成host通信,是否存在两条路: ...…

查看全部问答>

FPGA最小系统

小弟是刚开始学习FPGA,准备画一块FPGA最小系统板,请问大侠们谁有FPGA最小系统的设计指导,小弟感激不尽,有的话麻烦发到我邮箱betterfunan@126.com。谢谢大家了、、、、…

查看全部问答>

DIY步进电机的初步任务规划

DIY步进电机的初步任务规划  将任务划分为如下部分,每个部分如下:   1.电源部分把我们用的市电~220V变为LM3S811所需要的电压和步进电机所欲要的电压,这个模块要求不高可以一个人完成。  2.按键和显示部分难度也不大,显示可 ...…

查看全部问答>

找工作的迷惑

        大家好,我马上就要开始找工作了,现在有个疑惑想请教大伙,我对单片机和嵌入式很感兴趣,大学里也自学了好多相关的知识,但是现在来招聘的公司似乎和我所学的有点出入,我不是很想放弃学了这么久的单 ...…

查看全部问答>

红外中断的问题

我设计了一个可红外调节的时钟 利用外部中断1 作为红外接收头的引脚 并用下降沿触发方式  程序 在附件中  程序写好后发现程序一开始运行就进入了 红外中断 试了好久度没有调试成功 望高手帮忙看看   其中 p0口 接的是液晶 &nbs ...…

查看全部问答>

430的时钟源你弄懂了吗?

学习了很久430单片机,对里面的时钟源还是搞不太清楚,有五个时钟源,又分了好多种时钟信号,谁能清晰的介绍一下吗?感谢…

查看全部问答>

有人用zic2410或其模块吗?本人创建了一个QQ群:222013663验证码:zic123

有人用zic2410或其模块吗?本人创建了一个QQ群:222013663验证码:zic123,欢迎大家加入。 [ 本帖最后由 cnsxgh 于 2012-3-19 17:52 编辑 ]…

查看全部问答>

DMA中断问题

我要在DMA中断程序中清除DMA中断标志位,DMA0CTL &= ~DMAIFG不对吗,老是提示expected  an  expression,为什么啊?…

查看全部问答>