打印
[STM32F1]

stm32f1 主机用IIC接收不产生停止信号。

[复制链接]
1465|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cosxpeach|  楼主 | 2014-6-6 09:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
从机在发送完等不到停止信号,一直拉低总线,后来发现是主机没发送停止信号,哪位达人帮看下这个接收函数有问题么。
上电能接收一次数据,但从机检测不到停止信号也就不释放总线。发送时可以检测停止信号。

uchar IIC_RecvData(uchar * ch,uchar len)                //接收数组
{
        u16 retry=0;
        u16 j;
        I2C_ITConfig( I2C1,I2C_IT_EVT, DISABLE);        //关闭中断
        
        I2C_GenerateSTART(I2C1, ENABLE);// 产生起始条件
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))   //读SR1寄存器
        {      
                if((retry++) >= 10000)   
                {
                        I2C_ITConfig( I2C1,I2C_IT_EVT, ENABLE);        //打开中断
                        return 1;   
                }   
                IWDG_Feed();
        } //清除EV5,起始条件发送成功   
        
        retry=0;
        I2C_Send7bitAddress(I2C1, IIC_AddressS, I2C_Direction_Receiver);//
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))   
        {     
                        if((retry++) >= 10000)   
                        {
                                //I2C_ITConfig( I2C1,I2C_IT_EVT, ENABLE);        //打开中断
                                return 2;   
                        }
                        IWDG_Feed();
                        
        } //清除EV6,地址发送成功     
        
        retry=0;
        j=0;
        for(j=0;j<len-1;j++)
        {
                while(! I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))   
                {     
                        if((retry++) >= 10000)           
                        {
                                //I2C_ITConfig( I2C1,I2C_IT_EVT, ENABLE);        //打开中断
                                return 3;   
                        }
                        IWDG_Feed();
                }
                ch[j] = I2C_ReceiveData(I2C1);  //接收一个数据
                /* 需要应答*/
                I2C_AcknowledgeConfig(I2C1, ENABLE);

               
        }

        while(! I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))   
        {     
                if((retry++) >= 10000)           
                {
                        //I2C_ITConfig( I2C1,I2C_IT_EVT, ENABLE);        //打开中断
                        return 3;   
                }
                IWDG_Feed();
        }
        ch[j] = I2C_ReceiveData(I2C1);  //接收一个数据
        
        /* 不需要应答*/
        I2C_AcknowledgeConfig(I2C1,DISABLE);
        //I2C_AcknowledgeConfig(I2C1, ENABLE);

        I2C_GenerateSTOP(I2C1, ENABLE);//产生停止条件  
        //I2C_ITConfig( I2C1,I2C_IT_EVT, ENABLE);        //打开中断
        return 0;
}

沙发
cosxpeach|  楼主 | 2014-6-6 11:09 | 只看该作者
找到问题,主机在接收最后一个字节前需要关闭应答给你发送停止信号。仔细看了例程才知道。
I2C_AcknowledgeConfig(I2C1,DISABLE);
I2C_GenerateSTOP(I2C1, ENABLE);//产生停止条件  

使用特权

评论回复
板凳
mmuuss586| | 2014-6-6 13:17 | 只看该作者

解决了就好,给大家提供了经验分享;

使用特权

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

本版积分规则

18

主题

54

帖子

1

粉丝