• <label id="gmp5l"></label>

    <li id="gmp5l"></li>
      • 您好,歡迎訪問上海意泓電子科技有限責(zé)任公司網(wǎng)站!
        4新聞資訊
        您的位置: 首頁 ->  新聞資訊 -> 單片機

        ?STM8S 模擬I2C程序

        文章出處:單片機 責(zé)任編輯:上海意泓電子科技有限責(zé)任公司 發(fā)表時間:
        2018
        05-20

        STM8S的硬件I2C還是存在問題,不敢貿(mào)然使用.

        #define SCL PE_ODR_ODR1
        #define SDA PE_ODR_ODR2
        #define SDAM PE_IDR_IDR2
        #define SET_SCL_OUT() {PE_DDR_DDR1=1; PE_CR1_C11 = 1; PE_CR2_C21 = 0;}
        #define SET_SDA_OUT() {PE_DDR_DDR2=1; PE_CR1_C12 = 1; PE_CR2_C22 = 0;}
        #define SET_SDA_IN() {PE_DDR_DDR2=0; PE_CR1_C12 = 0; PE_CR2_C22 = 0;}
        //--------------------------------------------------------------
        // Prototype : void I2C_Start(void)
        // Calls : Delay_5us()
        // Description : Start Singnal
        //--------------------------------------------------------------
        void I2C_Init(void)
        {
        I2C_CR1 &= 0xFE; // PE=0, disable I2C module 
        SET_SCL_OUT();
        SET_SDA_OUT(); 
        }

        //--------------------------------------------------------------
        // Prototype : void Delay_5us(void)
        // Description : 大約延時5us
        //--------------------------------------------------------------
        void Delay_5us(void)
        {
        uchar i; //fcpu 8MHz 時
        for (i=50; i>0; i--);
        }

        //--------------------------------------------------------------
        // Prototype : void I2C_Start(void)
        // Calls : Delay_5us()
        // Description : Start Singnal
        //--------------------------------------------------------------
        void I2C_Start(void)
        {
        // SDA 1->0 while SCL High
        SDA = 1; 
        SCL = 1; 
        Delay_5us(); 
        SDA = 0; 
        Delay_5us(); 
        SCL = 0; 
        }

        //--------------------------------------------------------------
        // Prototype : void I2C_Stop(void)
        // Calls : Delay_5us()
        // Description : Stop Singnal
        //-------------------------------------------------------------- 
        void I2C_Stop(void)
        {
        // SDA 0->1 while SCL High
        SDA = 0; 
        SCL = 1; 
        Delay_5us(); 
        SDA = 1; 
        Delay_5us(); 
        }
        //--------------------------------------------------------------
        // Prototype : void I2C_SendACK(uchar ack);
        // Calls : Delay_5us()
        // Parameters : bit ack:1-noack, 0-ack
        // Description : Master device send ACK to slave device.
        //--------------------------------------------------------------
        void I2C_SendACK(uchar ack)
        {
        if(ack == 0)
        {
        SDA = 0; 

        else
        {
        SDA = 1; 
        }

        SCL = 1; 
        Delay_5us(); 

        SCL = 0; 
        Delay_5us(); 
        }
        //--------------------------------------------------------------
        // Prototype : uchar I2C_SendByte(uchar sendDAT)
        // Calls : Delay_5us()
        // Parameters : uchar sendDAT---data to be send
        // Return Value : CY--slave ack (1---noack,0---ack)
        // Description : Send one byte to I2C
        //--------------------------------------------------------------
        uchar I2C_SendByte(uchar sendDAT)
        {
        uchar i,revack;
        for (i= 0 ; i< 8; i++) 
        {
        SCL = 0; 
        Delay_5us(); 
        if (sendDAT & 0x80) // write data
        {
        SDA = 1;
        }
        else 
        {
        SDA = 0;
        }
        sendDAT <<= 1;
        SCL = 1; 
        Delay_5us(); 


        SCL = 0; 
        Delay_5us(); 

        SET_SDA_IN();

        SCL = 1; 
        asm("nop");
        asm("nop");

        revack = (uchar)SDAM;

        Delay_5us(); 
        SCL = 0; 

        SET_SDA_OUT();

        Delay_5us(); 
        return revack;
        }

        //--------------------------------------------------------------
        // Prototype : uchar I2C_RecvByte()
        // Calls : Delay_5us()
        // Parameters : none
        // Return Value : revDAT- received data
        // Description : Receive one byte from I2C
        //--------------------------------------------------------------
        uchar I2C_RecvByte()
        {
        uchar i;
        uchar revDAT = 0;

        SDA = 1; // latch the Data port befor reading

        SET_SDA_IN();

        for (i=0; i<8; i++) 

        revDAT <<= 1;

        SCL = 1; 

        asm("nop");
        asm("nop");

        if (SDAM)
        {
        revDAT |= 0x01;
        }
        else
        {
        revDAT &= 0xfe;
        }
        Delay_5us(); 
        SCL = 0; 
        Delay_5us(); 
        }

        SET_SDA_OUT();

        return revDAT;
        }

        //--------------------------------------------------------------
        // Prototype : void Write_PT2314(uchar wdata)
        // Calls : I2C_Start(), I2C_Stop(),I2C_SendByte()
        // Parameters : RegAddr-- target memory address, 
        // wrdata--- data to be writing
        // Description : Write one byte to target memory
        //--------------------------------------------------------------
        void Write_24c02(uchar regadd,uchar wdata)
        {
        I2C_Start(); 
        I2C_SendByte(0xA0); // Device Addr + Write (operation) 
        I2C_SendByte(regadd); 
        I2C_SendByte(wdata); 
        I2C_Stop(); 
        }
        uchar Read_24c02(uchar regadd)
        {
        uchar revdata;

        I2C_Start(); 
        I2C_SendByte(0xA0); // Device Addr + Write (operation) 
        I2C_SendByte(regadd); 

        I2C_Start(); 
        I2C_SendByte(0xA1); // Device Addr + Write (operation) 

        revdata = I2C_RecvByte(); 
        I2C_SendACK(1);

        I2C_Stop(); 

        return revdata;
        }


        上海意泓電子科技有限責(zé)任公司 版權(quán)所有 未經(jīng)授權(quán)禁止復(fù)制或鏡像

        CopyRight 2020-2025 www.jlodreman.com All rights reserved   滬ICP備2021005866號

        亚洲人成影院在线观看,91综合永久在线观看,欧洲亚洲日韩国产AV一级,中文字幕在线视频播放
      • <label id="gmp5l"></label>

        <li id="gmp5l"></li>