//===========================================================================
//文件名称：isr.c
//功能概要： 中断底层驱动构件源文件
//版权所有：苏州大学飞思卡尔嵌入式中心(sumcu.suda.edu.cn)
//更新记录：2012-11-12   V1.0
//===========================================================================
#include "includes.h"

//========================中断函数服务例程===================================

extern uint_8 j;
extern uint_8 buf[20];
extern uint_8 visitaddr;
extern uint_8 flag;
//=====================================================================
//函数名: UART1_IRQHandler
//功  能: 串口1接收中断服务例程
//参  数: 无
//返  回: 无
//说  明: 需要启动中断并注册才可使用
//=====================================================================
void UART1_IRQHandler(void)
{
    uint_8 ch;
    uint_8 flag = 1;
    
    DISABLE_INTERRUPTS;
    
    ch = uart_re1(UART_1, &flag);
    if (0 == flag)
    {
        uart_send1(UART_1, ch);
    }
 
    ENABLE_INTERRUPTS;
}

//=====================================================================
//函数名称：i2c0_wait
//功能概要： 在时限内,循环检测接收应答标志位,或传送完成标志位,判断MCU
//       是否接收到应答信号或一个字节是否已在总线上传送完毕
//参数说明：
//       x:x = 'T'(Transmission),等待一个字节         数据传输完成
//函数返回：0:收到应答信号或一个字节传送完毕;
//      1:未收到应答信号或一个 字节没传送完
//=====================================================================
uint_8 i2c0_wait(uint_8 x)
{
    uint_16 ErrTime, i;
    ErrTime = 255*10;            //定义查询超时时限
    for (i = 0;i < ErrTime;i++)
    {
          if (x == 'T')           //等待传送完成一个字节信号
          {
        	  //中断标志位置1表明1个字节接收完成
               if ((I2C0_S & I2C_S_IICIF_MASK) != 0)
               {
                       I2C0_S |=I2C_S_IICIF_MASK;   //清IICIF标志位
                       return 0;        //成功发送完一个字节
                }
           }
    }
    if (i >= ErrTime)
         return 1;                //超时,没有收到应答信号或发送完一个字节
}

//=====================================================================
//函数名称：i2c1_wait
//功能概要： 在时限内,循环检测接收应答标志位,或传送完成标志位,判断MCU
//       是否接收到应答信号或一个字节是否已在总线上传送完毕
//参数说明：
//       x:x = 'T'(Transmission),等待一个字节         数据传输完成
//函数返回：0:收到应答信号或一个字节传送完毕;
//      1:未收到应答信号或一个 字节没传送完
//=====================================================================
uint_8 i2c1_wait(uint_8 x)
{
    uint_16 ErrTime, i;
    ErrTime = 255*10;            //定义查询超时时限
    for (i = 0;i < ErrTime;i++)
    {
          if (x == 'T')           //等待传送完成一个字节信号
          {
        	  //中断标志位置1表明1个字节接收完成
               if ((I2C1_S & I2C_S_IICIF_MASK) != 0)
               {
                       I2C1_S |=I2C_S_IICIF_MASK;   //清IICIF标志位


                       return 0;        //成功发送完一个字节
                }
           }
    }
    if (i >= ErrTime)
         return 1;                //超时,没有收到应答信号或发送完一个字节
}

//=====================================================================
//函数名称：I2C0_IRQHandler
//功能概要： I2C0中断服务程序，其负责接收主机发送过来的数据并置位flag标志，通知main中主循环
//打印该数据
//参数说明：
//       x:x = 'T'(Transmission),等待一个字节        数据传输完成
//函数返回： 无
//=====================================================================
void I2C0_IRQHandler(void)
{
        uint_8 i;
        uint_8 data;
        DISABLE_INTERRUPTS;
        if(i2c0_wait('T'))            //等待一个数据传送完成
        {
            i=I2C0_D;               //读出IIC1D,准备接收数据
            goto lab;
        }
        //if((I2C0_S & 0x40)!=0)      //主机发送的地址与本机的默认地址匹配
        if((I2C0_S & I2C_S_IAAS_MASK)!=0) //主机发送的地址与本机的默认地址匹配
        {
            i=I2C0_S & I2C_S_SRW_MASK;
            if(0!=j)
            {
                   j=0;
                 goto lab;
             }
            BCLR(I2C_C1_TX_SHIFT,I2C0_C1);  //TX = 0,MCU设置为接收模式
             i=I2C0_D;                //读出IIC1D,准备接收数据
              j++;
         }
        else                         //接收到的为数据
        {
            if(1==j)                 //接收到主机发送过来的访问地址
           {
               visitaddr=I2C0_D;    //读出IIC1D,准备接收数据
               j++;goto lab;
            }
            if(2==j)                 //接收到主机发送过来的数据
            {
               data=I2C0_D;         //读出IIC1D,准备接收数据
               j++;
             }
             //如果从机地址匹配、访问地址与数据均接收到则将接收到的数据存入buf数组
             if(3==j)
            {
               buf[visitaddr]=data;
               flag=1;              //置位该标志表明成功接收到主机发送过来的数据
             }
            j=0;
         }
         lab:
         ENABLE_INTERRUPTS;
}

//=====================================================================
//函数名称：I2C1_IRQHandler
//功能概要： I2C1中断服务程序，其负责接收主机发送过来的数据并置位flag标志，通知main中主循环
//打印该数据
//参数说明：
//       x:x = 'T'(Transmission),等待一个字节        数据传输完成
//函数返回： 无
//=====================================================================
void I2C1_IRQHandler(void)
{
        uint_8 i;
        uint_8 data;
        DISABLE_INTERRUPTS;
        if(i2c1_wait('T'))            //等待一个数据传送完成
        {
            i=I2C1_D;               //读出IIC1D,准备接收数据
            goto lab;
        }
        //if((I2C1_S & 0x40)!=0)      //主机发送的地址与本机的默认地址匹配
        if((I2C1_S & I2C_S_IAAS_MASK)!=0)  //主机发送的地址与本机的默认地址匹配
        {
            i=I2C1_S & I2C_S_SRW_MASK;
            if(0!=j)
            {
                   j=0;
                 goto lab;
             }
            BCLR(I2C_C1_TX_SHIFT,I2C1_C1);  //TX = 0,MCU设置为接收模式
             i=I2C1_D;                //读出IIC1D,准备接收数据
              j++;
         }
        else                         //接收到的为数据
        {
            if(1==j)                 //接收到主机发送过来的访问地址
           {
               visitaddr=I2C1_D;    //读出IIC1D,准备接收数据
               j++;goto lab;
            }
            if(2==j)                 //接收到主机发送过来的数据
            {
               data=I2C1_D;         //读出IIC1D,准备接收数据
               j++;
             }
             //如果从机地址匹配、访问地址与数据均接收到则将接收到的数据存入buf数组
             if(3==j)
            {
               buf[visitaddr]=data;
               flag=1;              //置位该标志表明成功接收到主机发送过来的数据
             }
            j=0;
         }
         lab:
         ENABLE_INTERRUPTS;
}

