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 + -
显示快捷键?