bool i2cRead(I2CDevice device, uint8_t addr, uint8_t reg, uint8_t len, uint8_t *buf) { UNUSED(device); if (!I2C_Start()) { return false; } I2C_SendByte(addr << 1 | I2C_Direction_Transmitter); if (!I2C_WaitAck()) { I2C_Stop(); i2cErrorCount++; return false; } I2C_SendByte(reg); I2C_WaitAck(); I2C_Start(); I2C_SendByte(addr << 1 | I2C_Direction_Receiver); I2C_WaitAck(); while (len) { *buf = I2C_ReceiveByte(); if (len == 1) { I2C_NoAck(); } else { I2C_Ack(); } buf++; len--; } I2C_Stop(); return true; }
bool i2cRead(uint8_t addr, uint8_t reg, uint8_t len, uint8_t *buf) { if (!I2C_Start()) return false; I2C_SendByte(addr << 1 | I2C_Direction_Transmitter); if (!I2C_WaitAck()) { I2C_Stop(); return false; } I2C_SendByte(reg); I2C_WaitAck(); I2C_Start(); I2C_SendByte(addr << 1 | I2C_Direction_Receiver); I2C_WaitAck(); while (len) { *buf = I2C_ReceiveByte(); if (len == 1) I2C_NoAck(); else I2C_Ack(); buf++; len--; } I2C_Stop(); return true; }
int I2C_read(unsigned char slave_addr, unsigned char reg_addr, unsigned char length, unsigned char *data) { I2C_START(); I2C_SendByte(slave_addr << 1 | I2C_Direction_Transmitter); I2C_SendByte(reg_addr); I2C_START(); I2C_SendByte(slave_addr << 1 | I2C_Direction_Receiver); while (length) { if (length==1) *data =I2C_ReceiveByte(); else *data =I2C_ReceiveByte_WithACK(); data++; length--; } I2C_STOP(); return 0x00; }
int I2C_SW::read_regs(uint8_t SlaveAddress, uint8_t startRegister, uint8_t*out, int count) { int i; if (!I2C_Start()) { return -1; } I2C_SendByte(SlaveAddress&0xFE); if (!I2C_WaitAck()) { I2C_Stop(); return -1; } I2C_SendByte(startRegister); I2C_WaitAck(); I2C_Start(); I2C_SendByte((SlaveAddress&0xFE)|0x01); I2C_WaitAck(); for(i=0; i<count; i++) { out[i] = I2C_ReceiveByte(); if (i==count-1) I2C_SendNoAck(); else I2C_SendAck(); } I2C_Stop(); return 0; }
/* *函数名:I2C_ImByteRead *函数功能:将设备dadr的当前地址处数据读出 *输入:dadr *输出:dat */ unsigned char I2C_ImByteRead(unsigned char dadr) { unsigned char dat; I2C_Start(); I2C_SendByte(dadr | 0x01); dat = I2C_ReceiveByte(); I2C_Stop(); return dat; }
// I2C模拟读出一个字节 uint8_t I2C_ReadByte(uint8_t DeviceAddr, uint8_t address) { uint8_t i; I2C_START(); I2C_SendByte(DeviceAddr); I2C_SendByte(address); I2C_START(); I2C_SendByte(DeviceAddr + 1); i = I2C_ReceiveByte(); I2C_STOP(); return i; }
/* *函数名:I2C_ByteRead *函数功能:将设备dadr的addr地址处数据读出 *输入:dadr,addr *输出:dat */ unsigned char I2C_ByteRead(unsigned char dadr,addr) { unsigned char dat; I2C_Start(); I2C_SendByte(dadr); I2C_SendByte(addr); I2C_Start(); I2C_SendByte(dadr | 0x01); //I2C_Delay5Us(); dat = I2C_ReceiveByte(); I2C_Stop(); return dat; }
/*********************************************************** * Function: // 函数名称 * Description: // 函数功能、性能等的描述 * Input: // 1.输入参数1,说明,包括每个参数的作用、取值说明及参数间关系 * Input: // 2.输入参数2,说明,包括每个参数的作用、取值说明及参数间关系 * Output: // 1.输出参数1,说明 * Return: // 函数返回值的说明 * Others: // 其它说明 ***********************************************************/ static uint8_t IIC_RegRead( uint8_t address, uint8_t reg, uint8_t *value ) { uint8_t err = ERR_NONE; err = I2C_Start( ); if( err ) { goto lbl_ERR_REG_RD_STOP; } I2C_SendByte( address << 1 ); err = I2C_WaitAck( ); if( err ) { goto lbl_ERR_REG_RD_STOP; } I2C_SendByte( reg ); err = I2C_WaitAck( ); if( err ) { goto lbl_ERR_REG_RD_STOP; } err = I2C_Start( ); if( err ) { goto lbl_ERR_REG_RD; } I2C_SendByte( ( address << 1 ) | 0x01 ); err = I2C_WaitAck( ); if( err ) { goto lbl_ERR_REG_RD_STOP; } *value = I2C_ReceiveByte( ); I2C_NoAck( ); I2C_Stop( ); return ERR_NONE; lbl_ERR_REG_RD_STOP: I2C_Stop( ); lbl_ERR_REG_RD: //rt_kprintf( "reg_rd error=%02x reg=%02x\r\n", err, reg ); return err; }
// I2C模拟读出两个字节 uint16_t I2C_Read_2Bytes(uint8_t DeviceAddr, uint8_t address) { uint8_t data_temp1,data_temp2; uint16_t data_16; I2C_START(); I2C_SendByte(DeviceAddr); I2C_SendByte(address); I2C_START(); I2C_SendByte(DeviceAddr + 1); data_temp1 = I2C_ReceiveByte_WithACK(); data_temp2 = I2C_ReceiveByte(); I2C_STOP(); data_16 = (data_temp1<<8) | data_temp2; return data_16; }
// I2C模拟读出三个字节 uint32_t I2C_Read_3Bytes(uint8_t DeviceAddr, uint8_t address) { uint8_t data_temp1, data_temp2, data_temp3; uint32_t data_32; I2C_START(); I2C_SendByte(DeviceAddr); I2C_SendByte(address); I2C_START(); I2C_SendByte(DeviceAddr + 1); data_temp1 = I2C_ReceiveByte_WithACK(); data_temp2 = I2C_ReceiveByte_WithACK(); data_temp3 = I2C_ReceiveByte(); I2C_STOP(); data_32 = (data_temp1<<16) | (data_temp2<<8) | data_temp3; return data_32; }
u8 ReadI2C(u8 address, u8 WriteAddress) // 读出1串数据 { u8 ch; // 定义存储读出数据的临时变量; I2C_Start(); // 启动总线,开始传输数据; I2C_SendByte(WriteAddress); I2C_WaitAck(); // 发送从器件硬件地址; I2C_SendByte(address); I2C_WaitAck(); // 发送从器件内部数据存储器的地址; I2C_Start(); // 重新启动总线,开始传输数据; I2C_SendByte(WriteAddress + 1); I2C_WaitAck(); // 发送从器件内部数据存储器的地址; ch = I2C_ReceiveByte(); I2C_NoAck(); // 将读出的一个字节数据存入临时变量,发送非应答位; I2C_Stop(); // 发送停止信号,释放总路线; return (ch); }
/******************************************************************************* * Function Name : I2C_ReadByte * Description : 读取一串数据 * Input : - pBuffer: 存放读出数据 * - length: 待读出长度 * - ReadAddress: 待读出地址 * - DeviceAddress: 器件类型 * Output : None * Return : 返回为:=1成功读入,=0失败 * Attention : None *******************************************************************************/ int I2C_ReadByte(uint8_t* pBuffer, uint16_t length, uint8_t ReadAddress, uint8_t DeviceAddress) { if(!I2C_Start()) { return DISABLE; } I2C_SendByte( DeviceAddress ); /* 器件地址 */ if( !I2C_WaitAck() ) { I2C_Stop(); return DISABLE; } I2C_SendByte( ReadAddress ); /* 设置低起始地址 */ I2C_WaitAck(); I2C_Stop(); if(!I2C_Start()) { return DISABLE; } I2C_SendByte( DeviceAddress + 1 ); /* 器件地址 */ if(!I2C_WaitAck()) { I2C_Stop(); return DISABLE; } while(length) { *pBuffer = I2C_ReceiveByte(); if(length == 1) { I2C_NoAck(); } else { I2C_Ack(); } pBuffer++; length--; } I2C_Stop(); return ENABLE; }
// I2C模拟读出多个字节 u8 i2cread(u8 dev_addr, u8 reg_addr, u8 i2c_len, u8 *i2c_data_buf) { I2C_START(); I2C_SendByte(dev_addr << 1 | I2C_Direction_Transmitter); I2C_SendByte(reg_addr); I2C_START(); I2C_SendByte(dev_addr << 1 | I2C_Direction_Receiver); while (i2c_len) { if (i2c_len == 1) *i2c_data_buf = I2C_ReceiveByte(); else *i2c_data_buf = I2C_ReceiveByte_WithACK(); i2c_data_buf++; i2c_len--; } I2C_STOP(); return 0x00; }
Status ReadTMP102(u16 *TO_EEPROM,u16 *Data_ptr)//读取tmp101的2个字节温度 { u16 TMP102_Data=0x0000; /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~ Frame 1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ //send start------------------1 if(I2C_Start()!=BUS_READY){ ERROR_MACRO(TMP102_DEV,RTMP_ERROR_SEND_START); return ERROR_FAILED; } //send SlaveADDR with write I2C_SendByte(TMP102_WRITE_ADDR);//------------------2 if(I2C_WaitAck()!=BUS_ACK){ ERROR_MACRO(TMP102_DEV,RTMP_ERROR_SEND_DEVADDR);//------------------3 return ERROR_FAILED; } /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~ Frame 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ //send CONF_ADDR------------------4 I2C_SendByte(TMP102_TEMP_REG); if(I2C_WaitAck()!=BUS_ACK){ ERROR_MACRO(TMP102_DEV,RTMP_ERROR_SEND_TEMPADDR);//------------------5 return ERROR_FAILED; } I2C_Stop();//------------------NiMa没看到!!!!!!!!!!!!!! /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~ Frame 3 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ //send start------------------6 if(I2C_Start()!=BUS_READY){ ERROR_MACRO(TMP102_DEV,RTMP_ERROR_SEND_RESTART); return ERROR_FAILED; } //send SlaveADDR with write I2C_SendByte(TMP102_READ_ADDR);//------------------7 if(I2C_WaitAck()!=BUS_ACK){ ERROR_MACRO(TMP102_DEV,RTMP_ERROR_SEND_RDEVADDR);//------------------8 return ERROR_FAILED; } /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~ Frame 4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ //read TEMP TMP102_Data=0x0000; TMP102_Data = I2C_ReceiveByte();//--Byte1-------9 I2C_Ack();//------------------10 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~ Frame 5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ TMP102_Data<<=8; TMP102_Data |= I2C_ReceiveByte();//---Byte2-----11 I2C_Ack();//------------------12 //send stop I2C_Stop();//------------------13 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~ Done ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ TMP102_Data>>=4; *Data_ptr = TMP102_Data; //============================================================== //-25~80 if(TMP102_Data&(0x800)){ //负数要转换 TMP102_Data-=(0x0E70-0x0500-1); } if(TMP102_Data<=0x690){ *TO_EEPROM = TMP102_Data*4; } else{ printf("Out of range from TMP102,TMP102=%X\t\r\n",*Data_ptr); *TO_EEPROM = TO_EEPROM_ERROR; } //printf("TMP102=%X\tEEPROM=%X\r\n",*Data_ptr,*TO_EEPROM); return OK_PASS; }
u16 ReadTMP102_REG(unsigned char reg) { u16 TMP102_Data=0x0000; /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~ Frame 1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ //send start------------------1 if(I2C_Start()!=BUS_READY){ ERROR_MACRO(TMP102_DEV,RTMP_ERROR_SEND_START); } //send SlaveADDR with write I2C_SendByte(TMP102_WRITE_ADDR);//------------------2 if(I2C_WaitAck()!=BUS_ACK){ ERROR_MACRO(TMP102_DEV,RTMP_ERROR_SEND_DEVADDR);//------------------3 } /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~ Frame 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ //send CONF_ADDR------------------4 I2C_SendByte(reg); if(I2C_WaitAck()!=BUS_ACK){ ERROR_MACRO(TMP102_DEV,RTMP_ERROR_SEND_TEMPADDR);//------------------5 } I2C_Stop();//------------------NiMa没看到!!!!!!!!!!!!!! /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~ Frame 3 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ //send start------------------6 if(I2C_Start()!=BUS_READY){ ERROR_MACRO(TMP102_DEV,RTMP_ERROR_SEND_RESTART); return ERROR_FAILED; } //send SlaveADDR with write I2C_SendByte(TMP102_READ_ADDR);//------------------7 if(I2C_WaitAck()!=BUS_ACK){ ERROR_MACRO(TMP102_DEV,RTMP_ERROR_SEND_RDEVADDR);//------------------8 return ERROR_FAILED; } /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~ Frame 5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ //read TEMP TMP102_Data=0x0000; TMP102_Data = I2C_ReceiveByte();//--Byte1-------9 I2C_Ack();//------------------10 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~ Frame 4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ TMP102_Data=(TMP102_Data<<8); TMP102_Data |=(u8)I2C_ReceiveByte();//---Byte2-----11 I2C_Ack();//------------------12 //send stop I2C_Stop();//------------------13 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~ Done ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ return TMP102_Data; }