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

[复制链接]
1710|2
 楼主| cosxpeach 发表于 2014-6-6 09:34 | 显示全部楼层 |阅读模式
  1. 从机在发送完等不到停止信号,一直拉低总线,后来发现是主机没发送停止信号,哪位达人帮看下这个接收函数有问题么。
  2. 上电能接收一次数据,但从机检测不到停止信号也就不释放总线。发送时可以检测停止信号。

  3. uchar IIC_RecvData(uchar * ch,uchar len)                //接收数组
  4. {
  5.         u16 retry=0;
  6.         u16 j;
  7.         I2C_ITConfig( I2C1,I2C_IT_EVT, DISABLE);        //关闭中断
  8.         
  9.         I2C_GenerateSTART(I2C1, ENABLE);// 产生起始条件
  10.         while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))   //读SR1寄存器
  11.         {      
  12.                 if((retry++) >= 10000)   
  13.                 {
  14.                         I2C_ITConfig( I2C1,I2C_IT_EVT, ENABLE);        //打开中断
  15.                         return 1;   
  16.                 }   
  17.                 IWDG_Feed();
  18.         } //清除EV5,起始条件发送成功   
  19.         
  20.         retry=0;
  21.         I2C_Send7bitAddress(I2C1, IIC_AddressS, I2C_Direction_Receiver);//
  22.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))   
  23.         {     
  24.                         if((retry++) >= 10000)   
  25.                         {
  26.                                 //I2C_ITConfig( I2C1,I2C_IT_EVT, ENABLE);        //打开中断
  27.                                 return 2;   
  28.                         }
  29.                         IWDG_Feed();
  30.                         
  31.         } //清除EV6,地址发送成功     
  32.         
  33.         retry=0;
  34.         j=0;
  35.         for(j=0;j<len-1;j++)
  36.         {
  37.                 while(! I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))   
  38.                 {     
  39.                         if((retry++) >= 10000)           
  40.                         {
  41.                                 //I2C_ITConfig( I2C1,I2C_IT_EVT, ENABLE);        //打开中断
  42.                                 return 3;   
  43.                         }
  44.                         IWDG_Feed();
  45.                 }
  46.                 ch[j] = I2C_ReceiveData(I2C1);  //接收一个数据
  47.                 /* 需要应答*/
  48.                 I2C_AcknowledgeConfig(I2C1, ENABLE);

  49.                
  50.         }

  51.         while(! I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))   
  52.         {     
  53.                 if((retry++) >= 10000)           
  54.                 {
  55.                         //I2C_ITConfig( I2C1,I2C_IT_EVT, ENABLE);        //打开中断
  56.                         return 3;   
  57.                 }
  58.                 IWDG_Feed();
  59.         }
  60.         ch[j] = I2C_ReceiveData(I2C1);  //接收一个数据
  61.         
  62.         /* 不需要应答*/
  63.         I2C_AcknowledgeConfig(I2C1,DISABLE);
  64.         //I2C_AcknowledgeConfig(I2C1, ENABLE);

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

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

解决了就好,给大家提供了经验分享;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

54

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部