你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

IIC通讯,总是是在 while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMIT...

[复制链接]
watercici 提问时间:2018-2-27 08:53 /
IIC通讯,总是是在        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));里面,不知道为什么,感觉上是没等到响应,我想问一下,STM32用库函数写IIC通信,等待ACK,用写中断服务函数吗?

点评

下次发求助好了哦,已移动  发表于 2018-2-27 09:05
收藏 1 评论27 发布时间:2018-2-27 08:53

举报

27个回答
watercici 回答时间:2018-2-27 09:38:56
安 发表于 2018-2-27 09:19
楼主最好贴一下整个过程,从开始到最后的I2C通讯过程。

void RTC_Init(void)
{
        I2C_Initial();
        PCF8563_Init();
}

void PCF8563_Init(void)
{
        I2C_Write(PCF8563_CONTRL_STATE_1,0x00);//оƬ¹¤×÷ÔÚÆÕͨģʽ£¬Ð¾Æ¬Ê±ÖÓÔËÐÐ
        I2C_Write(PCF8563_CONTRL_STATE_2,0x00);//AIE,TIEÖжϽûÖ¹
       
        I2C_Write(PCF8563_SENCOND_AE_REGISTER,0x80);//·ÖÖÓ±¨¾¯ÎÞЧ
        I2C_Write(PCF8563_HOUR_AE_REGISTER,0x80);//ʱ±¨¾¯ÎÞЧ
        I2C_Write(PCF8563_DAY_AE_REGISTER,0x80);//ÈÕ±¨¾¯ÎÞЧ
        I2C_Write(PCF8563_WEEK_AE_REGISTER,0x80);//Öܱ¨¾¯ÎÞЧ
       
        I2C_Write(PCF8563_TIME_CONTRL,0x82);//ʹÄܶ¨Ê±¼ÆÊýÆ÷£d¶¨Ê±Ê±ÖÓÆµÂʵÄÑ¡ÔñΪ1hz
       
        I2C_Write(PCF8563_TIME_COUNT_DOWN,0x3C);//µ¹¼ÆÊýÖÜÆÚΪ1s = 60/1HZ£¬£¿£¿£¿£¿£¿£¿£¿£¿£¿£¿£¿
       
        I2C_Write(PCF8563_MONTH_REGISTER,0x00);//Ô¼ĴæÆ÷×î¸ßλд0£¬±íʾ20ÊÀ¼Í
}
void I2C_Initial(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
        I2C_InitTypeDef I2C_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
        //------------RTC_SDA->PB_11\RTC_SCL->PB_10----------------------------------------
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
       
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        //------------I2C_INIT--------------------------------------------
        I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;//ÉèÖÃΪI2Cģʽ
        I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
        I2C_InitStructure.I2C_OwnAddress1 = PCF8563_ADDR_W;//I2CµÄ´ÓµØÖ·ºÍPCF8563µÄдµØÖ·ÊÇÒ»¸öµØÖ·Â𣿣¿£¿£¿£¿
        I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;//ʹÄÜÓ¦´ð
        I2C_InitStructure.I2C_ClockSpeed = I2C_Speed; //400000hz
        I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;//Ó¦´ð7λµØÖ·
       
        I2C_Init(I2C1,&I2C_InitStructure);
        //---------NVIC_INIT----------------------------------------------------

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//ÓÅÏȼ¶·Ö×é
        NVIC_InitStructure.NVIC_IRQChannel = I2C1_EV_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
       
        NVIC_Init(&NVIC_InitStructure);
       
        I2C_Cmd(I2C1,ENABLE);
       
}

void I2C_Write(u8 WriteAddr,u8 Dat)
{
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
       
        I2C_GenerateSTART(I2C1,ENABLE);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
       
        I2C_Send7bitAddress(I2C1,PCF8563_ADDR_W,I2C_Direction_Transmitter);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
       
        I2C_SendData(I2C1,WriteAddr);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
       
        I2C_SendData(I2C1,Dat);

        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));

        I2C_GenerateSTOP(I2C1,ENABLE);
}

u8 I2C_Read(u8 ReadAddr)
{
        u8 a;
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
       
        I2C_GenerateSTART(I2C1,ENABLE);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
       
        I2C_Send7bitAddress(I2C1,PCF8563_ADDR_W,I2C_Direction_Transmitter);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
       
        I2C_SendData(I2C1,ReadAddr);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
       
        I2C_GenerateSTART(I2C1,ENABLE);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
       
        I2C_Send7bitAddress(I2C1,PCF8563_ADDR_R,I2C_Direction_Receiver);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
       
        a = I2C_ReceiveData(I2C1);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED))
          
        I2C_AcknowledgeConfig(I2C1,DISABLE);
  I2C_GenerateSTOP(I2C1,ENABLE);               
       
        I2C_AcknowledgeConfig(I2C1,ENABLE);
       
        return a;
}


void I2C_Write_nByte(u8 WriteAddr,u8* Dat, u8 NumByte)
{
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
       
        I2C_GenerateSTART(I2C1,ENABLE);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
       
        I2C_Send7bitAddress(I2C1,PCF8563_ADDR_W,I2C_Direction_Transmitter);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
       
        I2C_SendData(I2C1,WriteAddr);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
       
        while(NumByte--)
        {
                I2C_SendData(I2C1,*Dat);
                Dat++;
                while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
        }
        I2C_GenerateSTOP(I2C1,ENABLE);
}

void I2C_Read_nByte(u8 ReadAddr,u8* Buffer,u8 NumByte)
{
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
       
        I2C_GenerateSTART(I2C1,ENABLE);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
       
        I2C_Send7bitAddress(I2C1,PCF8563_ADDR_W,I2C_Direction_Transmitter);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
       
        I2C_SendData(I2C1,ReadAddr);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
       
        I2C_GenerateSTART(I2C1,ENABLE);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
       
        I2C_Send7bitAddress(I2C1,PCF8563_ADDR_R,I2C_Direction_Receiver);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
       
        while(NumByte)
        {
                if(NumByte == 1)
                {
                        I2C_AcknowledgeConfig(I2C1,DISABLE);
                        I2C_GenerateSTOP(I2C1,ENABLE);
                }
                if(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED))
                {
                        *Buffer = I2C_ReceiveData(I2C1);
                        Buffer++;
                        NumByte--;
                }
               
        }
        I2C_AcknowledgeConfig(I2C1,ENABLE);
}
watercici 回答时间:2018-2-27 09:07:03
好的,不好意思,我给选错了,谢谢您的提醒。
Tcreat 回答时间:2018-2-27 09:17:22
如果没有开启中断 是不需要中断服务函数的  基本就是通过while 等待相应的事件发生  如果硬件 读写程序都没有问题的话  没有响应的话  可能就是你等待的事件不对

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

回答时间:2018-2-27 09:19:08
楼主最好贴一下整个过程,从开始到最后的I2C通讯过程。

评分

参与人数 1蝴蝶豆 +1 收起 理由
zero99 + 1

查看全部评分

toofree 回答时间:2018-2-27 09:38:27
本帖最后由 toofree 于 2018-2-27 11:55 编辑

好好整理一下问题吧。
用的哪个型号的MCU,具体型号?用的哪个版本的库?要控制的IIC外设是什么?

我只能告诉你,我在第一次用I2C读写EEPROM AT24CXX的时候,也遇到过类似这样的死循环出不来的问题,是有办法解决的。
解决方法大致有三种:
1、IO模拟I2C
2、操作完后,不能马上去读标志位,得延时一小会儿
3、while()循环中,增加一个超时退出自加变量

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

watercici 回答时间:2018-2-27 09:41:08
安 发表于 2018-2-27 09:19
楼主最好贴一下整个过程,从开始到最后的I2C通讯过程。

void RTC_Init(void)
{
        I2C_Initial();
        PCF8563_Init();
}

void PCF8563_Init(void)
{
        I2C_Write(PCF8563_CONTRL_STATE_1,0x00);
        I2C_Write(PCF8563_CONTRL_STATE_2,0x00);
       
        I2C_Write(PCF8563_SENCOND_AE_REGISTER,0x80);
        I2C_Write(PCF8563_HOUR_AE_REGISTER,0x80);
        I2C_Write(PCF8563_DAY_AE_REGISTER,0x80);
        I2C_Write(PCF8563_WEEK_AE_REGISTER,0x80);
       
        I2C_Write(PCF8563_TIME_CONTRL,0x82);
       
        I2C_Write(PCF8563_TIME_COUNT_DOWN,0x3C);
       
        I2C_Write(PCF8563_MONTH_REGISTER,0x00);
}
void I2C_Initial(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
        I2C_InitTypeDef I2C_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
        //------------RTC_SDA->PB_11\RTC_SCL->PB_10----------------------------------------
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
       
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        //------------I2C_INIT--------------------------------------------
        I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
        I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
        I2C_InitStructure.I2C_OwnAddress1 = PCF8563_ADDR_W;
        I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
        I2C_InitStructure.I2C_ClockSpeed = I2C_Speed; //400000hz
        I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
       
        I2C_Init(I2C1,&I2C_InitStructure);
        //---------NVIC_INIT----------------------------------------------------

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_InitStructure.NVIC_IRQChannel = I2C1_EV_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
       
        NVIC_Init(&NVIC_InitStructure);
       
        I2C_Cmd(I2C1,ENABLE);
       
}

void I2C_Write(u8 WriteAddr,u8 Dat)
{
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
       
        I2C_GenerateSTART(I2C1,ENABLE);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
       
        I2C_Send7bitAddress(I2C1,PCF8563_ADDR_W,I2C_Direction_Transmitter);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
       
        I2C_SendData(I2C1,WriteAddr);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
       
        I2C_SendData(I2C1,Dat);

        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));

        I2C_GenerateSTOP(I2C1,ENABLE);
}

u8 I2C_Read(u8 ReadAddr)
{
        u8 a;
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
       
        I2C_GenerateSTART(I2C1,ENABLE);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
       
        I2C_Send7bitAddress(I2C1,PCF8563_ADDR_W,I2C_Direction_Transmitter);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
       
        I2C_SendData(I2C1,ReadAddr);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
       
        I2C_GenerateSTART(I2C1,ENABLE);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
       
        I2C_Send7bitAddress(I2C1,PCF8563_ADDR_R,I2C_Direction_Receiver);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
       
        a = I2C_ReceiveData(I2C1);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED))
          
        I2C_AcknowledgeConfig(I2C1,DISABLE);
  I2C_GenerateSTOP(I2C1,ENABLE);               
       
        I2C_AcknowledgeConfig(I2C1,ENABLE);
       
        return a;
}


void I2C_Write_nByte(u8 WriteAddr,u8* Dat, u8 NumByte)
{
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
       
        I2C_GenerateSTART(I2C1,ENABLE);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
       
        I2C_Send7bitAddress(I2C1,PCF8563_ADDR_W,I2C_Direction_Transmitter);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
       
        I2C_SendData(I2C1,WriteAddr);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
       
        while(NumByte--)
        {
                I2C_SendData(I2C1,*Dat);
                Dat++;
                while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
        }
        I2C_GenerateSTOP(I2C1,ENABLE);
}

void I2C_Read_nByte(u8 ReadAddr,u8* Buffer,u8 NumByte)
{
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
       
        I2C_GenerateSTART(I2C1,ENABLE);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
       
        I2C_Send7bitAddress(I2C1,PCF8563_ADDR_W,I2C_Direction_Transmitter);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
       
        I2C_SendData(I2C1,ReadAddr);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
       
        I2C_GenerateSTART(I2C1,ENABLE);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
       
        I2C_Send7bitAddress(I2C1,PCF8563_ADDR_R,I2C_Direction_Receiver);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
       
        while(NumByte)
        {
                if(NumByte == 1)
                {
                        I2C_AcknowledgeConfig(I2C1,DISABLE);
                        I2C_GenerateSTOP(I2C1,ENABLE);
                }
                if(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED))
                {
                        *Buffer = I2C_ReceiveData(I2C1);
                        Buffer++;
                        NumByte--;
                }
               
        }
        I2C_AcknowledgeConfig(I2C1,ENABLE);
}
watercici 回答时间:2018-2-27 09:48:01
toofree 发表于 2018-2-27 09:38
好好整理一下问题吧。
用的哪个型号的MCU,具体型号?用的哪个版本的库?要控制的IIC外设是什么?

MCU:stm32f103rbt,库:CMSIS Cortex-M3 Core V1.30,IIC外设:PCF8563
回答时间:2018-2-27 09:56:09
407的我测试过可以的,过程和你的一样,103以前我用的是模拟I2C,硬件好像有点问题。不知道后来大家都是使用硬件还是模拟了。大家一块讨论一下吧。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

wenyangzeng 回答时间:2018-2-27 10:01:11
还是用软件模拟IIC比较可靠。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

123下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版