新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > TWI ATMEGA16L 叢機模式

        TWI ATMEGA16L 叢機模式

        作者: 時間:2016-11-13 來源:網絡 收藏
        #include "main.h"

        #define SLAVE_ADDRESS0x05

        本文引用地址:http://www.104case.com/article/201611/316563.htm

        #define SCL 0
        #define SDA 1
        #define TWI_PORT PORTC
        #define TWI_DIR DDRC

        //SLAVE RECEIVE MODE
        #define SR_SLA_ACK 0X60//從機接收地址響應
        #define SR_SLA_FAIL 0X68//作為主機仲裁失敗,自己的ALT+W被接收
        #define SR_GCA_ACK 0X70//從機接收廣播響應
        #define SR_GCA_FAIL 0X78//作為主機仲裁失敗,接收到廣播地址
        #define SR_DATA_ACK 0X80//從機接收數據響應
        #define SR_DATA_NACK 0X88//從機接收數據非應答
        #define SR_GCA_DATA_ACK 0X90//從機接收廣播數據應答
        #define SR_GCA_DATA_NACK 0X98//從機接收廣播數據非應答
        #define SR_STOP_RESTART 0xA0//從機工作時收到STOP或RESTART
        //SLAVE SEND MODE
        #define ST_SLA_ACK 0XA8//從機發送地址應答
        #define ST_SLA_FAIL 0XB0//作為主機仲裁失敗,自己的ALT+R被接收
        #define ST_DATA_ACK 0XB8//從機發送數據應答
        #define ST_DATA_NACK 0XC0//從機發送數據非應答
        #define ST_BYTE_ACK 0XC8//數據已發送,接收到ACK

        #define ILLEGAL 0x00

        #define TWI_ACK() (TWCR = (1<#define TWI_NOACK() (TWCR = (1<#define TWI_RESUME() (TWCR = (1<

        //全局變量
        //volatile unsigned char transmit_ready = 0;
        volatile unsigned char receive_ready = 0;
        //局部變量
        static unsigned char transmit_leng = 0;
        static unsigned char receive_leng = 0;

        static struct SR sr_temp;

        void IIC_Init(void)
        {
        PORTC |= (1<DDRC &= ~((1<
        TWCR = 0x00;

        TWAR = (SLAVE_ADDRESS<<1)|(0x00);
        TWDR = 0x00;
        TWCR = (1<
        st.start = 0x5A;

        transmit_leng = sizeof(st);
        receive_leng = sizeof(sr);
        }

        #pragma interrupt_handler TWI_ISR:18
        void TWI_ISR(void)
        {
        static unsigned char transmit_cnt = 0;
        static unsigned char receive_cnt = 0;

        unsigned char *p_st = (unsigned char *)&st;
        unsigned char *p_sr = (unsigned char *)&sr_temp;
        static unsigned char check = 0; //校驗和

        SREG &= ~0x80;

        if (sleep_mode == POWER_DOWN)
        {
        sys_reset_flag = 1;
        }

        switch(TWSR&0xf8)
        {
        case SR_SLA_ACK:
        case 68:
        receive_cnt = 0;
        TWI_ACK();
        break;
        case SR_DATA_ACK:
        if (receive_cnt < (receive_leng-1))
        {
        *(p_sr+receive_cnt) = TWDR;
        }
        else if (receive_cnt == (receive_leng-1))
        {
        *(p_sr+receive_cnt) = TWDR;
        receive_ready = 1;
        }
        receive_cnt++;
        TWI_ACK();
        break;
        case SR_STOP_RESTART: // 0xA0:從機工作時收到STOP或RESTART
        TWI_ACK();
        break;

        case ST_SLA_ACK: // 0XA8:從機發送地址應答
        transmit_cnt = 0;
        TWDR = *(p_st+transmit_cnt);
        check = *(p_st+transmit_cnt);
        transmit_cnt++;
        TWI_ACK();
        break;
        case ST_DATA_ACK: // 0XB8:從機發送數據應答
        if (transmit_cnt < (transmit_leng-1))
        {
        TWDR = *(p_st+transmit_cnt);
        check += *(p_st+transmit_cnt);
        }
        else if (transmit_cnt == (transmit_leng-1))
        {
        TWDR = check; //發送校驗和
        }
        transmit_cnt++;
        TWI_ACK();
        break;
        case ST_DATA_NACK:
        //transmit_ready = 1;
        TWI_ACK();
        break;
        case ILLEGAL:
        case 0xF8:
        TWI_RESUME();
        break;
        }
        SREG |= 0x80;
        }



        關鍵詞: TWIATMEGA16L叢機模

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 西贡区| 岚皋县| 舒兰市| 宜州市| 株洲县| 安达市| 绥德县| 竹溪县| 龙里县| 桃园市| 乐昌市| 托克逊县| 泽库县| 布尔津县| 阿巴嘎旗| 望江县| 阳信县| 松滋市| 常德市| 纳雍县| 嵩明县| 大埔区| 宣汉县| 子长县| 山丹县| 赣州市| 固阳县| 万宁市| 怀宁县| 高台县| 鱼台县| 北辰区| 西峡县| 鸡西市| 开江县| 景谷| 丹阳市| 都江堰市| 彰武县| 大港区| 乌兰察布市|