打印
[STM32F1]

STM32F103RCT6

[复制链接]
897|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
feiyilingyan|  楼主 | 2015-5-6 13:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
你好
     
我在用STM32 I2C通信的时候发现一个问题,我的STM32是主机,主要是从外部设备读取数据,但是当发送STOP信号后SDA引脚没有上升沿信号,在进行第二次通信的时候就无法通信了。
请问这个问题应该怎样解决呢?下面是我的程序
I2C_GenerateSTART(I2C1, ENABLE);
       
        TIM_Cmd(TIM2, ENABLE);       
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))           //EV5
        {
                if(timeout==1)
                {
                        TIM_Cmd(TIM2, DISABLE);
                        timeout=0;
                        cnt=0;
                        LCD_PutString(10,40,"The device is not responsed",White,Magenta);
                        return;
                }       
                LCD_PutChar(100, 40, 0x30+((StandTime-cnt)&0x0f), Black, Yellow);       
        }
        TIM_Cmd(TIM2, DISABLE);
       
        I2C_Send7bitAddress(I2C1, 0x27<<1, I2C_Direction_Receiver);
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));  //EV6
                /*½ÓÊÜ8 BYTEÊý¾Ý*/
        LCD_PutString(20,40,"The I2C data is:",Black,Yellow);
        for(i=0,col=40;i<2;i++,col+=14)
        {
                while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));         //EV7
                I2C_Receive_Data[i] = I2C_ReceiveData(I2C1);       
                        LCD_PutChar(col, 60, 0x30+((I2C_Receive_Data[i]>>4)&0x0f), Black, Yellow);
                        col+=7;
                        LCD_PutChar(col, 60, 0x30+(I2C_Receive_Data[i]&0x0f), Black, Yellow);               
        }
       
        for(i=2,col=82;i<8;i++,col+=14)
        {
                while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));         //EV7
                I2C_Receive_Data[i] = I2C_ReceiveData(I2C1);
                LCD_PutChar(col, 60, I2C_Receive_Data[i], Black, Yellow);       
        }
       
//        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));         //EV7
        I2C_GenerateSTOP(I2C1, ENABLE);
沙发
feiyilingyan|  楼主 | 2015-5-6 13:54 | 只看该作者
/********************************************************************
                                I2C³õʼ»¯º¯Êý
********************************************************************/
void I2C_Config(void)
{
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);          //ʹÄÜI2C1ʱÖÓ
                /*ÅäÖÃI2C1ºÍI2C2½Ó¿Ú*/
                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);
       
         /* I2C1 configuration ------------------------------------------------------*/
        I2C_Cmd(I2C1, ENABLE);
//        I2C_Cmd(I2C2, ENABLE);
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;                   //I2C×ÜÏßģʽ
//  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;         //¿ìËÙģʽϵÄÕ¼¿Õ±È£¬ÕâÀï²»ÓÃ
//  I2C_InitStructure.I2C_OwnAddress1 = I2C1_SLAVE_ADDRESS7;   //ÉèÖÃ×ÔÉí7λµØÖ·£¬ÕâÀï×÷ΪÖ÷»ú£¬²»ÓÃ×ÔÉíµØÖ·
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;                  //ʹÄÜÓ¦´ð
//  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; //¶¨ÒåÓ¦´ð7λµØÖ·
  I2C_InitStructure.I2C_ClockSpeed = I2CClockSpeed;               
  I2C_Init(I2C1, &I2C_InitStructure);

使用特权

评论回复
板凳
feiyilingyan|  楼主 | 2015-5-6 13:56 | 只看该作者
在发送结束信号后 SDA信号没有上升沿,所以总是在上电后的第二次发送了起始信号后就没有反应。请指教,谢谢!

使用特权

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

本版积分规则

1

主题

3

帖子

1

粉丝