新手上路
- 积分
- 33
- 金钱
- 33
- 注册时间
- 2020-5-14
- 在线时间
- 11 小时
|
5金钱
我发送从机地址0X68<<1|0;很疑惑为啥从机不发送ACK,有人能给小弟讲一下吗?
先是控制PB11的输入输出:
#define IIC_SDA_IN() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8<<12;}
#define IIC_SDA_OUT() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=3<<12;}
然后是发送函数:
//发送一字节的数据
void IIC_Send_Byte(u8 txd)
{
u8 i;
IIC_SDA_OUT();
for(i = 0;i<8;i++)
{
IIC_SCL = 0;
delay_us(3);
if(txd & 0x80)
{
IIC_SDA_WRITE = 1;
}
else
{
IIC_SDA_WRITE = 0;
}
txd <<= 1;
delay_us(2);
IIC_SCL = 1;
IIC_Delay();
}
IIC_SCL = 0;//发送完成,拉低SCL
IIC_SDA_WRITE = 1;//发送完成,释放SDA线
}
接着是等待从机ACK的函数:
//1:从机应答 0:从机无应答 直接停止
u8 Wait_ACK(void)
{
IIC_SDA_IN();//将SDA控制权交给从机
delay_us(5);//让从机有充足时间拉低SDA发送应答
IIC_SCL = 1;
IIC_Delay();
if(IIC_SDA_READ)
{
IIC_SCL = 0;
IIC_Stop();
return 0;
}
else
{
IIC_SCL = 0;
}
return 1;
}
然后是时序图,可以看出成功发送了地址数据,但从机没有ACK(附件)
|
|