OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5482|回复: 13

STM32F030硬件IIC 总是死在while (I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET)

[复制链接]

1

主题

2

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2019-6-11
在线时间
9 小时
发表于 2019-10-23 15:27:49 | 显示全部楼层 |阅读模式
1金钱
STM32F030R8T6 使用硬件IIC,总是死在while (I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET),不往下执行,使用的板子没有外挂晶振,使用内部时钟,请大神帮忙赐教

void IIC_Init(void)
{

    GPIO_InitTypeDef GPIO_InitStructure;
    I2C_InitTypeDef I2C_InitStructure;

    RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOB, ENABLE );
    RCC_APB1PeriphClockCmd( RCC_APB1Periph_I2C1, ENABLE );  
    RCC_I2CCLKConfig(RCC_I2C1CLK_SYSCLK);

    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6| GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;   
    GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_OType=GPIO_OType_OD;
    GPIO_Init( GPIOB, &GPIO_InitStructure );   
       
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_1);   
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_1);
       

    I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;     
    I2C_InitStructure.I2C_DigitalFilter=0;  
    I2C_InitStructure.I2C_OwnAddress1 = 0;  
    I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;   
    I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
    I2C_InitStructure.I2C_Timing =0x00901D2B;     
    I2C_InitStructure.I2C_AnalogFilter=I2C_AnalogFilter_Enable;
    I2C_Init( I2C1, &I2C_InitStructure );      
    I2C_Cmd( I2C1, ENABLE );           
}

//*****************************************************
u8 I2C1_ReadByte( u8 id, u8 read_address )
{
    u8 data;

          while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY) != RESET);
       
        I2C_TransferHandling(I2C1, id, 1, I2C_SoftEnd_Mode, I2C_Generate_Start_Write);
       
        while (I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET);
       
        I2C_SendData(I2C1, read_address);
       
        while (I2C_GetFlagStatus(I2C1, I2C_FLAG_TC) == RESET);
       
        I2C_TransferHandling(I2C1, id, 1, I2C_AutoEnd_Mode, I2C_Generate_Start_Read);
       
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_RXNE) == RESET);
       
        data= I2C_ReceiveData(I2C1);
       
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_STOPF) == RESET);
       
        I2C_ClearFlag(I2C1, I2C_ICR_STOPCF);
       
  return data;                                                                                                                               
}
//*****************************************************
void I2C1_WriteByte( u8 id, u8 write_address, u8 data )
{

        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY) != RESET);
       
        I2C_TransferHandling(I2C1,id, 1, I2C_SoftEnd_Mode,I2C_Generate_Start_Write);
       
        while (I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET);
               
        I2C_SendData(I2C1, write_address);
       
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TCR) == RESET);
       
        I2C_TransferHandling(I2C1, id, 1, I2C_AutoEnd_Mode, I2C_Generate_Stop);
       
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET);//if write ok

        I2C_SendData(I2C1, data);
       
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_STOPF) == RESET);
       
        I2C_ClearFlag(I2C1, I2C_ICR_STOPCF);
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2019-10-23 17:31:31 | 显示全部楼层
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2019-11-12
在线时间
2 小时
发表于 2019-11-12 22:48:59 | 显示全部楼层
26262626
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-10-18
在线时间
4 小时
发表于 2019-11-20 16:36:45 | 显示全部楼层
帮顶一下
回复

使用道具 举报

2

主题

474

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6541
金钱
6541
注册时间
2018-6-27
在线时间
551 小时
发表于 2019-12-14 08:57:24 | 显示全部楼层
帮忙顶
回复

使用道具 举报

8

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
292
金钱
292
注册时间
2018-8-14
在线时间
37 小时
发表于 2019-12-14 13:23:31 | 显示全部楼层
使用软件IIC,STM32硬件IIC有BUG,
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-12-14 16:27:53 | 显示全部楼层
Scorpio95 发表于 2019-12-14 13:23
使用软件IIC,STM32硬件IIC有BUG,

是什么BUG?
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-12-14 16:29:52 | 显示全部楼层
本帖最后由 edmund1234 于 2019-12-14 16:31 编辑

加上拉,如果通信距离远的要外部加上拉, 近的就加内部上拉
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL; 改了这一句加上拉

回复

使用道具 举报

4

主题

178

帖子

0

精华

高级会员

Rank: 4

积分
676
金钱
676
注册时间
2019-7-28
在线时间
61 小时
发表于 2020-2-5 22:22:18 | 显示全部楼层
可能是对方硬件地址不配,无应答
回复

使用道具 举报

4

主题

178

帖子

0

精华

高级会员

Rank: 4

积分
676
金钱
676
注册时间
2019-7-28
在线时间
61 小时
发表于 2020-2-6 13:40:02 | 显示全部楼层
请换成: while (I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) != SET);  试试
回复

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2019-12-16
在线时间
34 小时
发表于 2020-3-26 10:21:59 | 显示全部楼层
楼主,你的这个问题解决了吗?可以说一下是如何解决的吗,我的也是在这里就死掉了
回复

使用道具 举报

10

主题

161

帖子

0

精华

高级会员

Rank: 4

积分
750
金钱
750
注册时间
2019-9-5
在线时间
134 小时
发表于 2020-3-26 10:52:08 | 显示全部楼层

不知道,反正大佬们给的例程都是软件模拟IIC
回复

使用道具 举报

3

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2019-11-6
在线时间
74 小时
发表于 2020-6-15 12:00:51 | 显示全部楼层
您好,请问您这个问题现在解决了吗
回复

使用道具 举报

6

主题

305

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2876
金钱
2876
注册时间
2016-7-17
在线时间
404 小时
发表于 2020-11-1 12:46:34 | 显示全部楼层
加个时间限制,计数到时强制退出。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 07:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表