OpenEdv-开源电子网

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

关于模拟IIC IO口配置的讨论

[复制链接]

22

主题

76

帖子

0

精华

初级会员

Rank: 2

积分
186
金钱
186
注册时间
2014-7-7
在线时间
0 小时
发表于 2015-3-28 22:30:15 | 显示全部楼层 |阅读模式
5金钱
    现在大家可能用的都是模拟IIC,但是我在给模拟IIC移植程序的时候发现IO口的配置很重要,一开始仅仅是
配置成输出(模块上面的IIC接口已经接了上拉电阻了)如下:
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed =GPIO_Speed_100MHz;
  然后一直不应答
又根据别人的程序,多加了上拉设置,配置成上拉(为什么模块上已经上拉了再IO口配置的时候还需要配置成上拉呀?),结果好了,可以应答,如下:
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;


   但是现在又用到了别的IIC接口的模块,也是直接给我们上拉好了,但是我配置成以上2种模式都不行,都不应答,可以排除IO口接错和接触不良的问题,也可以排除模块损坏的问题。

    那么问题来了,对于STM32F10x(4x)系列的芯片,模拟IIC到底要配置成哪种模式呢?如果使用硬件IIC又要配置成什么模式呢?仅仅是复用输出吗??

最佳答案

查看完整内容[请看2#楼]

和M3一样,我们例程: 常态是推挽输出,都输出1就是了.SCL铁定是这个了. 当需要读数据的时候,设置为带上拉的输入模式即可.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-3-28 22:30:16 | 显示全部楼层
和M3一样,我们例程:
常态是推挽输出,都输出1就是了.SCL铁定是这个了.
当需要读数据的时候,设置为带上拉的输入模式即可.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

7

主题

67

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2013-10-5
在线时间
9 小时
发表于 2015-3-28 22:30:16 | 显示全部楼层
回复【10楼】岁月已无声:
---------------------------------
回复【9楼】正点原子:
---------------------------------
哈哈,我傻逼了,我买的这MPU9150模块是5V供电的,我突然发现我一直给它供3.3V。现在没问题了。
回复

使用道具 举报

22

主题

76

帖子

0

精华

初级会员

Rank: 2

积分
186
金钱
186
注册时间
2014-7-7
在线时间
0 小时
 楼主| 发表于 2015-3-28 22:31:17 | 显示全部楼层
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;这里写成GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;也可以。
回复

使用道具 举报

22

主题

76

帖子

0

精华

初级会员

Rank: 2

积分
186
金钱
186
注册时间
2014-7-7
在线时间
0 小时
 楼主| 发表于 2015-3-29 10:08:56 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
我是这样设置的:
    GPIO_InitTypeDef GPIO_InitStructure;
   
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOD,ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;                           //PD2为SCL
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOD,&GPIO_InitStructure);

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                         //PC10为SDA,一开始都设置为开漏上拉输出
   GPIO_Init(GPIOC,&GPIO_InitStructure);
    SDA1;       
    SCL1;


宏定义是这样的
#define SCL1 GPIOD->BSRRL|=(1<<2)
#define SDA1 GPIOC->BSRRL|=(1<<10)

#define SCL0 GPIOD->BSRRH|=(1<<2)
#define SDA0 GPIOC->BSRRH|=(1<<10)

#define READ_SDA  ((GPIOC->IDR&GPIO_Pin_10)!=0)?1:0

#define SDA_IN() {GPIOC->MODER|=GPIO_Mode_IN<<20;}
#define SDA_OUT() {GPIOC->MODER|=GPIO_Mode_OUT<<20;}


还是无法应答,模拟IIC里的程序是没有错的。
回复

使用道具 举报

22

主题

76

帖子

0

精华

初级会员

Rank: 2

积分
186
金钱
186
注册时间
2014-7-7
在线时间
0 小时
 楼主| 发表于 2015-3-29 10:11:41 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
SDA_IN()和SDA_OUT()那里有一点小问题,改成这样后

#define SDA_IN()  {GPIOC->MODER &=~(3<<(10*2));GPIOC->MODER|=3<<20;GPIOC->UPDR&=~(3<<20);GPIOC->UPDR|=(1<<20);}
#define SDA_OUT() {GPIOC->MODER &=~(3<<(10*2));GPIOC->MODER|=1<<20;GPIOC->UPDR&=~(3<<20);GPIOC->UPDR|=(1<<20);}

出现的问题是应答成功,但是读取回来的都是0,其他地方和上面的是一样的。
回复

使用道具 举报

22

主题

76

帖子

0

精华

初级会员

Rank: 2

积分
186
金钱
186
注册时间
2014-7-7
在线时间
0 小时
 楼主| 发表于 2015-3-29 10:19:13 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
上面的程序中SDA_IN() 要配置为模拟输入才可以应答,但是读出来的数据都是0
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-3-29 23:08:02 | 显示全部楼层
回复【6楼】廖伟:
---------------------------------
没遇到过...
我们的例程都是这么写的.没什么问题.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

7

主题

67

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2013-10-5
在线时间
9 小时
发表于 2015-4-9 19:52:27 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
求助,原子哥,我用模拟IIC,将SCL和SDA的PB8、PB9换成PC8,PC9 IO口就不行了。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-4-9 22:54:02 | 显示全部楼层
回复【8楼】岁月已无声:
---------------------------------
检查你代码改的对不对啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

7

主题

67

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2013-10-5
在线时间
9 小时
发表于 2015-4-10 12:02:22 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
IIC现在没问题了。但又有新问题,我买了块ST32F405RGT6最小系统版,驱动MPU9150,发现插上JTAG初始化就可以通过,不插就通不过,好奇怪。
回复

使用道具 举报

17

主题

329

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2532
金钱
2532
注册时间
2016-3-6
在线时间
393 小时
发表于 2018-12-27 23:02:37 | 显示全部楼层
岁月已无声 发表于 2015-4-9 19:52
回复【7楼】正点原子:
---------------------------------
求助,原子哥,我用模拟IIC,将SCL和SDA的PB8、P ...

你好,这个问题是怎么解决的呢?
路漫漫其修远兮,吾将上下而求索。
回复

使用道具 举报

10

主题

82

帖子

0

精华

高级会员

Rank: 4

积分
539
金钱
539
注册时间
2017-7-28
在线时间
109 小时
发表于 2018-12-30 07:39:41 来自手机 | 显示全部楼层
用模拟IIC调试一设备,调试了很久也没成功,用示波器查看地址数据都没错,最后用硬件IIC一次成功,不知道问题出在哪了。。。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 21:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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