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; }
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; }
void HAL_I2C_Ack(void) { #ifdef USE_I2C_OLD I2C_Ack(); #else IIC_Ack(); #endif }
void i2c_init(void) { I2C->FREQR=0x0f; //设置频率寄存器 I2C->CCRH=0x00; //设置始终寄存器高位 I2C->CCRL=0x50; //设置始终寄存器低位 I2C->TRISER=0x11; //设置最大SCL上升时间 I2C->CR1|=0x01; //使能I2C模块 I2C_Ack(); //设置匹配应答 I2C->CR2|=0x08; //设置接收应答 }
/******************************************************************************* * 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; }
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK uint8_t I2C_Read_Byte(unsigned char ack) { unsigned char i,receive=0; SDA_IN();//SDA设置为输入 for(i=0;i<8;i++ ) { I2C_SCL=0; Delay_NOP_us(2); I2C_SCL=1; receive<<=1; if(SDA_Read)receive++; Delay_NOP_us(1); } if (!ack) I2C_NAck();//发送nACK else I2C_Ack(); //发送ACK return receive; }
/** * @brief I2C read mutiple data * \param[in] instance instance of i2c moudle * \param[in] chipAddr i2c slave addr * \param[in] addr i2c slave register offset * \param[in] addrLen len of slave register addr(in byte) * \param[out] buf data buf * \param[in] len data length * \retval 0 success * \retval 1 failure */ int I2C_BurstRead(uint32_t instance ,uint8_t chipAddr, uint32_t addr, uint32_t addrLen, uint8_t *buf, uint32_t len) { uint8_t *p; uint8_t err; p = (uint8_t*)&addr; err = 0; chipAddr <<= 1; I2C_Start(); I2C_SendByte(chipAddr); err += I2C_WaitAck(); while(addrLen--) { I2C_SendByte(*p++); err += I2C_WaitAck(); } I2C_Start(); I2C_SendByte(chipAddr+1); err += I2C_WaitAck(); while(len--) { *buf++ = I2C_GetByte(); if(len) { I2C_Ack(); } } I2C_NAck(); I2C_Stop(); return err; }
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; }