becomeAGeneral 发表于 2024-12-10 17:22:08

模拟IIC

<p><img src="data/attachment/forum/202412/10/172038kq9bi9950g0dbp0b.jpg" alt="8MZ_CLC42QT&lt;span class=" />我想请问,为啥我的IIC时钟信号波形和标准的有这么大的区别,我是开漏输出加4.7K的上拉电阻,IIC的速度大概再300K左右。</p>

DebugLab 发表于 2024-12-10 17:36:25

void        I2C_Delay(void)
{
        u16        dly;
        dly = 8;                //取1对应SCL H为0.5us,L为1.5us,读写仍正常.为了可靠,取8
        while(--dly)        ;
}

void I2C_Start(void)               //start the I2C, SDA High-to-low when SCL is high
{
        P_I2C_SDA = 1;        //SDA = 1;
        I2C_Delay();
        P_I2C_SCL = 1;        //SCL = 1;
        I2C_Delay();
        I2C_Delay();
        I2C_Delay();
        I2C_Delay();
        P_I2C_SDA = 0;        //SDA = 0;
        I2C_Delay();
        I2C_Delay();
        I2C_Delay();
        P_I2C_SCL = 0;        //SCL = 0;
        I2C_Delay();
}


void I2C_Stop(void)                                        //STOP the I2C, SDA Low-to-high when SCL is high
{
        P_I2C_SCL = 0;        //SCL = 0;
        I2C_Delay();
        P_I2C_SDA = 0;        //SDA = 0;
        I2C_Delay();
        P_I2C_SCL = 1;        //SCL = 1;
        I2C_Delay();
        I2C_Delay();
        I2C_Delay();
        P_I2C_SDA = 1;        //SDA = 1;
        I2C_Delay();
}

u8 I2C_Check_ACK(void)         //Check ACK, If status=0: right, if status=1:error
{
        u8        status;
        P_I2C_SDA = 1;        //SDA = 1;
        I2C_Delay();
        P_I2C_SCL = 1;        //SCL = 1;
        I2C_Delay();
        status = 0;
        if(P_I2C_SDA)
                status = 1;
        P_I2C_SCL = 0;        //SCL = 0;
        I2C_Delay();
        return        status;
}

/****************************/
void I2C_WriteAbyte(u8 dat)                //write a byte to I2C
{
        u8 i;
        for(i=0; i<8; i++)
        {
                if(dat & 0x80)
                        P_I2C_SDA = 1;        //SDA = 1;
                else
                        P_I2C_SDA = 0;        //SDA = 0;
                I2C_Delay();
                P_I2C_SCL = 1;        //SCL = 1;
                dat <<= 1;
                I2C_Delay();
                P_I2C_SCL = 0;        //SCL = 0;
                I2C_Delay();
        }
}

u8        I2C_RegWrite(u8 RegAddr, u8 dat)        //返回0: 正确, >0: 错误
{
        u8        status;

        status = 1;
        I2C_Start();
        I2C_WriteAbyte(I2C_WR);                //device address + WR
        if(I2C_Check_ACK() == 0)
        {
                I2C_WriteAbyte(RegAddr);        //register address
                if(I2C_Check_ACK() == 0)
                {
                        I2C_WriteAbyte(dat);        //data
                        if(I2C_Check_ACK() == 0)        //data
                                        status = 0;
                }
        }
        I2C_Stop();
        return        status;
}

u8        I2C_WriteCmd(u16 RegAddr, u16 dat)
{
        u8        status;

        status = 1;
        I2C_Start();
        I2C_WriteAbyte(I2C_WR);                //device address + WR
        if(I2C_Check_ACK() == 0)
        {
                dat = (RegAddr << 8) | dat;
                I2C_WriteAbyte((u8)(dat >> 8));
                if(I2C_Check_ACK() == 0)
                {
                        I2C_WriteAbyte((u8)dat);
                        if(I2C_Check_ACK() == 0)        status = 0;
                }
        }
        I2C_Stop();
        return        status;
}

DebugLab 发表于 2024-12-10 17:36:53

DebugLab 发表于 2024-12-10 17:36


软件模拟I2C程序

21cnsound 发表于 2024-12-10 22:48:04

CH1通道应该是CLK信号,怎么电压会怎么高?

小飞侠 发表于 2024-12-11 20:37:43

<p>把4.7K的电阻改成1K试试</p>
页: [1]
查看完整版本: 模拟IIC