在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例嵌入式开发 → STC单片机下位机IIC通信

STC单片机下位机IIC通信

嵌入式开发

下载此实例
  • 开发语言:C/C++
  • 实例大小:0.32M
  • 下载次数:17
  • 浏览次数:551
  • 发布时间:2017-06-10
  • 实例类别:嵌入式开发
  • 发 布 人:seedbugeon
  • 文件格式:.rar
  • 所需积分:2
 相关标签: c 通信

实例介绍

/*******************************************************************
                     起动总线函数               
函数原型: void  Start_I2c();  
功能:     启动I2C总线,即发送I2C起始条件.  
********************************************************************/
void Start_I2c()
{
  SDA=1;   /*发送起始条件的数据信号*/
  _nop_();
  SCL=1;     
  delay_5us(); //起始条件建立时间大于4.7us
  SDA=0;   //发送起始信号
  delay_5us(); //起始条件锁定时间大于4us
  SCL=0;   /*钳住I2C总线,准备发送或接收数据 */
  delay_2us();

}

/*******************************************************************
                      结束总线函数               
函数原型: void  Stop_I2c();  
功能:     结束I2C总线,即发送I2C结束条件.  
********************************************************************/
void Stop_I2c()
{
  SDA=0;   //发送结束条件的数据信号
  delay_2us();
  SCL=1;   //发送结束条件的时钟信号
delay_5us(); //结束条件建立时间大于4μ
  SDA=1;   /*发送I2C总线结束信号*/
delay_5us();

}

/*******************************************************************
                 字节数据发送函数               
函数原型: void  SendByte(uchar c);
功能:     将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
          此状态位进行操作.(不应答或非应答都使ack=0)     
       发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
********************************************************************/
void  SendByte(uchar c)
{ uchar BitCnt,count;
  for(BitCnt=0;BitCnt<8;BitCnt )  /*要传送的数据长度为8位*/
    {  
      if(c&0x80)SDA=1;   /*判断发送位*/
        else  SDA=0;                
      delay_2us();
      SCL=1;       //置时钟线为高,通知被控器开始接收数据位
      delay_5us(); //保证时钟高电平周期大于4us
SCL=0;

        c=c<<1;  
    }
    _nop_();
_nop_();
    SDA=1;         /*8位发送完后释放数据线,准备接收应答位*/   
  delay_5us(); 
    delay_5us();   //为了在示波器上更好看出应答时钟,多增加一个延时, 间隔大一点
    SCL=1;
_nop_();
_nop_();
/*********************************************************************************************
由于BQ500414Q工作很忙,应答太慢,动态的不准时,所以做这个保证应答时钟是有效的。如果从端BQ500414Q还
没有应答时,但此时主控MCU把SCL置高了,此时BQ500414Q会拉强行把SCL拉低,一直要到BQ500414Q发出的SDA
应答是有效时,BQ500414Q才会放开对SCL的拉低。这是BQ500414Q与EEPROM的I2C一个差大的差别。
*********************************************************************************************/
    for(count=0;count<100;count )  //等待从端从BUSY状态恢复出来, 放开SCL才能置高.此循环最大延时110uS.
{ if(SCL==1)
break;
_nop_();
}
    delay_2us();  //应答高电平>=4us
delay_2us();  


    if(SDA==1)ack=0;     /*判断是否接收到应答信号*/
       else ack=1;      
    SCL=0;
delay_5us();       

}

/*******************************************************************
                 字节数据接收函数               
函数原型: uchar  RcvByte();
功能:    用来接收从器件传来的数据,并判断总线错误(不发应答信号),
          发完后请用应答函数应答从机。  
********************************************************************/
uchar RcvByte()
{
  uchar retc=0,BitCnt,count; 
  SDA=1;     
delay_5us();   //由于BQ500414Q芯片工作很忙, 延时

  for(BitCnt=0;BitCnt<8;BitCnt )
    {
        SCL=0;                 
delay_5us();   /*时钟低电平周期大于4.7μs*/
        SCL=1;                  
        _nop_();
_nop_();

/*********************************************************************************************
由于BQ***工作很忙,发出数据太慢,动态的不准时,时快时慢。处理完1字节后,有时要大于50us才发下一个字节.
如果从端BQ500414Q还没有发出有效的数据,但此时主控MCU把SCL置高了,此时BQ500414Q会拉强行把SCL拉低,
直要到BQ500414Q发出的SDA是有效时,BQ500414Q才会放开对SCL的拉低。这是BQ500414Q与EEPROM的I2C一个差大的差别。
*********************************************************************************************/
for(count=0;count<100;count )  //等待从端由BUSY状态恢复出来, 放开SCL才能置高.此循环最大延时110mS.
{
if(SCL==1)
break;
_nop_();
}
delay_2us();

        retc=retc<<1;
        if(SDA==1)retc=retc | 1;  
        _nop_();
    
     }
  SCL=0;  
_nop_();
_nop_();
    return(retc);
}

/********************************************************************
                     应答子函数
函数原型:  void Ack_I2c(bit a);
功能:      主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)
********************************************************************/
void Ack_I2c(bit a)
{
  if(a==0)SDA=0;       
        else SDA=1;
delay_5us();
  SCL=1;
    delay_5us();
  SCL=0;                
delay_5us();
}

   
/*******************************************************************
                 用户接口函数                                   
*******************************************************************/

/*******************************************************************
                    向有子地址器件发送多字节数据函数               
函数原型: bit  ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);  
功能:     从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
          地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
          如果返回1表示操作成功,否则操作有误。
注意:    使用前必须已结束总线。
********************************************************************/
uchar ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
{   uchar i;
    if(no == 0)
      return(1);

    Start_I2c();              
    SendByte(sla);             
    if(ack==0)return(0);
    SendByte(suba);            
    if(ack==0)return(0);

    for(i=0;i<no;i )
    {   
      SendByte(*s);            
      if(ack==0)return(0);
      s ;
   } 
   Stop_I2c();                
   return(1);
}


/*******************************************************************
                    向有子地址器件读取多字节数据函数               
函数原型: bit  RecndStr(uchar sla,uchar suba,ucahr *s,uchar no);  
功能:     从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
          地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
          如果返回1表示操作成功,否则操作有误。
注意:    使用前必须已结束总线。
********************************************************************/
bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
{
    uchar i;

    Start_I2c();                 
    SendByte(sla);               
    if(ack==0)return(0);
    SendByte(suba);              
    if(ack==0)return(0);

    Start_I2c();  
    SendByte(sla 1);
    if(ack==0)return(0);

    for(i=0;i<no-1;i )
    {   
      *s=RcvByte();             
      Ack_I2c(0);                
      s ;
   } 
   *s=RcvByte();
   Ack_I2c(1);                   
   Stop_I2c();                    
   return(1);
}

uint8 led_state=0;
static uchar buffer_pld_monitor[32];  //PLD_MONITOR    (Read only – Command 0xD5 ),读数据存放
static uchar buffer_tx_state[32];   //TX_STATS    (Read only – Command 0xD1)),读数据存放

uchar COMM_GetTestvolt()
{
    uchar ret;
    ret = volt_test;
    volt_test = 0;

    return ret;
}

uchar COMM_GetTestamp()
{
    uchar ret;
    ret = amp_test;
    amp_test = 0;

    return ret;
}
uchar COMM_GetTestfod()
{
    uchar ret;
    ret = fod_test;
    fod_test = 0;

    return ret;
}
uchar COMM_GetTestpld()
{
    uchar ret;
    ret = pld_test;
    pld_test = 0;

    return ret;
}
uchar COMM_GetTestsend_power()
{
    uchar ret;
    ret = send_power_test;
    send_power_test = 0;

    return ret;
}
uchar COMM_GetTestrecv_power()
{
    uchar ret;
    ret = recv_power_test;
    recv_power_test = 0;

    return ret;
}
uchar COMM_GetTestvol_det1()
{
    uchar ret;
    ret = vol_det1_test;
    vol_det1_test = 0;

    return ret;
}
uchar COMM_GetTestvol_det2()
{
    uchar ret;
    ret = vol_det2_test;
    vol_det2_test = 0;

    return ret;
}



void ChargeCtrl_Main()
{  
led_state=buffer_tx_state[22];
switch(ch_state)
    {
    case eIDLE:
if(led_state == LED_STATE_PWR_TRANS||led_state == LED_STATE_PWR_CPLT)
{
ch_state=eSTARTED;
charge_flag=1;
}
else
{
;//do nothing
}
break;
    case eSTARTED:
charge_flag=1;
if(led_state == LED_STATE_PWR_TRANS)
{
ch_state=eCHARING;
charge_flag=2;
}
if(led_state == LED_STATE_PWR_CPLT)
{
ch_state=eFULL;
charge_flag=3;
}
if(led_state == LED_STATE_STANDBY)
{
ch_state=eREMOVE;
charge_flag=4;
}
break;
    case eCHARING:
ch_state=2;
if(led_state == LED_STATE_PWR_TRANS)
{
ch_state=eCHARING;
charge_flag=2;
}
else if(led_state == LED_STATE_PWR_CPLT)
{
ch_state=eFULL;
charge_flag=3;
}
else if((led_state == LED_STATE_STANDBY))
{
ch_state=eREMOVE;
charge_flag=4;
}

break;
    case eFULL:
ch_state=3;
if(led_state == LED_STATE_STANDBY)
{
ch_state=eREMOVE;
charge_flag=4;
}
else if(led_state == LED_STATE_PWR_TRANS)
{
ch_state=eSTARTED;
charge_flag=1;
}
                     break;
    default:
break;

    }
}

标签: c 通信

实例下载地址

STC单片机下位机IIC通信

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警