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

2020-01-23 14:40发布

有大侠做过两个单片机之间进行I2C通信的吗?一般单片机端当主机用两条数据线去模拟i2c当主机读取外围的从设备比较简单,但单片机端模拟从机与另外一个单片机模拟I2C当主机进行通信就没搞过了,有人这么做过吗,能否贴出单片机端模拟从机的I2C协议代码,研究一下
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
25条回答
huhang
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;
                                        }*/
                                        //--------------------------------------------------------------------------------------
                                }
                                       
                        }                               
                }
        }
}

一周热门 更多>