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

2019-07-21 06:19发布

    现在大家可能用的都是模拟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又要配置成什么模式呢?仅仅是复用输出吗??

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
正点原子
1楼-- · 2019-07-21 06:54
和M3一样,我们例程:
常态是推挽输出,都输出1就是了.SCL铁定是这个了.
当需要读数据的时候,设置为带上拉的输入模式即可.
岁月已无声
2楼-- · 2019-07-21 08:01
回复【10楼】岁月已无声:
---------------------------------
回复【9楼】正点原子:
---------------------------------
哈哈,我傻逼了,我买的这MPU9150模块是5V供电的,我突然发现我一直给它供3.3V。现在没问题了。
廖伟
3楼-- · 2019-07-21 11:54
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;这里写成GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;也可以。
廖伟
4楼-- · 2019-07-21 17:13
回复【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里的程序是没有错的。
廖伟
5楼-- · 2019-07-21 20:57
 精彩回答 2  元偷偷看……
廖伟
6楼-- · 2019-07-22 01:36
回复【3楼】正点原子:
---------------------------------
上面的程序中SDA_IN() 要配置为模拟输入才可以应答,但是读出来的数据都是0

一周热门 更多>