STC98LE52模拟 I2C通信 这个波形为什么会出现中间的电平,怎么消除?
[复制链接]
STC98LE52模拟 I2C通信 带1个负载,上拉电阻是R202,这个波形为什么会出现中间的电平,怎么消除啊?求帮助
图后附模拟I2C程序
//状态标志
bit ack; //应答标志位
void Delay50us() //@12.000MHz
{
unsigned char i;
_nop_();
i = 22;
while (--i);
}
// 起动总线函数
//函数原型: void Start_I2c();
//功能: 启动I2C总线,即发送I2C起始条件.
void start_i2c()
{
sda=1; //发送起始条件的数据信号
sck=1;
Delay50us();
sda=0; //发送起始信号
Delay50us();
sck=0; //钳住I2C总线,准备发送或接收数据
Delay50us();
}
// 结束总线函数
//函数原型: void Stop_I2c();
//功能: 结束I2C总线,即发送I2C结束条件.
void stop_i2c()
{
sda=0; //发送结束条件的数据信号
sck=1; //结束条件建立时间大于4μs
Delay50us();
sda=1; //发送I2C总线结束信号
Delay50us();
}
// 字节数据传送函数
//函数原型: void SendByte(unsigned char c);
//功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
// 此状态位进行操作.(不应答或非应答都使ack=0 假)
// 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
void sendbyte(unsigned char c)
{
unsigned char BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位
{
if((c<<BitCnt)&0x80)sda=1; //判断发送位
else sda=0;
sck=1; //置时钟线为高,通知被控器开始接收数据位
Delay50us();
sck=0;
}
Delay50us();
sda=1; //8位发送完后释放数据线,准备接收应答位
Delay50us();
sck=1;
Delay50us();
if(sda==1)ack=0;
else ack=1; //判断是否接收到应答信号
sck=0;
Delay50us();
}
|