7355|17

77

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

STM32F103VCT6的I2C出问题了(好像跟映射有关系),难以解决 [复制链接]

调了好几天了,快崩溃了,下面我把情况说一下:

STM32F103VCT6的PB8\PB9用作I2C1,连接PCF8563,硬件连接是没有问题的,8563的读写函数也没有问题,因为是原来用在RBT6上的软件,区别是按照STM32F103VCT6的手册,PB8\PB9用作I2C1的话是需要重新映射的,这个我也加了,下面我把初始化函数贴上:
void I2C1_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    I2C_InitTypeDef  I2C_InitStructure;
   
    GPIO_PinRemapConfig(GPIO_Remap_I2C1, ENABLE);
   
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8 | GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_OD;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
   
    I2C_InitStructure.I2C_Mode                = I2C_Mode_I2C;
    I2C_InitStructure.I2C_DutyCycle           = I2C_DutyCycle_2;
    I2C_InitStructure.I2C_OwnAddress1         = 0xa2;
    I2C_InitStructure.I2C_Ack                 = I2C_Ack_Enable;
    I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
    I2C_InitStructure.I2C_ClockSpeed          = 100000;
    I2C_Cmd(I2C1, ENABLE);
    I2C_Init(I2C1, &I2C_InitStructure);
}

除了在函数刚开始的地方加了重映射之外,其它都是从RBT6应用成功的项目中复制的代码,所以软件应该是没有问题的,但跑一下发现不成功,难道重新映射这个地方出问题了?实在找不到什么原因了,各路高手帮我分析一下!
此帖出自stm32/stm8论坛

最新回复

                                 好像有区别,如我在11楼所说的现象  详情 回复 发表于 2009-9-16 14:54
点赞 关注
 

回复
举报

67

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
                                 AFIO的时钟开了吗?
此帖出自stm32/stm8论坛
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
void RCC_Configuration(void)
{
    RCC_DeInit();
    RCC_HSEConfig(RCC_HSE_ON);
    if(RCC_WaitForHSEStartUp() == SUCCESS)
    {
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //
        FLASH_SetLatency(FLASH_Latency_1);                    //Flash Access 1 wait states
        RCC_HCLKConfig(RCC_SYSCLK_Div1);                      //HCLK = SYSCLK
        RCC_PCLK2Config(RCC_HCLK_Div1);                       //PCLK2 = HCLK
        RCC_PCLK1Config(RCC_HCLK_Div2);                       //PCLK1 = HCLK/2
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6);  //PLLCLK = 12*6 = 72 MHz
        RCC_PLLCmd(ENABLE);                                   //Enable PLL
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);   //Wait till PLL is ready
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);            //select PLL as system clock source
        while(RCC_GetSYSCLKSource() != 0x08);                 //Wait till PLL is used as system clock source
    }

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA  |
                           RCC_APB2Periph_GPIOB  |
                           RCC_APB2Periph_GPIOC  |
                           RCC_APB2Periph_GPIOD  |
                           RCC_APB2Periph_GPIOE  |
                           RCC_APB2Periph_AFIO   |
                           RCC_APB2Periph_USART1 |
                           RCC_APB2Periph_SPI1   ,
                           ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1   |
                           RCC_APB1Periph_TIM2   ,
                           ENABLE);
}
此帖出自stm32/stm8论坛
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

4
 
我觉得IIC基本上没有什么用途
纯粹忽悠人
此帖出自stm32/stm8论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

5
 
                                 LS请不要把话题叉开
此帖出自stm32/stm8论坛
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

6
 
香版,找到原因了,我觉得这是个很值得注意的问题,别的工程师肯定也会碰到,希望引起下注意

int main(void)
{
    RCC_Configuration();
    NVIC_Configuration();
    I2C1_Configuration();
    GPIO_Configuration();
    ... ...
}
上面这种情况是好使的,下面是不好使的:
int main(void)
{
    RCC_Configuration();
    NVIC_Configuration();
    GPIO_Configuration();
    I2C1_Configuration();
    ... ...
}

原因在 GPIO_Configuration(); 里面,因为I2C端口连接在PB8/PB9,而该函数里面有这样的初始化语句:
   GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6 | GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
好像是二者是有先后顺序的,必须先重映射端口IO,然后才能对IO进行初始化,为什么非要遵循这昂的顺序呢?
此帖出自stm32/stm8论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

7
 
用到了PB8/PB9,与初始化PB6/PB10有什么关系?

原因在 GPIO_Configuration(); 里面,因为I2C端口连接在PB8/PB9,而该函数里面有这样的初始化语句:
   GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6 | GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
此帖出自stm32/stm8论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

8
 
                                 但是颠倒过来就好用,这是为什么呢?
此帖出自stm32/stm8论坛
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

9
 
没有看到你的完整程序,不好判断。

怀疑你的GPIO_Configuration()里面还有其它语句,同时检查一下你的硬件电路,上个图看看。
此帖出自stm32/stm8论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

10
 
完整的GPIO初始化程序:
void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    //485方向切换
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
   
    //iC165, IAP
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6 | GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
   
    //向L4032V输出显示数据
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_All;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
}

硬件很简单,连接肯定没问题
此帖出自stm32/stm8论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

11
 
又有了新发现

int main(void)
{
    RCC_Configuration();
    NVIC_Configuration();
    GPIO_Configuration();
    I2C1_Configuration();
    ... ...
}
上面是原来I2C1不好用的时候的初始化顺序
保持该初始化的顺序不变,只把I2C1_Configuration();内部初始化顺序改变下,原来是
void I2C1_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    I2C_InitTypeDef  I2C_InitStructure;
   
    GPIO_PinRemapConfig(GPIO_Remap_I2C1, ENABLE);
   
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8 | GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_OD;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    ... ...
}
改成
void I2C1_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    I2C_InitTypeDef  I2C_InitStructure;
   
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8 | GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_OD;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    GPIO_PinRemapConfig(GPIO_Remap_I2C1, ENABLE);
    ... ...
}
后就OK了,也就是说映射一个功能之前要先初始化该IO,香主,有这个说法儿么?
此帖出自stm32/stm8论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

12
 
                                 i2c映射 确实有这个问题
此帖出自stm32/stm8论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

13
 
呢,你的问题没有说到点上,  P8P9与你上面的GPIO~ P6,P10 P12没有瓜葛吧?

问题可以解析就是
GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_PinRemapConfig(GPIO_Remap_I2C1, ENABLE);
内部某个可能把GPIO模块复位了~?
还是库~~引起不必要的问题。我猜得。
此帖出自stm32/stm8论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

14
 
                                 我觉得这个问题挺严重,建议香版让你们的开发团队好好研究研究是怎么回事儿,是不是库在这方面有问题
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

15
 
                                 请把你的所有程序和电路图贴出来,我们仔细看看。
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(中级)

16
 
                                 晕,怎么贴图呀
此帖出自stm32/stm8论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

17
 
这个问题我遇到过,Remap之前必须先开启AFIO时钟,否则外设无**常工作,手册上并没有很明确的提到这一点。


代码:AFIO和GPIO同时开启和分开开启均可,USART2都能正常工作。
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);
}
此帖出自stm32/stm8论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

18
 
                                 好像有区别,如我在11楼所说的现象
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表