int SCCB_ReadSingleRegister(uint32_t instance, uint8_t chipAddr, uint8_t subAddr, uint8_t* pData) { uint32_t time_out = 0; I2C_GenerateSTART(instance); /* Send 7bit Data with WRITE operation */ I2C_Send7bitAddress(instance, chipAddr, kI2C_Write); if(I2C_WaitAck(instance)) { I2C_GenerateSTOP(instance); time_out = 0; while(!I2C_IsBusy(instance) && (time_out < 10000)) { time_out++; } return 1; } /* send reg address */ I2C_SendData(instance, subAddr); if(I2C_WaitAck(instance)) { I2C_GenerateSTOP(instance); time_out = 0; while(!I2C_IsBusy(instance) && (time_out < 10000)) { time_out++; } return 2; } I2C_GenerateSTOP(instance); while(!I2C_IsBusy(instance)); time_out = 0; /* generate START signal */ I2C_GenerateSTART(instance); /* resend 7bit Address, This time we use READ Command */ I2C_Send7bitAddress(instance, chipAddr, kI2C_Read); if(I2C_WaitAck(instance)) { I2C_GenerateSTOP(instance); time_out = 0; while(!I2C_IsBusy(instance)); return 3; } /* set master in slave mode */ I2C_SetMasterMode(instance,kI2C_Read); /* dummy read */ I2C_ReadData(instance); I2C_GenerateAck(instance); I2C_WaitAck(instance); *pData = I2C_ReadData(instance); /* stop and finish */ I2C_GenerateNAck(instance); I2C_WaitAck(instance); I2C_GenerateSTOP(instance); while(!I2C_IsBusy(instance)); return 0; }
uint8_t EEPROM24AA512ReadNByte(uint16_t Register, uint8_t *Data, uint8_t Num) { if(I2C_ReadData(g_I2cHandleMaster,EEPROM24AA512_SLADDRESS,(uint16_t)Register,I2C_MEMADD_SIZE_16BIT, Data, Num) != HAL_OK) { return 0; } return 1; }
/*bool getTimeAD5242BR(const uint8 contr, uint8 *position) { TI2C_Result res; TINFO_AD5242 infoAD5242={0}; validAD5242 = false; infoAD5242.control = contr; //I2C_SetBaudRate(DS1338_BAUDRATE); //__disable_interrupt(); res = I2C_ReadData(AD5242_DEVICE_ADD,1,0x00,sizeof(TINFO_AD5242),(uint8*)&infoAD5242); //__enable_interrupt(); if (res == I2C_RES_OK){ *position = infoAD5242.data; validAD5242 = true; } return validAD5242; }*/ bool getTimeAD5242BR(uint8 *position) { TI2C_Result res; uint8 data = 0; validAD5242 = false; //I2C_SetBaudRate(DS1338_BAUDRATE); //__disable_interrupt(); res = I2C_ReadData(AD5242_DEVICE_ADD,1,0x00,sizeof(data),(uint8*)&data); //__enable_interrupt(); if (res == I2C_RES_OK){ *position = data; validAD5242 = true; } return validAD5242; }
void MPU6050_Read(void) { __loop_cnt_gyro__ = (__loop_cnt_gyro__ < MPU6050_GYRO_BUFFER_LEN - 1 ? (__loop_cnt_gyro__ + 1) : 0); __loop_cnt_acc__ = (__loop_cnt_acc__ < MPU6050_ACC_BUFFER_LEN - 1 ? (__loop_cnt_acc__ + 1) : 0); uint8_t buffer[14]; I2C_ReadData(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_ACCEL_XOUT_H, buffer, 14); while(I2C_isBusy()); __average_buf_acc__[__loop_cnt_acc__][0] = (int16_t)((((uint16_t)buffer[0])<<8) | ((uint16_t)buffer[1]));// - __MPU6050_ACC_OFFSET.x; __average_buf_acc__[__loop_cnt_acc__][1] = (int16_t)((((uint16_t)buffer[2])<<8) | ((uint16_t)buffer[3]));// - __MPU6050_ACC_OFFSET.y; __average_buf_acc__[__loop_cnt_acc__][2] = (int16_t)((((uint16_t)buffer[4])<<8) | ((uint16_t)buffer[5]));// - __MPU6050_ACC_OFFSET.z; __average_buf_gyro__[__loop_cnt_gyro__][0] = (int16_t)((((uint16_t)buffer[8])<<8) | ((uint16_t)buffer[9])) - __MPU6050_GYRO_OFFSET.x; __average_buf_gyro__[__loop_cnt_gyro__][1] = (int16_t)((((uint16_t)buffer[10])<<8) | ((uint16_t)buffer[11])) - __MPU6050_GYRO_OFFSET.y; __average_buf_gyro__[__loop_cnt_gyro__][2] = (int16_t)((((uint16_t)buffer[12])<<8) | ((uint16_t)buffer[13])) - __MPU6050_GYRO_OFFSET.z; uint16tofloat(); }
uint8_t MPU6050_SelfAdjust(void) { uint8_t buffer[14]; //iic读取后存放数据 int32_t avg_value[7]; ////////////////////////////////////////////////////////////////// /////////////////////// Normal output ////////////////////////// ////////////////////////////////////////////////////////////////// avg_value[0] = avg_value[1] = avg_value[2] = avg_value[3] = avg_value[4] = avg_value[5] = avg_value[6] = 0; uint32_t t = 0; __fixLoopPeriod(0,&t); for(int i = 0 ; i < 1024 ; i ++){ __fixLoopPeriod(2000,&t); I2C_ReadData(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_ACCEL_XOUT_H, buffer, 14); while(I2C_isBusy()); avg_value[0] += (int16_t)((((uint16_t)buffer[0])<<8) | ((uint16_t)buffer[1])); avg_value[1] += (int16_t)((((uint16_t)buffer[2])<<8) | ((uint16_t)buffer[3])); avg_value[2] += (int16_t)((((uint16_t)buffer[4])<<8) | ((uint16_t)buffer[5])); avg_value[4] += (int16_t)((((uint16_t)buffer[8])<<8) | ((uint16_t)buffer[9])); avg_value[5] += (int16_t)((((uint16_t)buffer[10])<<8) | ((uint16_t)buffer[11])); avg_value[6] += (int16_t)((((uint16_t)buffer[12])<<8) | ((uint16_t)buffer[13])); } float tmpx,tmpy,tmpz; tmpx = ((float)avg_value[0])*(ACC_MAX_SCALE/32768.0f/1024.0f*9.8f); tmpy = ((float)avg_value[1])*(ACC_MAX_SCALE/32768.0f/1024.0f*9.8f); tmpz = ((float)avg_value[2])*(ACC_MAX_SCALE/32768.0f/1024.0f*9.8f); attitude_gravity.x = (-tmpx + tmpy)*0.7071067812; attitude_gravity.y = (tmpx + tmpy)*0.7071067812; attitude_gravity.z = -tmpz; __MPU6050_GYRO_OFFSET.x = avg_value[4] >> 10; __MPU6050_GYRO_OFFSET.y = avg_value[5] >> 10; __MPU6050_GYRO_OFFSET.z = avg_value[6] >> 10; /////////////////////////////////////////////////////////////////////////////////////// for(int i = 0 ; i < MPU6050_ACC_BUFFER_LEN || i < MPU6050_GYRO_BUFFER_LEN ; i++){ __fixLoopPeriod(2000,&t); MPU6050_Read(); } return 0; }
/*主函数*/ void main() { INT8U Temp_Key; //存放按键处理值 BOOL I2C_OK; //I2C读写是否成功(1成功,0失败) LCD1602_Init(); //LCD1602初始化 IR_TX_RX_Init(); //IR发送、接收初始化 I2C_Init(); //I2C初始化 Delay_Ms(50); LCD1602_Write_String(0, 0, "Welcome to use!"); LCD1602_Write_String(0, 1, "IR Remote Module"); //欢迎文字 Delay_Ms(5000); //5秒延时 LCD1602_Clear(); //LCD1602清屏 LCD1602_Write_String(0, 0, "Switch Mode!"); LCD1602_Write_String(0, 1, "Default CopyMode"); //功能选择提示文字 while (1) { if (IR_RX_Finish) //IR是否接收完成 { IR_RX_Finish = 0; LCD1602_Clear(); /*LCD1602以16进制显示IR接收到的用户名与键值码*/ LCD1602_Write_String(0, 1, INT8UtostrHEX(IR_RX_CODE[0])); LCD1602_Write_String(3, 1, INT8UtostrHEX(IR_RX_CODE[1])); LCD1602_Write_String(7, 1, INT8UtostrHEX(IR_RX_CODE[2])); LCD1602_Write_String(10, 1, INT8UtostrHEX(IR_RX_CODE[3])); } Temp_Key = KeyPro(); //提取按键处理值 if (KeyPro_OK) //按键处理是否成功 { KeyPro_OK = 0; if (TorR_Mod) //选择为发送模式 { if (Temp_Key != 0xfd) //非选择模式按键按下(S3,发送模式) { do { I2C_OK = I2C_ReadData(Temp_Key); } while (!I2C_OK); //等待I2C读取发送码成功 Transmit_TR_CODE(); //发送红外编码 LCD1602_Clear(); LCD1602_Write_String(0, 1, INT8UtostrHEX(Temp_Key)); //显示学习按键值 LCD1602_Write_String(5, 1, INT8UtostrHEX(I2C_OK)); //显示成功读取IR_TX_CODE /*LCD1602以16进制显示从I2C取出的IR_TX_CODE*/ LCD1602_Write_String(0, 0, INT8UtostrHEX(IR_TX_CODE[0])); LCD1602_Write_String(3, 0, INT8UtostrHEX(IR_TX_CODE[1])); LCD1602_Write_String(7, 0, INT8UtostrHEX(IR_TX_CODE[2])); LCD1602_Write_String(10, 0, INT8UtostrHEX(IR_TX_CODE[3])); } else //选择模式按键按下(S3) { LCD1602_Clear(); LCD1602_Write_String(0, 0, "IR Transmit Mode"); LCD1602_Write_String(3, 1, "Please Key!"); } } else //学习模式 { if (Temp_Key != 0xfe) //非选择模式按键按下(S2,学习模式) { LCD1602_Clear(); LCD1602_Write_String(14, 1, INT8UtostrHEX(Temp_Key)); //显示按键值 do { I2C_OK = I2C_WriteData(Temp_Key); } while (!I2C_OK); //等待将接收红外码存入I2C成功 LCD1602_Write_String(14, 0, INT8UtostrHEX(I2C_OK)); //显示存入成功 Delay_Ms(100); /*从I2C读取刚存入的IR学习码*/ I2C_ReadData(Temp_Key); LCD1602_Write_String(0, 0, INT8UtostrHEX(IR_TX_CODE[0])); LCD1602_Write_String(3, 0, INT8UtostrHEX(IR_TX_CODE[1])); LCD1602_Write_String(7, 0, INT8UtostrHEX(IR_TX_CODE[2])); LCD1602_Write_String(10, 0, INT8UtostrHEX(IR_TX_CODE[3])); } else //选择模式按键按下(S2,学习模式) { LCD1602_Clear(); LCD1602_Write_String(0, 0, "IRcode Copy Mode"); LCD1602_Write_String(0, 1, "Please In IRcode"); } } } } }
static bool I2C_RecvForHdmiPhy(I2C_CHANNEL eCh, u8 ucSlvAddr, u8 aData[], unsigned int nNumOfData) { bool bResult = TRUE; unsigned int i; if (g_aI2c[eCh].eError == I2C_INVALID_TX_CLOCK) { bResult = FALSE; goto I2C_Stop; } // // I2C Phase - Check BUS Status // if (I2C_WaitForBusReady(eCh, g_aI2c[eCh].nTimeOut) == FALSE) { g_aI2c[eCh].eError = I2C_TIMEOUT_BUS_READY_START; return FALSE; } I2C_InitMaster(eCh, g_aI2c[eCh].ePrescaler, g_aI2c[eCh].nPrescaler); // Init I2C // // I2C Phase - START // I2C_SetMode(eCh, MASTER_RX_MODE); // Set Mode I2C_WriteAddress(eCh, ucSlvAddr); // Write Slave Address I2C_GenerateSignal(eCh, START_CONDITION); // Send START Signal if (!I2C_WaitForXferNoAck(eCh, g_aI2c[eCh].nTimeOut)) // Workaround for HDMI PHY { g_aI2c[eCh].eError = I2C_TIMEOUT_SLAVE_ADDRESS; goto I2C_Stop; } // // I2C Phase - Read Data // for (i = 0; i < nNumOfData; i++) { if (i < nNumOfData-1) { I2C_SetAckGeneration(eCh, TRUE); I2C_ClearIntStatus(eCh); if (I2C_WaitForXferNoAck(eCh, g_aI2c[eCh].nTimeOut) == FALSE) // Workaround for HDMI PHY { g_aI2c[eCh].eError = I2C_TIMEOUT_SLAVE_ADDRESS; goto I2C_Stop; } aData[i] = I2C_ReadData(eCh); } else { I2C_SetAckGeneration(eCh, FALSE); I2C_ClearIntStatus(eCh); if (I2C_WaitForXferNoAck(eCh, g_aI2c[eCh].nTimeOut) == FALSE) { g_aI2c[eCh].eError = I2C_TIMEOUT_SLAVE_ADDRESS; goto I2C_Stop; } aData[i] = I2C_ReadData(eCh); } } g_aI2c[eCh].eError = I2C_SUCCESS; I2C_Stop: // // I2C Phase - STOP // I2C_GenerateSignal(eCh, STOP_CONDITION); // Send STOP Signal I2C_ClearIntStatus(eCh); I2C_SetMode(eCh, DISABLE_I2C); // Deactivate I2C // // I2C Phase - Check BUS Status // if (I2C_WaitForBusReady(eCh, g_aI2c[eCh].nTimeOut) == FALSE) { g_aI2c[eCh].eError = I2C_TIMEOUT_BUS_READY_STOP; return FALSE; } I2C_PrintErrorCase(g_aI2c[eCh].eError); return bResult; }
/** * @brief 设置i2c在主模式下的连续数据读操作 * @code * //使用i2c的1模块读取数据地址为0x55的从机中起始地址为0x01的数据10字节,存储在data的首地址 * I2C_BurstRead(HW_I2C1, 0x55, 0x01, 1, &data, 10); * @endcode * @param instance :I2C模块号 * @arg HW_I2C0 :I2C0模块 * @arg HW_I2C1 :I2C1模块 * @arg HW_I2C2 :I2C2模块 * @param deviceAddress :从机设备地址0~127 * @param subAddress :读取的起始地址 * @param subAddressLen :地址的长度 * @param buf :保存数据的首地址 * @param len :读取数据的长度 * @retval 数据的读取状态 0 ;成功 其它 :失败 */ int32_t I2C_BurstRead(uint32_t instance, uint8_t deviceAddress, uint32_t subAddress, uint32_t subAddressLen, uint8_t* buf, uint32_t len) { uint32_t time_out = 0; uint8_t i; uint8_t * p = (uint8_t*)&subAddress; /* generate START signal */ I2C_GenerateSTART(instance); /* Send 7bit Data with WRITE operation */ I2C_Send7bitAddress(instance, deviceAddress, kI2C_Write); if(I2C_WaitAck(instance)) { I2C_GenerateSTOP(instance); time_out = 0; while(!I2C_IsBusy(instance) && (time_out < 10000)) { time_out++; } return 1; } /* if len = 0 then return */ if(!len) { I2C_GenerateSTOP(instance); while(!I2C_IsBusy(instance)); return 0; } /* send sub address */ for(i = 0; i < subAddressLen; i++) { /* send reg address */ I2C_SendData(instance, *p++); if(I2C_WaitAck(instance)) { I2C_GenerateSTOP(instance); time_out = 0; while(!I2C_IsBusy(instance) && (time_out < 10000)) { time_out++; } return 2; } } /* generate RESTART signal */ I2C_GenerateRESTART(instance); /* resend 7bit Address, This time we use READ Command */ I2C_Send7bitAddress(instance, deviceAddress, kI2C_Read); if(I2C_WaitAck(instance)) { I2C_GenerateSTOP(instance); time_out = 0; while(!I2C_IsBusy(instance)); return 3; } /* set master in slave mode */ I2C_SetMasterMode(instance,kI2C_Read); /* dummy read */ I2C_ReadData(instance); //dummy read I2C_GenerateAck(instance); I2C_WaitAck(instance); /* actually read */ for(i = 0; i < len - 1; i++) { *(buf++) = I2C_ReadData(instance); I2C_GenerateAck(instance); I2C_WaitAck(instance); } /* read last */ *buf = I2C_ReadData(instance); /* stop and finish */ I2C_GenerateNAck(instance); I2C_WaitAck(instance); I2C_GenerateSTOP(instance); while(!I2C_IsBusy(instance)); return 0; }
//------------------------------------------------ void Flash_CheckBackupSlot(void) { uint16 Addr; TI2C_Result res; SlotNumInBackup = -1; Addr = FlashInfo.BackupSlot*FlashInfo.SlotSize + FlashInfo.SlotDataSize + 2; if (FlashMode == FLASH_MODE_16K) res = I2C_ReadData(FLASH_DEVICE_ADDR|(Addr>>7)&0xFE, 1, Addr&0xFF, 2, FlashBuffer); else res = I2C_ReadData(FLASH_DEVICE_ADDR, 2, Addr, 2, FlashBuffer); if (res == I2C_RES_OK) { if (FlashBuffer[0]^FlashBuffer[1] == 0xFF) { SlotNumInBackup = FlashBuffer[0]; } } } bool Flash_LoadDayPlan(uint8 Num) { int i; TI2C_Result res; uint16 CRC;