標(biāo)題: AVR單片機(jī)I2C總線程序 [打印本頁]

作者: 1804181935    時(shí)間: 2019-7-27 08:41
標(biāo)題: AVR單片機(jī)I2C總線程序
#include "iom16v.h"

/*I2C總線主機(jī)模式錯誤處理*/
void error(unsigned char type) {

        switch (type & 0xF8) {
                case 0x20:                                        /*址址寫失敗*/
                        /*stop 停止*/
                        TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
                        break;
                case 0x30:                                        /*數(shù)據(jù)寫失敗*/
                        /*stop 停止*/
                        TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
                        break;
                case 0x38:                                        /*仲裁失敗*/
                        break;
                case 0x48:                                        /*址址讀失敗*/
                        /*stop 停止*/
                        TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
                        break;
                }
}

/*I2C總線單字節(jié)寫入*/
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 寫入數(shù)據(jù)*/
        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總線單字節(jié)讀取*/
unsigned char twi_read(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;
                }
               
        /*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;
                }

        /*讀取數(shù)據(jù)*/
        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;
}

013-IIC-LED.rar

25.61 KB, 下載次數(shù): 27, 下載積分: 黑幣 -5


作者: billtest36    時(shí)間: 2019-11-5 11:40
太好了 感謝板主分享 是一個(gè)完整的案例分享
作者: jjj12345    時(shí)間: 2019-11-9 12:26
billtest36 發(fā)表于 2019-11-5 11:40
太好了 感謝板主分享 是一個(gè)完整的案例分享

太好了,可以試試顯示屏驅(qū)動。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1