打印

stm32f407 IIC 死在while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));!!!

[复制链接]
13297|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
程序很简单,就是先初始化GPIO,然后模式设置,结果程序就卡在while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));一直不出来。麻烦大家帮我分析一下!
#include <stm32f4xx.h>
static void IIC1_GPIO_Configuration(void)
{
        GPIO_InitTypeDef        GPIO_InitStructure;
        //打开B口的时钟,PB6->SCL,PB7->SDA
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
        //先将对应寄存器配置为缺省值
        GPIO_StructInit(&GPIO_InitStructure);
        //选中6,7管脚
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
        //复用功能
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
        //IIC最大速度为400K
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        //开漏输出
        GPIO_InitStructure.GPIO_OType=GPIO_OType_OD;
        //不带上拉
        GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
        //将IO配置应用于对应寄存器
        GPIO_Init(GPIOB,&GPIO_InitStructure);
        //管脚映射
        GPIO_PinAFConfig(GPIOB,GPIO_Pin_6,GPIO_AF_I2C1);
        GPIO_PinAFConfig(GPIOB,GPIO_Pin_7,GPIO_AF_I2C1);
}
static void IIC1_MODE_Configuration(void)
{
        I2C_InitTypeDef                I2C_InitStrycture;
        //打开IIC1时钟
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
        //典型IIC速度为100K
        I2C_InitStrycture.I2C_ClockSpeed=100000;
        //IIC模式
        I2C_InitStrycture.I2C_Mode=I2C_Mode_I2C;
        //
        I2C_InitStrycture.I2C_DutyCycle=I2C_DutyCycle_2;
        //在STM32作为从机时的应答地址,做主机时不需理会
        I2C_InitStrycture.I2C_OwnAddress1=0x00;
        //使能IIC应答
        I2C_InitStrycture.I2C_Ack=I2C_Ack_Enable;
        //应答地址为7位(从机)
        I2C_InitStrycture.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit;
        //使能IIC
        I2C_Cmd(I2C1,ENABLE);
        //配置寄存器
        I2C_Init(I2C1,&I2C_InitStrycture);
        //允许一字节一应答的时序
        I2C_AcknowledgeConfig(I2C1, ENABLE);
}
void IIC1_Init(void)
{
        IIC1_GPIO_Configuration();
        IIC1_MODE_Configuration();
}
主程序很简单(串口程序就不贴出来了)
        USART1_Init();
        IIC1_Init();
        printf("\r\n 开始测试        \n\r");
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
        printf("写入数据\n\r");
就这么简短的几句话,卡在那里了。配置检查了很久都没有看出问题来!
沙发
uet_cache| | 2013-1-6 16:08 | 只看该作者
经验教训,反正以后用STM32做IIC,我都用软件模拟,,

使用特权

评论回复
板凳
304301959|  楼主 | 2013-1-6 16:10 | 只看该作者
是说IIC不好用,但也没见过死在这个函数的

使用特权

评论回复
地板
uet_cache| | 2013-1-6 16:11 | 只看该作者
经常死在类似这样的WHILE语句上。。

使用特权

评论回复
5
304301959|  楼主 | 2013-1-6 16:15 | 只看该作者
只是觉得407应该会好吧

使用特权

评论回复
6
sunnyhey| | 2013-2-4 16:28 | 只看该作者
你的硬件电路板要接地

使用特权

评论回复
7
liulangmao| | 2013-4-16 22:56 | 只看该作者
楼主解决了吗,我也有同样的问题,是初始化代码的毛病吗,我仿真的时候发现是在开启I2C时钟的时候busy位置位的,如何解决的呢,求告知。

使用特权

评论回复
8
hqfmcu201| | 2013-6-4 15:17 | 只看该作者
你好,哥们,你这个问题解决没有.我在用CPAL I2C 库来搞STM32F303时也遇到死等的问题.请教你一下

使用特权

评论回复
9
jerry_wtl| | 2013-6-5 10:17 | 只看该作者
本帖最后由 jerry_wtl 于 2013-6-5 10:22 编辑

用万用表或示波器看一下SCL,SDA是不是都位高电平,如果不是检查电路....
看文档说i2c初始化后要清除一下标志位(记不清楚了,不太确定),因为你程序用库而不是直接操作寄存器,所以不知道是不是这个原因,楼主自己试一下吧。

使用特权

评论回复
10
prayerwind| | 2013-6-5 15:19 | 只看该作者
hqfmcu201 发表于 2013-6-4 15:17
你好,哥们,你这个问题解决没有.我在用CPAL I2C 库来搞STM32F303时也遇到死等的问题.请教你一下 ...

CPAL库有问题吗,可以详细描述下吗,我在用STM32F4的CPAL库中运行是正常的。

使用特权

评论回复
11
feng_710| | 2013-6-5 16:24 | 只看该作者
确实不该死在这个地方,是不是硬件问题导致总线busy

使用特权

评论回复
12
hqfmcu201| | 2013-6-9 10:03 | 只看该作者
prayerwind 发表于 2013-6-5 15:19
CPAL库有问题吗,可以详细描述下吗,我在用STM32F4的CPAL库中运行是正常的。 ...

我用的是STM32F303的库,第一次用.好象是没有进入DMA中断中.

使用特权

评论回复
13
a20060341039| | 2013-12-20 13:38 | 只看该作者
讨厌STM32的iic,用库就没有成功过

使用特权

评论回复
14
451506709| | 2013-12-20 14:12 | 只看该作者
试试这种形式:
void Send_Byte()

        while(!((USART1->ISR)&(1<<7)));
        USART1->TDR=c;       

使用特权

评论回复
15
451506709| | 2013-12-20 14:15 | 只看该作者
发送字符串:
void Send_String(char *s )
{
        while (*s)
        uart_putc(*s++);
}
以上两个函数都是在STM32F030C8T6和STMSTM32F030F4P6下测试过,没有问题。

使用特权

评论回复
16
it_yrj| | 2014-1-15 10:49 | 只看该作者
我之前测试能通过,今天就挂在这了,我*,这还靠运气不成?

使用特权

评论回复
17
仙人球W| | 2014-11-7 13:53 | 只看该作者
用的野火II2C EEPROM程序 挂在while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY)); // Added by Najoua                总线忙标志位
能写不能读 不知道问题在哪里? 怎么释放总线

使用特权

评论回复
18
jia.yingk| | 2015-6-29 13:39 | 只看该作者

这个位置不对!

使用特权

评论回复
19
西门看雪| | 2015-6-29 16:14 | 只看该作者
it_yrj 发表于 2014-1-15 10:49
我之前测试能通过,今天就挂在这了,我*,这还靠运气不成?

被坑了吧?稍微有点儿干扰,就等着一直busy吧。

使用特权

评论回复
20
捉虫天师| | 2015-6-29 18:41 | 只看该作者
以后用STM32做IIC,我都用软件模拟;P

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

11

帖子

0

粉丝