/* ********************************************************************************************************* * 函 数 名: 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_SendByte * 功能说明: CPU向I2C总线设备发送8bit数据 * 形 参: _ucByte : 等待发送的字节 * 返 回 值: 无 ********************************************************************************************************* */ void i2c_SendByte(uint8_t _ucByte) { uint8_t i; /* 先发送字节的高位bit7 */ for (i = 0; i < 8; i++) { if (_ucByte & 0x80) { I2C_SDA_1(); } else { I2C_SDA_0(); } i2c_Delay(); I2C_SCL_1(); i2c_Delay(); I2C_SCL_0(); if (i == 7) { I2C_SDA_1(); // 释放总线 } _ucByte <<= 1; /* 左移一个bit */ i2c_Delay(); } }
/* ********************************************************************************************************* * 函 数 名: i2c_NAck * 功能说明: CPU产生1个NACK信号 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void i2c_NAck(void) { I2C_SDA_1(); /* CPU驱动SDA = 1 */ i2c_Delay(); I2C_SCL_1(); /* CPU产生1个时钟 */ i2c_Delay(); I2C_SCL_0(); i2c_Delay(); }
/* ********************************************************************************************************* * 函 数 名: i2c_Ack * 功能说明: CPU产生一个ACK信号 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void i2c_Ack(void) { I2C_SDA_0(); /* CPU驱动SDA = 0 */ i2c_Delay(); I2C_SCL_1(); /* CPU产生1个时钟 */ i2c_Delay(); I2C_SCL_0(); i2c_Delay(); I2C_SDA_1(); /* CPU释放SDA总线 */ }
/* ********************************************************************************************************* * 函 数 名: i2c_Stop * 功能说明: CPU发起I2C总线停止信号 * 形 参:无 * 返 回 值: 无 ********************************************************************************************************* */ void i2c_Stop(void) { /* 当SCL高电平时,SDA出现一个上跳沿表示I2C总线停止信号 */ I2C_SCL_1(); I2C_SDA_0(); i2c_Delay(); I2C_SCL_1(); i2c_Delay(); I2C_SDA_1(); i2c_Delay(); }
///////////////////////////////////////// // I2C stop signal. // <comment> // ____________ // SCL _______/ // _________ // SDA __________/ ///////////////////////////////////////// void i2c_Stop(void) { i2cSetSCL(_LOW); i2c_Delay(); i2cSetSDA(_LOW); i2c_Delay(); i2cSetSCL(_HIGH); i2c_Delay(); i2cSetSDA(_HIGH); i2c_Delay(); }
/* ********************************************************************************************************* * 函 数 名: i2c_Start * 功能说明: CPU发起I2C总线启动信号 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void i2c_Start(void) { /* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */ I2C_SDA_1(); I2C_SCL_1(); i2c_Delay(); I2C_SDA_0(); i2c_Delay(); I2C_SCL_0(); i2c_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(); }
void i2c_Delay_Test(void) { u8 i; SDA_OUT(); //sda线输出 for(i=0;i<10;i++) { //I2C_SDA_0(); I2C_SCL_1(); i2c_Delay(); //I2C_SDA_1(); I2C_SCL_0(); i2c_Delay(); } }
////////////////////////////////////////////////////////////////////////// // I2C access start. // // Arguments: ucSlaveAdr - slave address // trans_t - I2C_TRANS_WRITE/I2C_TRANS_READ ////////////////////////////////////////////////////////////////////////// BOOL i2c_AccessStart(BYTE ucSlaveAdr, I2C_Direction trans_t) { BYTE ucDummy; // loop dummy if (trans_t == I2C_READ) // check i2c read or write ucSlaveAdr = I2C_DEVICE_ADR_READ(ucSlaveAdr); // read else ucSlaveAdr = I2C_DEVICE_ADR_WRITE(ucSlaveAdr); // write ucDummy = I2C_ACCESS_DUMMY_TIME; while (ucDummy--) { i2c_Delay(); if (i2c_Start() == FALSE) continue; if (i2c_SendByte(ucSlaveAdr) == I2C_ACKNOWLEDGE) // check acknowledge return TRUE; //printf("ucSlaveAdr====%x", ucSlaveAdr); i2c_Stop(); Delay1ms(1); } return FALSE; }
/* ********************************************************************************************************* * 函 数 名: 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; }
////////////////////////////////////////////////////// // I2C start signal. // <comment> // SCL ________ // \_________ // SDA _____ // \____________ // // Return value: None ////////////////////////////////////////////////////// BOOL i2c_Start(void) { BOOL bStatus = TRUE; // success status i2cSetSDA_Chk(_HIGH); i2c_Delay(); i2cSetSCL_Chk(_HIGH); i2c_Delay(); if ((i2cSCL_PIN_STATUS() == _LOW) || (i2cSDA_PIN_STATUS() == _LOW)) { bStatus = FALSE; } else { i2cSetSDA(_LOW); i2c_Delay(); i2cSetSCL(_LOW); } return bStatus; }
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_ReadByte * 功能说明: CPU从I2C总线设备读取8bit数据 * 形 参: 无 * 返 回 值: 读到的数据 ********************************************************************************************************* */ uint8_t i2c_ReadByte(uint8_t ack) { uint8_t i; uint8_t receive=0; SDA_IN(); for (i = 0; i < 8; i++) { I2C_SCL_0(); i2c_Delay(); I2C_SCL_1(); receive <<= 1; if (I2C_SDA_READ()){ receive++; } i2c_Delay(); } if(ack) { i2c_Ack(); } else { i2c_NAck(); } return receive; }
/* ********************************************************************************************************* * 函 数 名: 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; }