打印
[应用相关]

请教香帅--i2c从设备的问题

[复制链接]
2825|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sure_2011|  楼主 | 2009-7-8 21:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问香帅:通过论坛上帖子了解到STM32的硬件i2c不容易用。我现在想把STM32作为i2c的一个从设备,模拟?还是修改从该论坛下载的i2c库?有什么建议或资料?谢谢!!
沙发
香水城| | 2009-7-8 21:12 | 只看该作者

你可以使用置顶的那个帖子中的封装库

使用特权

评论回复
板凳
sure_2011|  楼主 | 2009-7-10 13:45 | 只看该作者

i2c从设备的问题

如果主从i2c都用模拟的,SCL和SDA上还需要分别加上拉电阻吗?

使用特权

评论回复
地板
香水城| | 2009-7-10 14:21 | 只看该作者

按照I2C的协议,SCL和SDA上需要分别加上拉电阻

不管是什么样的方式。

使用特权

评论回复
5
sure_2011|  楼主 | 2009-7-14 14:52 | 只看该作者

请问香帅

这个硬件i2c看来我的确调不来了...两个板子一个主一个从,不修改任何配置,从的在主循环里收然后等,主的在主循环里发然后等。上拉电阻也接了,还是不行。
我想采用从模拟,现在模拟程序基本写好,用DM2410做主循环发,STM32收。从模拟函数在主循环里一直收,2410要发3、4次,ST才能收到。不知道什么原因?
i2c_deal()
 {           
     PreState = READ_SDA() ;   //读取SDA
    while( READ_CLK()&&NN--)  //若SCL=1 再次对SDA
    {
      NowState = READ_SDA() ;
      
      if( PreState && !NowState ) //由高到低 start signal
        START_flag = 1;
      
      else if( !PreState && NowState )//由低到高 stop signal
      {
        STOP_flag = 1 ;
         break ; //收到停止信号退出
      }
      PreState = NowState ;
      
  /********************Start*************************/     
      if( START_flag ) //刚产生起始条件
      {
        START_flag = 0 ;   

        while( READ_CLK() ); //等待START时的SCL高电平状态结束
        
        for(num=8;num>0;num--) //接收器件地址 
        { 
          while( !READ_CLK() ); //SCL低电平状态就等待其变高时数据才有效 
          DEVICE_ADR<<=1; 
          if( READ_SDA() ) //数据的第一个CLK高电平来临 
          DEVICE_ADR |= 0x01; 
          while( READ_CLK() ); //SCL高电平状态就等待其变低 
        } 
  /*************************ACK********************/      
        //判断是自己的地址给予应答
        if( (DEVICE_ADR) == I2C1_SLAVE_ADDRESS7 )
        {
          ACK();
        } 
        else //不是自己的地址,直接退出
        {
          break;
        }
  /************************************************/
////////////  接收单元地址
         暂时不用
///////////
/////////////////////  开始data_to_rec = 7字节接收数据 /////////////////
        if( !(DEVICE_ADR & 0x01) )//主发从收,即IIC从设备进行命令的接收
        {
          do{          
              for(num=8;num>0;num--) //接收数据位 
              { 
                while( !READ_CLK() ); //SCL低电平状态就等待其变高时数据才有效 
                REC_DATA<<=1; 
                if( READ_SDA() ) //数据的第一个CLK高电平来临 
                REC_DATA |= 0x01; 
                while( READ_CLK() ); //SCL高电平状态就等待其变低 
              } 
            
             /*************************ACK********************/ 
              ACK();
              iic_data[data_num++] = REC_DATA ; //将收到的这个字节的内容先存起来
             /************************************************/  
         }while( data_to_rec-- > 0 );                   
        }
        
      }//if        
    } //while
}

使用特权

评论回复
6
it_yrj| | 2014-1-15 14:19 | 只看该作者
ST I2C真是各种问题啊

使用特权

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

本版积分规则

2

主题

11

帖子

0

粉丝