打印

求问I2C忙位的问题

[复制链接]
3674|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tmh1990|  楼主 | 2012-3-25 18:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
I2c, pi, GPIO, gp, IO
我叙述一下目前的困难吧
我现在是用STM32和一个电容触摸屏芯片做毕业设计,才刚开始接触STM32的
电容屏IC有i2c接口,我拿它和stm32的i2c口相连,以接收坐标值。
我用的是普遍的i2c1初始化代码,即
void I2C_GPIO_Config(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;

      

        /* 使能与 I2C1 有关的时钟 */
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);  
      

        /* PB6-I2C1_SCL、PB7-I2C1_SDA*/
        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;               // 开漏输出
        GPIO_Init(GPIOB, &GPIO_InitStructure);
      

        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;               // INT·下拉输入
        GPIO_Init(GPIOE, &GPIO_InitStructure);
      

        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;               // RESET·推挽输出
        GPIO_Init(GPIOE, &GPIO_InitStructure);
}

void I2C_Mode_Configu(void)
{
        I2C_InitTypeDef  I2C_InitStructure;

      

        /* I2C 配置 */
        I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
        I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
        I2C_InitStructure.I2C_OwnAddress1 = I2C1_SLAVE_ADDRESS;
        I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
        I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
        I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;
      

        /* 使能 I2C1 */
        I2C_Cmd(I2C1, ENABLE);
      

        /* I2C1 初始化 */
        I2C_Init(I2C1, &I2C_InitStructure);
      

        /*允许1字节1应答模式*/
        I2C_AcknowledgeConfig(I2C1, DISABLE);   

}

void I2C1_init(void)
{
        I2C_GPIO_Config();

        I2C_Mode_Configu();
}
但执行I2C1_init(void)完了后,再执行while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));就会卡死在这个地方,有时候摆动一下硬件就会走出循环,怎么回事啊?初始化结束后busy位自动置位的吗?

急,请各位指教
沙发
tmh1990|  楼主 | 2012-3-25 18:36 | 只看该作者
是不是我初始化的时候填的I2C_OwnAddress1填错了,所以总线一直是忙的啊?
如果stm32的I2C口不接任何东西的话,我试了一下,也是会卡在while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));这个地方。怎么回事啊?

使用特权

评论回复
板凳
哲哲55| | 2012-3-25 18:42 | 只看该作者
:)

使用特权

评论回复
地板
LAORUAN| | 2012-3-25 20:45 | 只看该作者
你试试先用I2C_Init();再用I2C_Cmd();

还有就是为什么初始化程序中又把应答给关闭了?

使用特权

评论回复
5
tmh1990|  楼主 | 2012-3-25 21:11 | 只看该作者
我听说应答关闭能够使总线不忙,但是其实一个样

使用特权

评论回复
6
304301959| | 2013-1-8 18:31 | 只看该作者
你好,你IIC卡死在while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));的问题解决了吗?

使用特权

评论回复
7
lin34337151| | 2013-5-19 17:38 | 只看该作者
你好,IIC卡的问题解决了吗,我最近也在弄这个,我程序在频繁的读IIC器件,有时候程序会卡死,现在还不知道卡死在哪里了

使用特权

评论回复
8
busdriver| | 2013-5-19 18:14 | 只看该作者
看来硬件I2c真比较难调

使用特权

评论回复
9
outstanding| | 2013-5-20 17:26 | 只看该作者
恩,一般都是软件仿真,STM32的硬件仿真不好使

使用特权

评论回复
10
cjhk| | 2013-5-20 20:10 | 只看该作者
一般都是用软件模拟实现   用硬件   感觉不管是成本   还是速度要求都比较慢   

使用特权

评论回复
11
cjhk| | 2013-5-20 20:10 | 只看该作者
以前   一般都是使用软件模拟   比较简单   成本也比较低   个人的一点意见

使用特权

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

本版积分规则

0

主题

9

帖子

1

粉丝