AVR单片机I2C总线程序

发布者:JoyfulJourney最新更新时间:2019-10-15 来源: eefocus关键字:AVR  单片机  I2C总线 手机看文章 扫描二维码
随时随地手机看文章

#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;

}


关键字:AVR  单片机  I2C总线 引用地址:AVR单片机I2C总线程序

上一篇:基于Atmega16的电压表制作 程序+原理图
下一篇:Atmega128a的4位独立键盘控制程序

小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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