哦哦 ,
#include "lpc17xx.h" //============================================================================= #define READ 1 #define WRITE 1 //============================================================================= //SDA=P0.0 //SCL=P0.1 #define U8 unsigned char #define U16 unsigned short #define U32 unsigned int #define SDA_H { LPC_GPIO0->FIODIR=(LPC_GPIO0->FIODIR) | (1<<0); LPC_GPIO0->FIOPIN =LPC_GPIO0->FIOPIN | (1<<0);} #define SDA_L { LPC_GPIO0->FIODIR=(LPC_GPIO0->FIODIR) | (1<<0); LPC_GPIO0->FIOPIN =LPC_GPIO0->FIOPIN & (~(1<<0));} #define SCL_H { LPC_GPIO0->FIODIR=(LPC_GPIO0->FIODIR) | (1<<1); LPC_GPIO0->FIOPIN =LPC_GPIO0->FIOPIN | (1<<1);} #define SCL_L { LPC_GPIO0->FIODIR=(LPC_GPIO0->FIODIR) | (1<<1); LPC_GPIO0->FIOPIN =LPC_GPIO0->FIOPIN & (~(1<<1));} /****************************************************************************** 函数:I2C_Delay() 功能:模拟I2C总线延时 说明:请根据具体情况调整延时值 ******************************************************************************/ void I2C_Delay(){ unsigned int t; t = 10; while ( --t != 0 ); //延时2*t个机器周期 } //============================================================================= U8 SDA(){ LPC_GPIO0->FIODIR=(LPC_GPIO0->FIODIR) & (~(1<<0)); return ((LPC_GPIO0->FIOPIN & (0x01))>>0); } /****************************************************************************** 函数:I2C_Init() 功能:I2C总线初始化,使总线处于空闲状态 说明:在main()函数的开始处,应当执行一次本函数 ******************************************************************************/ void I2C_Init(){ LPC_GPIO0->FIODIR=(LPC_GPIO0->FIODIR) | ((1<<0)|(1<<1)); SCL_H; I2C_Delay(); SDA_H; I2C_Delay(); } /****************************************************************************** 函数:I2C_Start() 功能:产生I2C总线的起始条件 说明: SCL处于高电平期间,当SDA出现下降沿时启动I2C总线 本函数也用来产生重复起始条件 ******************************************************************************/ void I2C_Start(){ SDA_H; I2C_Delay(); SCL_H; I2C_Delay(); SDA_L; I2C_Delay(); SCL_L; I2C_Delay(); } /****************************************************************************** 函数:I2C_Write() 功能:向I2C总线写1个字节的数据 参数:dat是要写到总线上的数据 ******************************************************************************/ void I2C_Write(unsigned char dat){ unsigned char t = 8; do{ if(dat&0x80)SDA_H else SDA_L dat <<= 1; SCL_H; I2C_Delay(); SCL_L; I2C_Delay(); } while ( --t != 0 ); } /****************************************************************************** 函数:I2C_GetAck() 功能:读取从机应答位(应答或非应答),用于判断:从机是否成功接收主机数据 返回: 0:从机应答 1:从机非应答 说明:从机在收到每一个字节后都要产生应答位,主机如果收到非应答则应当终止传输 ******************************************************************************/ U8 I2C_GetAck(){ U8 ack; SDA_H; I2C_Delay(); SCL_H; I2C_Delay(); ack = SDA(); SCL_L; I2C_Delay(); return ack; } /****************************************************************************** 函数:I2C_Stop() 功能:产生I2C总线的停止条件 说明:SCL处于高电平期间,当SDA出现上升沿时停止I2C总线 ******************************************************************************/ void I2C_Stop(){ unsigned int t; SDA_L; I2C_Delay(); SCL_H; I2C_Delay(); SDA_H; I2C_Delay(); //对于某些器件来说,在下一次产生Start之前,额外增加一定的延时是必须的 t = 15; while ( --t != 0 ); } /****************************************************************************** 函数:I2C_Puts() 功能:主机通过I2C总线向从机发送1个字节的数据 参数: SlaveAddr:从机地址(高7位是从机地址,最低位是读写标志) SubAddr:从机的子地址 size:数据大小(以字节计) dat:要发送的数据 返回: 0:发送成功 1:在发送过程中出现异常 ******************************************************************************/ U8 I2C_Puts(unsigned char dat){ I2C_Write(dat); if ( I2C_GetAck() ){ I2C_Stop(); return 1; } return 0; } /****************************************************************************** 函数:I2C_PutAck() 功能:主机产生应答位(应答或非应答),用于通知从机:主机是否成功接收从机数据 参数: ack=0:主机非应答 ack=1:主机应答 说明:主机在收到每一个字节后都要产生应答,在收到最后一个字节后,应当产生非应答 ******************************************************************************/ void I2C_PutAck(U8 ack){ if(ack)SDA_H else SDA_L I2C_Delay(); SCL_H; I2C_Delay(); SCL_L; I2C_Delay(); } /****************************************************************************** 函数:I2C_Read() 功能:从从机读取1个字节的数据 返回:读取的1个字节数据 ******************************************************************************/ unsigned char I2C_Read(){ unsigned char dat; unsigned char t = 8; SDA_H; //在读取数据之前,要把SDA拉高,使之处于输入状态 do{ SCL_H; I2C_Delay(); dat <<= 1; if( SDA() ) dat++; SCL_L; I2C_Delay(); } while ( --t != 0 ); return dat; }