freescale

来自「Freescale 系列单片机常用模块与综合系统设计」· 代码 · 共 202 行

TXT
202
字号
/** ###################################################################
**     Filename  : Events.C
**     Project   : I2C
**     Processor : MC9S08JM60CLHE
**     Beantype  : Events
**     Version   : Driver 01.02
**     Compiler  : CodeWarrior HCS08 C Compiler
**     Date/Time : 2009-11-16, 17:22
**     Abstract  :
**         This is user's event module.
**         Put your event handler code here.
**     Settings  :
**     Contents  :
**         No public methods
**
**     (c) Copyright UNIS, spol. s r.o. 1997-2008
**     UNIS, spol. s r.o.
**     Jundrovska 33
**     624 00 Brno
**     Czech Republic
**     http      : www.processorexpert.com
**     mail      : info@processorexpert.com
** ###################################################################*/
/* MODULE Events */


#include "Cpu.h"
#include "Events.h"

#define IIC_SLAVE 0xa0 //定义IIC从机地址

#define unsigned char      uchar
#define unsigned int       uint16
/*********************变量和函数定义****************************/
//void delay(uint i);                //延时子程序
//void IIC_init(void);               //IIC初始化子程序
//void IIC_read_block(char ,char );  //IIC读取子程序
//void IIC_write_block(char ,char ); //IIC写入子程序
//******************************************
uchar data[16];     //定义读取、发送数据数组
uchar i=0;          //访问数据数组的循环变量
uchar Address;      //定义读取、发送数据的起始地址
uchar flag=0;       //中断功能的选择标志  
uchar length=0;     //记录数据数组的长度
uchar IIC_Res_flg=0;//完成数据传输的标志

/*******************延时函数************************************/
void delay(uint16 i) {
    int j;
    for(j=i;j>0;j--) ;
}
/******************I2C初始化函数********************************/
void IIC_init(void)
{
    uchar temp;
    IICA=0X00;  
    IICF=0x5b;      //设置波特率RATE=100K BPS
    IICC1_IICEN=1;  //使能IIC模块
    IICC1_IICIE=0;  //除能IIC中断
    IICC1_MST=0;    //设置从模式
    IICC1_TXAK=1;   //设置产生应答
    IICS_BUSY=1;    //总线忙标志置1
    IICS_SRW=0;     //设置为发送模式
    IICS_ARBL=0;    //仲裁标志置0
    IICS_IICIF=0;   //发送标志置0
    temp=IICD;
}

void IIC_read_block(char addr,char len)
{
   IICC1_IICEN=0;  //IIC模块除能
   Address=addr;    //读取数据的首地址
   length=len;      //读取数据的长度
   i=0;             //清零数据访问的循环变量
   IIC_Res_flg=0;   //清零传输完成的标志
   flag=10;         //选择不同功能的中断处理
   if(length>16)    //限定读取数据的长度 
   {
    length=16;
   }
   IICC1_TXAK=0;   //设置产生应答信号
   IICC1_IICEN=1;  //使能IIC模块
   IICC1_MST=1;    //设置为主机模式
   IICC1_TX=1;     //设置为发送模式
   IICC1_IICIE=1;  //使能IIC中断
   IICD=IIC_SLAVE&0xfe; //首先发送从机地址
 }
 
 /**********************I2C写入模块***************************/
 void IIC_write_block(char addr,char len)
 {
   IICC1_IICEN=0;  //IIC模块除能
   Address=addr;    //写入数据的首地址
   length=len;      //写入数据的长度
   i=0;             //清零数据访问的循环变量
   IIC_Res_flg=0;   //清零传输完成的标志
   flag=2;          //选择不同功能的中断处理
   if(length>16)    //限定写入数据的长度 
   {
    length=16;
   }
   IICC1_TXAK=1;   //不产生应答信号
   IICC1_IICEN=1;  //使能IIC模块  
   IICC1_MST=1;    //设置主机模式
   IICC1_TX=1;     //设置为发送模式
   IICC1_IICIE=1;  //使能IIC中断
   IICD=IIC_SLAVE&0xfe; //首先发送从机地址
}
/**********************I2C中断程序****************************/
ISR(I2C_isr) {
 uchar temp;
 IICS_IICIF=1;  //清零中断标志
 switch(flag){
 //读取功能
   case 2:
   {
     IIC2D=Address;
     flag++;return;
   } //首先发送读取的起始地址
   case 3:
   {
     if(length)
     {
       IICD=data[i++];
       length--;
       return;
      }//开始读取数据
      else 
      { 
        IICC1_MST=0;
        IIC_Res_flg=1;
        IICC1_IICIE=0;
        return;
      }
            //读取数据完毕,重新进入发送数据模式,置位传输完成标志,除能IIC模块
    }
 //写入功能
   case 10:
   {
     IICD=Address;
     flag++;
     return;
   }                    //先发读取的存储首地址
   case 11:
   {
     IICC1_RSTA=1;
     IICD=IIC_SLAVE|1;
     flag++;
     return;
    }  //RSTA重新开始信号,无需应答
                                                             //发送从机地址,启动读取R/W=1,
   case 12:
   {
     IICC1_TX=0;
     IICC1_TXAK=0;
     temp=IICD;
     flag++;
     return;
   }//开始接收,第一个为应答信号
   case 13:
   {
     if(length-1)
     {
       data[i++]=IICD;
       length--;
       return;
     }      //接收数据
     else
     {
       data[i++]=IICD;
       IICC1_TXAK=1;
       flag++;
       return;
     }//最后一位数据不需应答信号
   }
   case 14:
   { 
     data[i++]=IICD;
     IICC1_MST=0;
     flag=0;
     IIC_Res_flg=1;
     IICC1_IICIE=0;
     IICC1_IICEN=0;
     return;
    //写入数据完毕,重新进入发送数据模式,清零中断功能选择标志,置位传输完成标志,除能IIC模块
   }
 }
}



/* END Events */

/*
** ###################################################################
**
**     This file was created by UNIS Processor Expert 3.03 [04.07]
**     for the Freescale HCS08 series of microcontrollers.
**
** ###################################################################
*/

⌨️ 快捷键说明

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