新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > MSP430普通I/0口模擬IIC總線

        MSP430普通I/0口模擬IIC總線

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

        #define SLAVE_ADDRESS 0x04
        #define SLAVE_WRITE_ADDRESS (SLAVE_ADDRESS<<1)|0x00
        #define SLAVE_READ_ADDRESS (SLAVE_ADDRESS<<1)|0x01

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

        #define I2C_SDABIT3
        #define I2C_SCLBIT4
        #define I2C_PORT_INP6IN
        #define I2C_PORT_OUTP6OUT
        #define I2C_PORT_DIRP6DIR

        #define SDA_IN(I2C_PORT_IN & I2C_SDA)
        #define SCL_IN(I2C_PORT_IN & I2C_SCL)
        #define S_SDAI2C_PORT_DIR &= ~I2C_SDA
        #define C_SDAI2C_PORT_DIR |= I2C_SDA;I2C_PORT_OUT &= ~I2C_SDA
        #define S_SCLI2C_PORT_DIR &= ~I2C_SCL
        #define C_SCLI2C_PORT_DIR |= I2C_SCL;I2C_PORT_OUT &= ~I2C_SCL

        void I2C_init(void)
        {
        I2C_PORT_DIR &= ~(I2C_SDA|I2C_SCL);
        I2C_PORT_OUT |= (I2C_SDA|I2C_SCL);
        }

        void I2C_DELAY(void)
        {
        asm("nop");asm("nop");
        asm("nop");asm("nop");
        asm("nop");asm("nop");
        asm("nop");asm("nop");
        }

        void I2C_Start(void)
        {
        S_SDA;
        S_SCL;
        I2C_DELAY();
        C_SDA;
        I2C_DELAY();
        C_SCL;
        }

        void I2C_Stop(void)
        {
        C_SDA;
        I2C_DELAY();
        S_SCL;
        I2C_DELAY();
        S_SDA;
        I2C_DELAY();
        }

        void I2C_Send_Ack(void)
        {
        C_SDA;
        I2C_DELAY();
        S_SCL;
        I2C_DELAY();
        C_SCL;
        I2C_DELAY();
        }

        void I2C_Send_NoAck(void)
        {
        S_SDA;
        I2C_DELAY();
        S_SCL;
        I2C_DELAY();
        C_SCL;
        I2C_DELAY();
        }


        void I2C_Read_Ack(void)
        {
        unsigned char i = 0;
        S_SCL;
        S_SDA;
        I2C_DELAY();
        for(i=0; i<100; i++)
        {
        if(SDA_IN == 0)
        {
        I2C_DELAY(); break;
        }
        I2C_DELAY();
        }
        C_SCL;
        I2C_DELAY();
        }

        void I2C_WriteByte(unsigned char one_byte)
        {
        unsigned char i = 0;
        S_SDA;
        for (i=0; i<8; i++)
        {
        if (one_byte&0x80)
        {
        S_SDA;
        }
        else
        {
        C_SDA;
        }
        one_byte<<=1;
        I2C_DELAY();
        S_SCL;
        I2C_DELAY();
        C_SCL;
        I2C_DELAY();
        }
        }

        unsigned char I2C_ReadByte(void)
        {
        unsigned char read_byte=0;
        unsigned char i = 0;
        S_SDA;
        //C_SCL;
        I2C_DELAY();
        for (i=0; i<8; i++)
        {
        S_SCL;
        I2C_DELAY();
        read_byte<<=1;
        if (SDA_IN != 0)
        {
        read_byte |= 0x01;
        }
        //I2C_DELAY;
        C_SCL;
        I2C_DELAY();
        }
        return read_byte;
        }


        void I2C_write_Nbyte(unsigned char *pbuf, unsigned char cnt)
        {
        unsigned char i = 0;
        I2C_Start();
        I2C_WriteByte(SLAVE_WRITE_ADDRESS);
        I2C_Read_Ack();
        for (i=0; i {
        I2C_DELAY();I2C_DELAY();
        I2C_WriteByte(*pbuf);
        pbuf++;
        I2C_Read_Ack();
        }
        I2C_Stop();
        }

        void I2C_read_Nbyte(unsigned char *pbuf, unsigned char cnt)
        {
        unsigned char i = 0;
        I2C_Start();
        I2C_WriteByte(SLAVE_READ_ADDRESS);
        I2C_Read_Ack();
        for (i=1; i {
        I2C_DELAY();I2C_DELAY();
        *pbuf = I2C_ReadByte();
        pbuf++;
        I2C_Send_Ack();
        }
        *pbuf = I2C_ReadByte();
        I2C_Stop();
        }



        評論


        技術專區(qū)

        關閉
        主站蜘蛛池模板: 邳州市| 宁波市| 五华县| 麦盖提县| 铁力市| 阿拉善盟| 崇州市| 齐河县| 福海县| 西华县| 望都县| 太仓市| 陇川县| 台北县| 南安市| 登封市| 德昌县| 子长县| 日喀则市| 承德市| 西丰县| 吉林市| 运城市| 台东市| 双桥区| 泸州市| 惠安县| 宁安市| 文山县| 巩义市| 隆化县| 临高县| 溧水县| 吴忠市| 遂平县| 贵德县| 锡林郭勒盟| 衡水市| 颍上县| 泰安市| 乐业县|