两个单片机之间进行模拟I2C通讯

2020-01-23 14:40发布

有大侠做过两个单片机之间进行I2C通信的吗?一般单片机端当主机用两条数据线去模拟i2c当主机读取外围的从设备比较简单,但单片机端模拟从机与另外一个单片机模拟I2C当主机进行通信就没搞过了,有人这么做过吗,能否贴出单片机端模拟从机的I2C协议代码,研究一下
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
24条回答
dr2001
1楼-- · 2020-01-24 08:47
 精彩回答 2  元偷偷看……
huhang
2楼-- · 2020-01-24 13:08
void SlaveI2C_Test(void)
{
        start_scan();                                                                        //¼ì²âÆðʼÐźÅ

        if(START_flag==1)
        {
                START_flag = 0;                                                                //¿ªÊ¼ÐźÅÇåÁã

                I2C_rxadd();                                                                //ÊÕÈ¡µØÖ·¼°ÃüÁî
                //------------·´À¡½ÓÊÕÓ¦´ð------------
                while(scl == 0);//µÈ´ý¸øÖ÷»ú×¼±¸½ÓÊÕÓ¦´ð
                SDA_OUT();
                SDA_Reset;
                while(scl == 1){;}//µÈ´ýÖ÷»ú½ÓÊÕÓ¦´ðÍê³É
                SDA_IN();
                //------------------------------------       
                //------------------------------------
                if(DEV_address == 0xa0 || DEV_address == 0xa1)                                //ÅжÏÊÇ·ñΪ±¾»úµØÖ·  
                {
                        m = 0;                                                                        //³õʼ»¯m
                        if(R_W == 0)                                                        //Ö÷»úÏò±¾»úдÊý¾Ý
                        {
                                while(1)
                                {
                                        I2C_Rec[m] = I2C_rxbyte();
                                        //------------·´À¡½ÓÊÕÓ¦´ð------------
                                        while(scl == 0);//µÈ´ý¸øÖ÷»ú×¼±¸½ÓÊÕÓ¦´ð
                                        SDA_OUT();
                                        SDA_Reset;
                                        while(scl == 1){;}//µÈ´ýÖ÷»ú½ÓÊÕÓ¦´ðÍê³É
                                        SDA_IN();
                                        //------------------------------------
                                        //------------STOP Ðźżì²â-----------
                                    m++;
                                        /* while(scl == 0){;}//¼ì²âSTOP
                                         if(scl==1)
                                         {
                                                 while(sda==0){;}
                                                 while(sda==1)
                                                 {
                                                         GPIO_WriteBit(GPIOF, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOF, GPIO_Pin_6)));       
                                                 return;
                                             }
                                     }*/
                                        //-------------------------------------
                                        if(m == I2C_Rec[1])//³¤¶È×Ö·û
                                        {
                                                //STOP_flag = 1;
                                                GPIO_WriteBit(GPIOF, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOF, GPIO_Pin_6)));       
                                            return;
                    }
                                }
                        }       
                        else if(R_W == 1)                                                //Ö÷»úÏò±¾»ú¶ÁÊý¾Ý
                        {                               
                                while(1)
                                {
                                        I2C_txbyte(I2C_Send[m]);
                                        m++;
                                       
                                        //----------------½ÓÊÕÖ÷»úÓ¦´ð£¬´Ë¹¦ÄÜÖ÷»úÐèÒª¿ªÆôÏò´Ó»ú¶ÁÊý¾Ý³É¹¦ºó·¢Ë͵ÄÓ¦´ðÐźÅ----------------------------------                                       
                                        while(scl == 0){;}
                                        while(scl == 1)
                                        {
                                                if(sda == 1)//½ÓÊÕµ½Ö÷»úÇëÇó¶ÁÊý¾ÝµÄ×îºóÒ»¸ö×Ö½ÚNACKʱ£¬Í£Ö¹·¢ËÍ
                                                {
                                                                                                       
                                                    GPIO_WriteBit(GPIOF, GPIO_Pin_10, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOF, GPIO_Pin_10)));       
                                                        return;
                                                }
                    }                                                                               
                                        //--------------------------------------------------------------------------------                                       
                                        //----------------½ÓÊչ̶¨³¤¶È×Ö½ÚÊý¾ÝºóÇ¿ÐÐÍ˳ö·¢ËÍ
                                        /*if(m == 20)
                                        {
                                                //STROBE = 1;
                                                GPIO_WriteBit(GPIOF, GPIO_Pin_10, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOF, GPIO_Pin_10)));       
                                            return;
                                        }*/
                                        //--------------------------------------------------------------------------------------
                                }
                                       
                        }                               
                }
        }
}
huhang
3楼-- · 2020-01-24 14:54
u8 I2C_rxbyte()
{
        u8 i,j,k=0;
        while(scl == 1);                                                                        //µÈ´ýSCLÀ­µÍ
        for(i = 0 ;i < 8 ;i++)
        {
                while( ! scl);                                                                        //µÈ´ýSCLÓÉ0±äΪ1
                if(sda == 1)
                        j = 1;
                else
                        j = 0;
                k=(k << 1) | j;       
                while(scl);                                                                                //SCL¸ßµçƽʱµÈ´ý
        }
        return(k);                                                                                        //½«½ÓÊÕµ½µÄÊý¾Ý·µ»Ø
}
huhang
4楼-- · 2020-01-24 19:59
void I2C_rxadd()
{
        u8 i,j,k=0;
        while(scl == 1);//µÈ´ýÖ÷»úÀ­µÍSCL
        for(i = 0 ;i < 8 ;i++)
        {
                while( ! scl);//SCL=0ʱ£¬Ò»Ö±µÈ´ý£¬SCL=1ʱ¶ÁÈ¡SDAÊý¾Ý£¬Ö÷»úSCLµÈÓÚ1±ØÐë±£³ÖÒ»¶¨µÄʱ¼ä³¤¶È£¬²ÅÄܱ£Ö¤¿É¿¿¶ÁÈ¡//µÈ´ýSCLÓÉ0±äΪ1
                if(sda == 1)
                        j = 1;
                else
                        j = 0;
                k=(k << 1) | j;                                                                        //½«ÊÕµ½µÄλ·ÅÈëKÖР 
                while(scl == 1);//SCL¸ßµçƽʱµÈ´ý SCL=0ʱ¸Ãλ¶ÁÈ¡Íê³É£¬×¼±¸¶ÁÈ¡ÏÂÒ»BIT
        }
        R_W=k&0x01;                                                                                        //Ö÷»úÊǶÁ»¹ÊÇд
        //DEV_address= (k >> 1) & 0x7f;                                                //Çó³öÇ°7λµÄÉ豸µØÖ·
        DEV_address = k;
}
huhang
5楼-- · 2020-01-24 22:23
void I2C_txbyte(u8 dat_byte)  
{  
        u8 i,temp;
        temp = dat_byte;                                                                                                                                               
        //while(scl == 1);  //SCLϽµÑØ¿ªÊ¼¶Á
        //while(sda == 0);                                                                        //µÈ´ýÖ÷»úÊÍ·ÅÊý¾Ý×ÜÏß        
       
       
        SDA_OUT();                                               
    for (i = 0 ;i < 8 ;i++)                                                                //´Ó×î¸ßλ¿ªÊ¼£¬ÒÀ´Î·¢ËÍ8λ  
    {
              while(scl == 0);  //µÈ´ýÖÃ1ºó¸øÖ÷»ú·¢ËÍÊý¾Ý
               
                if(temp&0x80)
                {
                        SDA_Set;
                }
                else
                {
                        SDA_Reset;
                }
                temp = temp << 1;
                //temp = temp << 1;                                                                 //½«Òª·¢Ë͵ÄÊý×î¸ßλÒƵ½CYÖÐ
                //sda = CY;                                                                                //Êý¾ÝÏß·¢ËÍCYÖдæµÄλÊý¾Ý  
                //while(scl == 0);
                //while(scl == 1);
                while(scl == 1);//Ϊ1ʱµÈ´ýÖ÷»ú¶ÁÈ¡Êý¾Ý£¬Îª0ʱÖ÷»ú¶ÁÈ¡Íê³É¡£
                //while(scl == 0); //
        }
        //sda = 1;                                                                                         //·¢ÍêÊÍ·ÅÊý¾Ý×ÜÏß
        //SDA_Set;
        SDA_IN();
}
huhang
6楼-- · 2020-01-25 01:42
 精彩回答 2  元偷偷看……

一周热门 更多>