主题中讨论的其他部件: 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);
}

