/*************************************************** **文件名 :i2c_driver.c **功能 :I2C协议有关的模拟函数定义,注意这些实现是在 8051 core @11.0592MHZ && 12个时钟周期为一个 机器周期,SCL周期为100KHZ **建立日期:07/11/07 **版本 :Ver1.0 **修改记录: *****************************************************/ #include"config.h" #include"Port.h" #include"i2c_driver.h" /**************************************************** *名称:I2C_SendStart *功能:发送开始条件子程序 *参数:无 *返回:无 *说明: *****************************************************/ void I2C_SendStart(void) { SDA=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SDA=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SCL=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } /**************************************************** *名称:I2C_SendStop *功能:发送停止条件子程序 *参数:无 *返回:无 *说明: *****************************************************/ void I2C_SendStop(void) { SDA=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SDA=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } /**************************************************** *名称:I2C_CheckACK *功能:在发送数据以后检察应答位 *参数:无 *返回:1--表示有应答 0--表示无应答 *说明: *****************************************************/ uint8 I2C_CheckACK(void) { uint8 ret_v; SDA=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); ret_v=!SDA; SCL=0; return ret_v; } /**************************************************** *名称:I2C_SendACK *功能:发送应答信号,在每次接收一个字节以后发送 *参数:无 *返回:无 *说明: *****************************************************/ void I2C_SendACK(void) { SDA=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SCL=0; _nop_(); _nop_(); _nop_(); _nop_(); } /**************************************************** *名称:I2C_SendNACK *功能:在接收到最后一个字节以后发送非应答信号 *参数:无 *返回:无 *说明: *****************************************************/ void I2C_SendNACK(void) { SDA=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SCL=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SDA=0; } /**************************************************** *名称:I2C_SendByte *功能:发送一个字节 *参数:无 *返回:无 *说明:最高位首先被发送 *****************************************************/ void I2C_SendByte(uint8 senddat) { uint8 c; for (c=0;c<8;c++) { if (senddat&0x80) SDA=1; else SDA=0; SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); senddat<<=1; SCL=0; _nop_(); _nop_(); } } /**************************************************** *名称:I2C_GetByte *功能:接收一个字节 *参数:无 *返回:无 *说明:最高位首先被接收 *****************************************************/ uint8 I2C_GetByte(void) { uint8 c,res; SDA=1; res=0; for (c=0;c<8;c++) { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SCL=1; res<<=1; _nop_(); if (SDA) res++; _nop_(); _nop_(); SCL=0; } return res; }