⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iic.c

📁 是嵌入式处理器
💻 C
字号:
#include <mc9s12e64.h>     /* derivative information */
#include <hidef.h>      /* common defines and macros */
#define NOP {__asm NOP; }


byte TxPacket[256];		// global transmit packet 

char RxIndex=-1;

void IIC_Deal(void);

typedef struct IIC_Struct
{//IIC的各种属性
    unsigned char address;                         //需要写入的地址值
    unsigned char data;                            //写入的数据
    unsigned char index;                           //接收缓冲区的存数偏置        
    unsigned char token;                           //0x00:初始化   
                                                   //0xf0:报文接收完整
}IICserial;

IICserial  IIC_RX[10];              //同时可以接收到的数据队列深度为三


// IIC 中断服务程序 //
void interrupt IIC_Program(void) { 
  byte DummyRead=0;
  IBSR_IBIF=1;            //首先清除该中断标志位
  if(IBSR_IBAL==1)	      //如果有仲裁丢失发生
  {
    IBSR_IBAL=1;          //首先清除该仲裁丢失指示位 
    if(IBSR_IAAS==1)      //当作为从机地址匹配时
    {
       if(IBSR_SRW==1) 		//从机发送,主机向从机读取
       {
         if(IIC_RX[RxIndex].index==1)//表示接收到一个数据,为存储器中的地址
         {
            IBDR = TxPacket[IIC_RX[RxIndex].address];//把下一个要发送的字节写入数据寄存器中
            if(RxIndex==9)
       	     RxIndex=-1;
         } 
         else 
         {
            NOP;          //没有接收到相应的地址,不做处理
         }
       }
       else               //从机接收,主机向从机发送数据
       {
         IBCR_TX_RX =0;   //控制寄存器中,设置为接收模式
         DummyRead=IBDR;  //读一下数据寄存器,以便开始下一次接收
       } 
    } 
  }
  else                    //没有仲裁丢失时
  {
    if(IBSR_IAAS==1)      //当作为从机地址匹配时
    {
       if(IBSR_SRW==1) 		//从机发送,主机向从机读取
       {
         IBCR_TX_RX=1;    //控制寄存器中,设置为发送模式
         if(IIC_RX[RxIndex].index==1)//表示接收到一个数据,为存储器中的地址
         {
            IBDR = TxPacket[IIC_RX[RxIndex].address];//把下一个要发送的字节写入数据寄存器中
            if(RxIndex==9)
       	     RxIndex=-1;
         } 
         else 
         {
            NOP;          //没有接收到相应的地址,不做处理
         }
         
       }
       else 
       {
         IBCR_TX_RX =0;   //控制寄存器中,设置为接收模式
         DummyRead=IBDR;  //读一下数据寄存器,以便开始下一次接收
         RxIndex++;       //指向下一个地址。
         IIC_RX[RxIndex].index=0; //数据检索复位
       }
    }
    else 		              //当不是地址匹配时发生中断
    {
       if(IBCR_TX_RX==1)  //如果模块是发送模式时
       {
         if(IBSR_RXAK==0) //表示接受到了应答信息
         {
            NOP;        
         }
         else               //不能够继续传送 
         {
           IBCR_TX_RX =0;   //设置为接收模式
           DummyRead=IBDR;  //读一下数据寄存器,以便开始下一次接收
         }
       }
       else
       {
       	 if(IIC_RX[RxIndex].index==0)	 //如果是第一个数据,则为地址
       	 {
           IIC_RX[RxIndex].address=IBDR;   
       	 }
       	 
       	 if(IIC_RX[RxIndex].index==1)	 //如果是第一个数据,则为地址
       	 {
           IIC_RX[RxIndex].data=IBDR;  //如果是第二个数据,则为数据
           IIC_RX[RxIndex].token=0xF0; //表示接收到数据,以便以后处理
           IIC_RX[RxIndex].index=0; 
           if(RxIndex==9)
       	     RxIndex=-1;
       	 }
       	 IIC_RX[RxIndex].index++;
       }
    }
  }  
}

//处理IIC通信部分
void IIC_Deal(void) {
  byte i;
  for(i=0;i<10;i++) {
    if (IIC_RX[i].token == 0xF0) //收到了完整报文
    {
      TxPacket[IIC_RX[i].address] =IIC_RX[i].data;
      IIC_RX[i].token=0x00; 	   //报文初始化
    }          
  }
}





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -