STM32F07用PB8PB9来定义I2C1实现I2C功能

Blossom93 2016-04-28 04:53:17
之前买了一个STM32F207ZGT的开发板,上面用到了I2C1的I2C总线,其中对应管脚为PB6和PB7,看手册之后发现PB8和PB9也能用作I2C1接口,在init的时候有一个 sEE_LowLevel_Init(),里面对于I2C1的管脚有定义。然后我把里面涉及PB6/PB7的管脚定义改成了PB8和PB9,结果I2C总线却不能使用了。示波器看TCK和TDA都没有波形。请问我的代码哪儿有问题,f207是否存在复用的问题,我尝试了加入代码:GPIO_PinRemapConfig(GPIO_Remap_I2C1,ENABLE);显示参数GPIO_Remap_I2C1未定义。

第一段代码,I2C init:
void sEE_Init(void)
{
I2C_InitTypeDef I2C_InitStructure;


sEE_LowLevel_Init();

/*!< I2C configuration */
/* sEE_I2C configuration */

I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;

I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;

I2C_InitStructure.I2C_OwnAddress1 = I2C_SLAVE_ADDRESS7;

I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;

I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;

I2C_InitStructure.I2C_ClockSpeed = I2C_SPEED;

I2C_Cmd(sEE_I2C, ENABLE);
}

第二段代码:sEE_LowLevel_Init:底层的GPIO口和I2C工作模式的定义。
void sEE_LowLevel_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

/*!< sEE_I2C Periph clock enable */
RCC_APB1PeriphClockCmd(sEE_I2C_CLK, ENABLE);

/*!< sEE_I2C_SCL_GPIO_CLK and sEE_I2C_SDA_GPIO_CLK Periph clock enable */
RCC_AHB1PeriphClockCmd(sEE_I2C_SCL_GPIO_CLK | sEE_I2C_SDA_GPIO_CLK, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

/* Reset sEE_I2C IP */
RCC_APB1PeriphResetCmd(sEE_I2C_CLK, ENABLE);

/* Release reset signal of sEE_I2C IP */
RCC_APB1PeriphResetCmd(sEE_I2C_CLK, DISABLE);

/*!< GPIO configuration */
/* Connect PXx to I2C_SCL*/
GPIO_PinAFConfig(sEE_I2C_SCL_GPIO_PORT, sEE_I2C_SCL_SOURCE, sEE_I2C_SCL_AF);
/* Connect PXx to I2C_SDA*/
GPIO_PinAFConfig(sEE_I2C_SDA_GPIO_PORT, sEE_I2C_SDA_SOURCE, sEE_I2C_SDA_AF);

/*!< Configure sEE_I2C pins: SCL */
GPIO_InitStructure.GPIO_Pin = sEE_I2C_SCL_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(sEE_I2C_SCL_GPIO_PORT, &GPIO_InitStructure);
/*!< Configure sEE_I2C pins: SDA */
GPIO_InitStructure.GPIO_Pin = sEE_I2C_SDA_PIN;
GPIO_Init(sEE_I2C_SDA_GPIO_PORT, &GPIO_InitStructure);
}

第三段代码:主要修改管脚定义
#define sEE_I2C I2C1
#define sEE_I2C_CLK RCC_APB1Periph_I2C1
#define sEE_I2C_SCL_PIN GPIO_Pin_8 /* PB.08 */
#define sEE_I2C_SCL_GPIO_PORT GPIOB /* GPIOB */
#define sEE_I2C_SCL_GPIO_CLK RCC_AHB1Periph_GPIOB
#define sEE_I2C_SCL_SOURCE GPIO_PinSource8
#define sEE_I2C_SCL_AF GPIO_AF_I2C1
#define sEE_I2C_SDA_PIN GPIO_Pin_9 /* PB.09 */
#define sEE_I2C_SDA_GPIO_PORT GPIOB /* GPIOB */
#define sEE_I2C_SDA_GPIO_CLK RCC_AHB1Periph_GPIOB
#define sEE_I2C_SDA_SOURCE GPIO_PinSource9
#define sEE_I2C_SDA_AF GPIO_AF_I2C1
...全文
2461 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_36174553 2016-12-13
  • 打赏
  • 举报
回复
sorry,刚没看清楚,你的库和我的版本不一样,你可能就是用AF的那个语句实现复用功能。 我看你 RCC_APB1PeriphResetCmd(sEE_I2C_CLK, DISABLE);把时钟关掉了,clk没信号了就不能读写
qq_36174553 2016-12-13
  • 打赏
  • 举报
回复
我刚调完,是需要开启i2c1 的复用功能,用remap,你那个 GPIO_Remap_I2C1 未定义 ,可能有两个原因,1,你没有include定义的.h 2,你就是没定义 第二个原因一般不会发生, st的库里面有
qq_34830863 2016-04-29
  • 打赏
  • 举报
回复
管脚重映射的使能没开
wl277 2016-04-29
  • 打赏
  • 举报
回复
引用 2 楼 woshi_ziyu的回复:
先把原来的管脚复用功能取消
如何取消呢,GPIO_PinAFConfig是重新映射的函数吧?
wl277 2016-04-29
  • 打赏
  • 举报
回复
引用 4 楼 qq_34830863的回复:
管脚重映射的使能没开
AF不就是复用么?那么如何进行remap
woshi_ziyu 2016-04-28
  • 打赏
  • 举报
回复
先把原来的管脚复用功能取消
wl277 2016-04-28
  • 打赏
  • 举报
回复
是不是要remap一下,网上查了下,至于为什么不能remap和库函数有关?

27,508

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧