模拟IIC
<p><img src="data/attachment/forum/202412/10/172038kq9bi9950g0dbp0b.jpg" alt="8MZ_CLC42QT<span class=" />我想请问,为啥我的IIC时钟信号波形和标准的有这么大的区别,我是开漏输出加4.7K的上拉电阻,IIC的速度大概再300K左右。</p>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
软件模拟I2C程序 CH1通道应该是CLK信号,怎么电压会怎么高? <p>把4.7K的电阻改成1K试试</p>
页:
[1]