主题中讨论的其他部件: BQ3060
i´m使用TCA9548A以多路复用具有相同地址的i2c器件。
此i2c器件是bq3060 IC,目的是从端口0和1中连接的IC读取寄存器。
我成功读取了端口0中的IC。 端口1中的另一个IC。 但当我尝试读取第一个端口0和第一个端口1之后的两个端口时,有时会出现读取问题。 问题在于TCA中的端口选择发生了更改。
我已经看到,当我有读取问题时,是因为在发送到TAC9548 (在“tcaselect()”,“BP_WriteReg”)中选择端口的i2c信号中,停止位发送不正确。 我在我的应用程序的代码下面发布,并且在我写入TCA端口时附加了i2c信号。
我的问题是,为什么有时我在TCA9548中写时停止位不能正确发送,而有时是正确发送。 如果发送不正常,则当停止位的数据较高时,时钟信号似乎会下降。
我的代码是下一个:
tcaselect(0); VoltageArray[0]=BP_ReadReg (0x09); SOCArray[0]=BP_ReadReg (0x0d); tcaselect(1); VoltageArray[1]=BP_ReadReg (0x09); SOCArray[1]=BP_ReadReg (0x0d); void tcaselect(uint8_t I) { if (i >7) return; tmp=(1<I); BP_WriteValue (0x01,tmp); }void t_Writut-Reg {(u8)----- 透射相位--------------------------- */ /*发送BP_I2C启动条件*/ I2C_GenerateSTART(BP_I2C, enable); /*在BP_I2C EV5上测试并清除*/ 同时(!I2C_CheckEvent(BP_I2C, I2C_EVENT_MASTER_MODE_SELECT))/* EV5 */ { }/* 发送BP从属地址以写入*/ I2C_M7itResmit_I2C_D, I2C_TransmitAddress I2C_I2C_I2C_I2C_Transmit_I2C_I2C_ /*在BP_I2C EV6上测试并清除它*/ 同时(!I2C_CheckEvent(BP_I2C, I2C_EVENT_MASTER_TRANSMER_MODELE_SELECTED))/* EV6 */ {}/* 发送指定的寄存器数据指针*/ I2C_Reg Data(BP_I2C,(uint8_t)RegValue); /*在BP_I2C EV8上测试并清除*/ 同时(!I2C_CheckEvent(BP_I2C, I2C_EVENT_MASTER_BYTE_Transmitted ))/* EV8 */ {}/* 发送BP_Readstop条件*/ BP_GenerateSTOP(BP_GenerateSTOP, I2C_Ent =16 I2I2I2I2I2C_Regut_Int /*如果BP_I2C确认已被其它函数禁用,则启用BP_I2C确认*/ I2C_AcknowledgeConfig (BP_I2C, ENABE); /*--------------- 透射相位--------------------------- */ /*发送BP_I2C启动条件*/ I2C_GenerateSTART(BP_I2C, enable); /*在BP_I2C EV5上测试并清除*/ 同时(!I2C_CheckEvent(BP_I2C, I2C_EVENT_MASTER_MODE_SELECT))/* EV5 */ { }/* 发送STBP从属地址用于写入*/ ADBP_I2C_Send7itD, I2C_TransmitD(I2C_ADBP_D, I2C_TransmitAddress /*在BP_I2C EV6上测试并清除*/ 同时(!I2C_CheckEvent(BP_I2C, I2C_EVENT_MASTER_TRANSMORT_SELECTED))/* EV6 */ { }/* 发送指定的寄存器数据指针*/ I2C_SendData(BP_I2C, RegName); /*在BP_I2C_EV8上测试并清除*/ 同时发送(I2C_EV8 (_I2C_EV8 接收阶段--------------------------- */* 发送重写条件*/ I2C_GenerateSTART(BP_I2C, enable); /*测试EV5并清除*/ 同时(!I2C_CheckEvent(BP_I2C, I2C_EVENT_MASTER_MODE_SELECT))/* EV5 */ { }/* 发送BP从地址以读取*/ 接收器_Send7bitAddress(I2C_I2C_I2C_, ADBP_I2C_DIC) /*在EV6上测试并清除它*/ 同时(!I2C_CheckEvent (BP_I2C, I2C_EVENT_MASTER_RECEIVER_MODED_SELECTED)/* EV6 */ { }/* 在EV7上测试并清除它*/ 同时(!I2C_CheckEvent (BP_I2C, I2C_EVENT_MASTER_MORTE)/* EV7 */ {}_I2I2C_RECETELET =接收数据存储区(BP_16 /*禁用BP_I2C确认*/ I2C_鸣 谢配置(BP_I2C, disable); /*发送BP_I2C停止条件*/ I2C_GenerateSTOP (BP_I2C, enable); /*在RXNE标志上测试*/ 同时(I2C_GetReceivStatus(BP_I2C, I2C_RESET_Lag_RXNE)== BP){}/* 存储BP_I2C_RegValue; /*返回寄存器值*/ 返回(RegValue); }