中级会员
 
- 积分
- 472
- 金钱
- 472
- 注册时间
- 2016-7-15
- 在线时间
- 175 小时
|
1金钱
本帖最后由 李小龙 于 2016-7-30 16:30 编辑
#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出
#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入
//IO方向
#define SDA_IN() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8<<12;}
#define SDA_OUT() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=3<<12;}
#define IIC_SCL PBout(10) //SCL
#define IIC_SDA PBout(11) //SDA
#define READ_SDA PBin(11) //
////////////////////////////////////////下面才是重点
//等待应答信号到来
//返回值:1,接收应答失败
// 0,接收应答成功
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN(); //SDA设置为输入
IIC_SDA=1;delay_us(1); (感觉这句代码没起作用,因为SDA_IN()已经设置了IO传输方向为输入,而IIC_SDA=1把ODR寄存器相应的位置高,但因为IO传输方向为输入,所以ODR寄存器数据不能输出。个人感觉没起作用,@正点原子,希望原子哥帮忙看看,是ii2c中的代码)
IIC_SCL=1;delay_us(1);
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL=0;//时钟输出0
return 0;
} |
最佳答案
查看完整内容[请看2#楼]
设置的是上下拉输入,设置ODR控制上啦还是下拉,这里设置为1,那就是上啦。所以不是废话。而是有作用的。
|