OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2474|回复: 7

原子哥代码中的小问题,求高手看下,个人观点

[复制链接]

13

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
472
金钱
472
注册时间
2016-7-15
在线时间
175 小时
发表于 2016-7-30 16:14:44 | 显示全部楼层 |阅读模式
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,那就是上啦。所以不是废话。而是有作用的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-7-30 16:14:45 | 显示全部楼层
设置的是上下拉输入,设置ODR控制上啦还是下拉,这里设置为1,那就是上啦。所以不是废话。而是有作用的。
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-7-30 16:32:06 | 显示全部楼层
觉得没用就去掉看看啊,如果没问题就可以啊。
觉得有问题或者多余就去验证。
回复

使用道具 举报

13

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
472
金钱
472
注册时间
2016-7-15
在线时间
175 小时
 楼主| 发表于 2016-7-30 16:40:27 | 显示全部楼层
憨厚诚实大叔 发表于 2016-7-30 16:32
觉得没用就去掉看看啊,如果没问题就可以啊。
觉得有问题或者多余就去验证。

去掉了,没问题。就是不知道自己想的对不对?
回复

使用道具 举报

13

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
472
金钱
472
注册时间
2016-7-15
在线时间
175 小时
 楼主| 发表于 2016-7-30 20:18:25 来自手机 | 显示全部楼层
正点原子 发表于 2016-7-30 16:14
设置的是上下拉输入,设置ODR控制上啦还是下拉,这里设置为1,那就是上啦。所以不是废话。而是有作用的。

ODR寄存器不是数据输出的吗?也可以输入设置上拉?数据手册我也看了,上面只说了可读可写。求解惑。
回复

使用道具 举报

13

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
472
金钱
472
注册时间
2016-7-15
在线时间
175 小时
 楼主| 发表于 2016-7-30 20:29:06 来自手机 | 显示全部楼层
正点原子 发表于 2016-7-30 16:14
设置的是上下拉输入,设置ODR控制上啦还是下拉,这里设置为1,那就是上啦。所以不是废话。而是有作用的。

难道在控制寄存器中设置了输入,再在ODR寄存器中相应位置高,就可以实现内部上拉输入?
回复

使用道具 举报

13

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
472
金钱
472
注册时间
2016-7-15
在线时间
175 小时
 楼主| 发表于 2016-7-30 22:33:03 | 显示全部楼层
正点原子 发表于 2016-7-30 16:14
设置的是上下拉输入,设置ODR控制上啦还是下拉,这里设置为1,那就是上啦。所以不是废话。而是有作用的。

原子哥,我知道了,不过还有一个疑问,就IO口内部有上下拉电阻,这个内部上下拉电阻是通过ODR寄存器控制IO口上下拉的吗?,还是ODR寄存器输出的电平信号直接到输入寄存器?
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-2-13
在线时间
4 小时
发表于 2018-3-31 20:24:55 | 显示全部楼层
不知道楼主解决没有,这个是因为在GPIOx_CRL寄存器的CNF位设置上拉/下拉模式之后,要由ODR寄存器来具体设置是上拉还是下拉模式,如果是上拉则相应的ODR寄存器置1,如果是下拉则置0。具体请参考中文数据手册106页表17
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 00:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表