主机读从机数据时,SDA和SCL的高低应该如何设置?
主机给从机写数据时先要将SCL设置为低,然后根据需要将SDA设置为高或者低,可是主机读从机数据的过程我不太清楚,读的时候SCL是设置成高还是低呢?因为是从一个管脚读进一位...
主机给从机写数据时先要将SCL设置为低,然后根据需要将SDA设置为高或者低,可是主机读从机数据的过程我不太清楚,读的时候SCL是设置成高还是低呢?因为是从一个管脚读进一位数据(即数据是从机发送的,主机未知),SDA又应该如何设置呢?
展开
1个回答
展开全部
不知道你是什么单片机,AVR和ST的首先将SDA置为输入状态,51的好像不用,然后置高SDA,读取数据时,将SCL置高,判断SDA管脚电平状态,若为高,DATA |= 1。再将SCL置低,等待下一位读取,DATA<<1,数据左移一位。再置高SCL,判断SDA状态。依次完成8位数据。
INT8U I2C_ReciveByte(void)
{
INT8U data = 0;
INT8U iLoop;
SETBIT(I2C_PORT,SDA ); // 置高SDA
CLEARBIT(I2C_DIR,SDA ); // 设置SDA为输入
//按位依次读取8位数据
for(iLoop = 0; iLoop < 8; iLoop++){
SETBIT(I2C_PORT,SCL); // 置高SCL
I2C_Delay(1);
data <<= 1;
if(CHECKBIT(I2C_IN,SDA) != 0){//检测SDA状态
data |= 1;
}
CLEARBIT(I2C_PORT,SCL); // 置低SCL
I2C_Delay(1);
}
SETBIT(I2C_DIR,SDA ); // 设置SDA为输出
return data;
}
INT8U I2C_ReciveByte(void)
{
INT8U data = 0;
INT8U iLoop;
SETBIT(I2C_PORT,SDA ); // 置高SDA
CLEARBIT(I2C_DIR,SDA ); // 设置SDA为输入
//按位依次读取8位数据
for(iLoop = 0; iLoop < 8; iLoop++){
SETBIT(I2C_PORT,SCL); // 置高SCL
I2C_Delay(1);
data <<= 1;
if(CHECKBIT(I2C_IN,SDA) != 0){//检测SDA状态
data |= 1;
}
CLEARBIT(I2C_PORT,SCL); // 置低SCL
I2C_Delay(1);
}
SETBIT(I2C_DIR,SDA ); // 设置SDA为输出
return data;
}
追问
用的是MSP430里的5438
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询