OpenEdv-开源电子网

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

STM32F407的I2C问题,程序一直卡死,能指导下吗?

[复制链接]

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2020-3-7
在线时间
12 小时
发表于 2020-6-6 17:57:00 | 显示全部楼层 |阅读模式
程序一直卡死在红色位置,很疑惑,大神能帮我指导下吗?感激!

uint32_t count=0xFFFFF;

void Error_Test(u32 number);

void I2C_GPIOConfig(void)
{
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
       
        GPIO_InitTypeDef  GPIO_InitStruct;
        I2C_InitTypeDef   I2C1_InitStruct;
       
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_I2C1);
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_I2C1);
       
        u32 timeout;
        //I2C引脚配置
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8;
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;
        GPIO_InitStruct.GPIO_OType=GPIO_OType_OD;
        GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;
        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStruct);
       
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;
        GPIO_Init(GPIOB,&GPIO_InitStruct);
       
       
        //利用结构体配置I2C相关参数
        I2C1_InitStruct.I2C_Ack=ENABLE;
        I2C1_InitStruct.I2C_ClockSpeed=400000;
        I2C1_InitStruct.I2C_DutyCycle=I2C_DutyCycle_2;
        I2C1_InitStruct.I2C_Mode=I2C_Mode_I2C;
        I2C1_InitStruct.I2C_OwnAddress1=0XEB;
        I2C1_InitStruct.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit;
        I2C_Init(I2C1,&I2C1_InitStruct);
        I2C_Cmd(I2C1,ENABLE);
}
void I2C_WriteByteConfig(u32 data,u8 Write_addr)
{
u32 timeout=count;
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY)==1)
        {
           if((timeout--)==0)
                         Error_Test(0);
        }
        I2C_GenerateSTART(I2C1,ENABLE);
        timeout=count;
        while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)==ERROR)
        {
             if((timeout--)==0)
                         Error_Test(1);
        }
       
        I2C_Send7bitAddress(I2C1,0XA0,I2C_Direction_Transmitter);
        timeout=count;
        while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)==ERROR)
        {
            if((timeout--)==0)
                         Error_Test(2);
        }
       
        I2C_SendData(I2C1,Write_addr);
        timeout=count;
        while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)==ERROR)
        {
           if((timeout--)==0)
                         Error_Test(3);
        }
       
        I2C_SendData(I2C1,data);
                timeout=count;
        while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)==ERROR)
        {
            if((timeout--)==0)
                         Error_Test(4);
        }
       
        I2C_GenerateSTOP(I2C1,ENABLE);
       
}
void I2C_ReadByte(u32* pbuffer,u8 Readaddr)
{
        u32 timeout=count;
  while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY)==1)
        {
            if((timeout--)==0)
                         Error_Test(5);
        }
       
        I2C_GenerateSTART(I2C1,ENABLE);
        timeout=count;
        while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)==ERROR)
        {
            if((timeout--)==0)
                         Error_Test(6);
        }
       
        I2C_Send7bitAddress(I2C1,0XA1,I2C_Direction_Transmitter);
        timeout=count;
        while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)==ERROR)
        {
            if((timeout--)==0)
                         Error_Test(7);
        }
       
        I2C_Cmd(I2C1,ENABLE);
       
        I2C_SendData(I2C1,Readaddr);
        timeout=count;
        while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED))
        {
            if((timeout--)==0)
                         Error_Test(8);
        }
       
        I2C_GenerateSTART(I2C1,ENABLE);
        timeout=count;
        while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)==ERROR)
        {
          if((timeout--)==0)
                         Error_Test(9);
        }
        I2C_Send7bitAddress(I2C1,0XA0,I2C_Direction_Receiver);
        timeout=count;
        while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)==ERROR)       
  {
           if((timeout--)==0)
                         Error_Test(10);
        }
        I2C_AcknowledgeConfig(I2C1,DISABLE);
        timeout=count;
        while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED)==RESET)
        {
           if((timeout--)==0)
                         Error_Test(11);
        }
        (*pbuffer)=I2C_ReceiveData(I2C1);
       
        I2C_GenerateSTOP(I2C1,ENABLE);
}

void Error_Test(u32 number)
{
  printf("Code Error! The code number is %d",number);
}

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

使用道具 举报

0

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2020-4-2
在线时间
35 小时
发表于 2020-6-17 19:33:56 | 显示全部楼层
听说STM32的iic是有缺陷的,可能死机,探索者都是软件IIC的
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-1 08:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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