freescale

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

TXT
97
字号
#include <hidef.h> 
#include "I2C_Slave.h"  

//******************************************
#define IIC_SLAVE 0xa0 //定义IIC从机地址
/*********************变量和函数定义****************************/
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(uint i) {
    int j;
    for(j=i;j>0;j--) ;
}
/******************I2C初始化函数********************************/
void IIC_init(void){
    uchar temp;
    IIC2A=0X00;  
    IIC2F=0x5b;      //设置波特率RATE=100K BPS
    IIC2C1_IICEN=1;  //使能IIC模块
    IIC2C1_IICIE=0;  //除能IIC中断
    IIC2C1_MST=0;    //设置从模式
    IIC2C1_TXAK=1;   //设置产生应答
    IIC2S_BUSY=1;    //总线忙标志置1
    IIC2S_SRW=0;     //设置为发送模式
    IIC2S_ARBL=0;    //仲裁标志置0
    IIC2S_IICIF=0;   //发送标志置0
    temp=IIC2D;
}

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

⌨️ 快捷键说明

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