您好,歡迎訪問上海意泓電子科技有限責任公司網站!
                                    4新聞資訊
                                    您的位置: 首頁 ->  新聞資訊 -> 單片機

                                    ?STM8S 模擬I2C程序

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

                                    STM8S的硬件I2C還是存在問題,不敢貿然使用.

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


                                    上海意泓電子科技有限責任公司 版權所有 未經授權禁止復制或鏡像

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

                                    亚洲av日韩av中文综合|国产精品无码专区|精品国产三级A∨电影|久久无吗喷水喷潮视频