/* ********************************************************************************************************* * 函 数 名: i2c_SendByte * 功能说明: CPU向I2C总线设备发送8bit数据 * 形 参: _ucByte : 等待发送的字节 * 返 回 值: 无 ********************************************************************************************************* */ void i2c0_SendByte(uint8_t _ucByte) { uint8_t i; /* 先发送字节的高位bit7 */ for (i = 0; i < 8; i++) { if (_ucByte & 0x80) { I2C_SDA_1(); } else { I2C_SDA_0(); } i2c0_Delay(); I2C_SCL_1(); i2c0_Delay(); I2C_SCL_0(); if (i == 7) { I2C_SDA_1(); // 释放总线 } _ucByte <<= 1; /* 左移一个bit */ i2c0_Delay(); } }
/* ********************************************************************************************************* * 函 数 名: i2c_ReadByte * 功能说明: CPU从I2C总线设备读取8bit数据 * 形 参:无 * 返 回 值: 读到的数据 ********************************************************************************************************* */ uint8_t i2c_ReadByte(void) { uint8_t i; uint8_t value; I2C_SDA_1(); I2C_SCL_0(); /* 读到第1个bit为数据的bit7 */ value = 0; for (i = 0; i < 8; i++) { I2C_SCL_1(); i2c_Delay(); value <<= 1; if (I2C_SDA_READ()) { value++; } I2C_SCL_0(); i2c_Delay(); } i2c_NAck(); return value; }
/* ********************************************************************************************************* * 函 数 名: i2c_Start * 功能说明: CPU发起I2C总线停止信号 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void i2c0_Stop(void) { /* 当SCL高电平时,SDA出现一个上跳沿表示I2C总线停止信号 */ I2C_SDA_0(); I2C_SCL_1(); i2c0_Delay(); I2C_SDA_1(); }
/* ********************************************************************************************************* * 函 数 名: i2c_NAck * 功能说明: CPU产生1个NACK信号 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void i2c0_NAck(void) { I2C_SDA_1(); /* CPU驱动SDA = 1 */ i2c0_Delay(); I2C_SCL_1(); /* CPU产生1个时钟 */ i2c0_Delay(); I2C_SCL_0(); i2c0_Delay(); }
/* ********************************************************************************************************* * 函 数 名: i2c_Ack * 功能说明: CPU产生一个ACK信号 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void i2c0_Ack(void) { I2C_SDA_0(); /* CPU驱动SDA = 0 */ i2c0_Delay(); I2C_SCL_1(); /* CPU产生1个时钟 */ i2c0_Delay(); I2C_SCL_0(); i2c0_Delay(); I2C_SDA_1(); /* CPU释放SDA总线 */ }
/* ********************************************************************************************************* * 函 数 名: i2c_SendByte * 功能说明: CPU向I2C总线设备发送8bit数据 * 形 参:_ucByte : 等待发送的字节 * 返 回 值: 无 ********************************************************************************************************* */ void i2c_SendByte(uint8_t _ucByte) { uint8_t i; I2C_SCL_0(); /* 先发送字节的高位bit7 */ for (i = 0; i < 8; i++) { if (_ucByte & 0x80) { I2C_SDA_1(); } else { I2C_SDA_0(); } _ucByte <<= 1; /* 左移一个bit */ i2c_Delay(); I2C_SCL_1(); i2c_Delay(); I2C_SCL_0(); i2c_Delay(); } I2C_SDA_1(); // 释放总线 i2c_Delay(); I2C_SCL_0(); i2c_Delay(); if(I2C_SDA_READ()) { I2C_SCL_0(); return ; } else { I2C_SCL_0(); return ; } }
/* ********************************************************************************************************* * 函 数 名: i2c_Start * 功能说明: CPU发起I2C总线启动信号 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void i2c0_Start(void) { /* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */ I2C_SDA_1(); I2C_SCL_1(); i2c0_Delay(); I2C_SDA_0(); i2c0_Delay(); I2C_SCL_0(); i2c0_Delay(); }
/* ********************************************************************************************************* * 函 数 名: i2c_Start * 功能说明: CPU发起I2C总线停止信号 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void i2c_Stop(void) { SDA_OUT(); //sda线输出 /* 当SCL高电平时,SDA出现一个上跳沿表示I2C总线停止信号 */ I2C_SCL_0(); I2C_SDA_0(); i2c_Delay(); I2C_SCL_1(); I2C_SDA_1(); i2c_Delay(); }
/* ********************************************************************************************************* * 函 数 名: i2c_Start * 功能说明: CPU发起I2C总线启动信号 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void i2c_Start(void) { SDA_OUT(); //sda线输出 /* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */ I2C_SDA_1(); I2C_SCL_1(); i2c_Delay(); I2C_SDA_0(); i2c_Delay(); I2C_SCL_0(); i2c_Delay(); }
/* ********************************************************************************************************* * 函 数 名: i2c_WaitAck * 功能说明: CPU产生一个时钟,并读取器件的ACK应答信号 * 形 参:无 * 返 回 值: 返回0表示正确应答,1表示无器件响应 ********************************************************************************************************* */ uint8_t i2c_WaitAck(void) { uint8_t re; I2C_SCL_0(); I2C_SDA_1(); /* CPU释放SDA总线 */ i2c_Delay(); I2C_SCL_1(); /* CPU驱动SCL = 1, 此时器件会返回ACK应答 */ i2c_Delay(); if (I2C_SDA_READ()) /* CPU读取SDA口线状态 */ { re = 1; } else { re = 0; } I2C_SCL_0(); return re; }
/* ********************************************************************************************************* * 函 数 名: i2c_Start * 功能说明: CPU发起I2C总线启动信号 * 形 参:无 * 返 回 值: 无 ********************************************************************************************************* */ void i2c_Start(void) { /* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */ I2C_SDA_1(); i2c_Delay(); I2C_SCL_1(); i2c_Delay(); if(!I2C_SDA_READ()) return ; I2C_SDA_0(); i2c_Delay(); I2C_SCL_0(); i2c_Delay(); if(I2C_SDA_READ()) return; }
/******************************************************************************* * 名 称: i2c_WaitAck * 功 能: CPU产生一个时钟,并读取器件的ACK应答信号 * 入口参数: 无 * 出口参数: 返回0表示正确应答,1表示无器件响应 * 作 者: Roger-WY * 创建日期: 2016-05-20 * 修 改: * 修改日期: * 备 注: *******************************************************************************/ uint8_t i2c_WaitAck(void) { uint8_t re; uint8_t TimeOutCnt = 20; /* 超时计数器 */ I2C_SDA_1(); /* CPU释放SDA总线 */ i2c_Delay(); I2C_SCL_1(); /* CPU驱动SCL = 1, 此时器件会返回ACK应答 */ i2c_Delay(); while(TimeOutCnt -- ) { if (I2C_SDA_READ()) {/* CPU读取SDA口线状态 */ re = 1; } else { re = 0; } } I2C_SCL_0(); i2c_Delay(); return re; }
uint8_t i2c_ReceiveByte_WithACK(void) { uint8_t i,i2c_data; // I2C_SDA_1(); I2C_SCL_0(); i2c_data=0; // for(i=0;i<8;i++) { I2C_SCL_1(); i2c_Delay(); i2c_data<<=1; // if(I2C_SDA_READ()) i2c_data|=0x01; I2C_SCL_0(); i2c_Delay(); } i2c_Ack(); return i2c_data; }
/* ********************************************************************************************************* * 函 数 名: i2c_WaitAck * 功能说明: CPU产生一个时钟,并读取器件的ACK应答信号 * 形 参: 无 * 返 回 值: 返回0表示正确应答,1表示无器件响应 ********************************************************************************************************* */ uint8_t i2c_WaitAck(void) { uint8_t ucErrTime=0; SDA_IN(); //SDA设置为输入 I2C_SDA_1(); /* CPU释放SDA总线 */ i2c_Delay(); I2C_SCL_1(); /* CPU驱动SCL = 1, 此时器件会返回ACK应答 */ i2c_Delay(); while (I2C_SDA_READ()) /* CPU读取SDA口线状态 */ //while (SDA_READ()) { ucErrTime++; if(ucErrTime>250) { i2c_Stop(); return 1; } } I2C_SCL_0(); i2c_Delay(); return 0; }
/* ********************************************************************************************************* * 函 数 名: i2c_ReadByte * 功能说明: CPU从I2C总线设备读取8bit数据 * 形 参:无 * 返 回 值: 读到的数据 ********************************************************************************************************* */ uint8_t i2c_ReadByte(void) { uint8_t i; uint8_t value; /* 读到第1个bit为数据的bit7 */ value = 0; I2C_SDA_1(); for (i = 0; i < 8; i++) { value <<= 1; I2C_SCL_0(); i2c_Delay(); I2C_SCL_1(); i2c_Delay(); if (I2C_SDA_READ()) { value|=0x01; } } return value; }
/* ********************************************************************************************************* * 函 数 名: i2c_SendByte * 功能说明: CPU向I2C总线设备发送8bit数据 * 形 参:_ucByte : 等待发送的字节 * 返 回 值: 无 ********************************************************************************************************* */ void i2c_SendByte(uint8_t _ucByte) { uint8_t i; /* 先发送字节的高位bit7 */ for (i = 0; i < 8; i++) { I2C_SCL_0(); if (_ucByte & 0x80) { I2C_SDA_1(); } else { I2C_SDA_0(); } i2c_Delay(); I2C_SCL_1(); i2c_Delay(); _ucByte<<=1; } }