IIC个人感觉驱动的中断步骤还是挺麻烦的,
要按照步骤流程来,程序如下:
/******************************
*文件名:IIC.c *
*功能: AT24C02底层驱动 *
*创建者: 潘星宇 *
*最后修改:2013.03.20 *
*备注: *
* *
*******************************/
#include "IIC.h"
static U8 _iicData[IICBUFSIZE]; //IIC数据缓冲区
static volatile int _iicDataCount; //IIC数据计数器它是保证数据地址和数据值发送完了
static volatile int _iicStatus; //IIC状态标志
static volatile int _iicMode; //IIC模式变量
static int _iicPt; //IIC读数据计数器,用于修改读回的数据缓冲区的地存放在址
/**************************************************************************
***** 函数名: IIC_init(void)
***** 功 能: IIC初始化
***** 参 数: 无
***** 返回值: 无
***** 创建者:
***** 创建时间:
***** 最后更新:
****************************************************************************/
void IIC_init(void)
{
/*第一步:功能选择 GPE15:IICSDA , GPE14:IICSCL。禁止内部上拉*/
//rGPECON = 0xa0000000; // 1010 GPE15:IICSDA , GPE14:IICSCL
rGPECON &= 0x0fffffff;
rGPECON |= 0xa0000000; // 1010 GPE15:IICSDA , GPE14:IICSCL
/*第二步:将中断函数地址送给IIC中断向量地址,pISR_IIC:IIC中断服务程序地址寄存器 IicInt为IIC中断服务函数名*/
pISR_IIC = (unsigned)IicInt;
/*第三步:让IIC中断源有效(IIC中断源使能)*/
rINTMSK &= ~(BIT_IIC); //~(0x1<<27)
/***********************************************************************
***IICCON[7]:IIC总线应答使能位
***IICCON[6]:IIC总线传输时钟预定标器源时钟选择位,
0:IICCLK = fPCLK /16 ; 1: IICCLK = fPCLK/512
***IICCON[5]:IIC总线接收发送中断使能位0:无效即禁止中断 1:有效,允许中断
***IICCON[4]:IIC总线接收发送中断挂起标志
1 中断挂起(读)恢复IIC传输(写),
0无中断挂起(读) N/A(写);
//中断标记,此位用来标识是否有IIC中断发生,读出为0时表示没有中断发生,
//读出为1时表示有中断发生。当此位为1时,SCL线被拉低,此时所有IIC传输停止;
//如果要继续传输,需写入0清除它。
***IICCON[3:0]:IIC总线传输时钟预写器,Tx clock = IICCLK/(IICCON[3:0]+1) 与IICCON[6]有关
*******************************************************************/
/*Enable ACK, Prescaler IICCLK=PCLK/16, Enable interrupt,
Transmit clock value Tx clock=IICCLK/16
If PCLK 50.7MHz, IICCLK = 3.17MHz, Tx Clock = 0.198MHz */
//第四步:设置IICCON寄存器,ACK信号使能,16分频时钟,TX/RX中断允许,继续传输,预分频系数为16。
rIICCON = (1<<7) | (0<<6) | (1<<5) | (0xf);//IICCON[4]上电为0,所以不需要设置
/* 第五步:设置本机当从机时的地址,2440在IIC空闲的情况下通常配置为从机模式*/
rIICADD = 0x10;
/****************************************************************************
***IICSTAT[7:6] 00: 从接收模式 01: 从发送模式
10: 主接收模式 11: 主发送模式
***IICSTAT[5] IIC总线忙状态位 0:(读)不忙,(写)停止信号生成;
1:(读)忙 (写)开始信号输出.在开始信号后,IICDS中的数据自