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