不知有谁在I2C上研究得比较深 我读MPU9250设备ID 有时能读到有时候不能 我在读写函数的结尾加了条while(!(I2CMasterErr(I2C3_BASE)==I2C_MASTER_ERR_NONE)); 程序就卡这里了 我改成ERR_ARB_LOST就通过了 翻译过来是失去总线控制 出现这种错误会是什么原因啊
下面是我的读写函数 请各路高手检查下有没有错误
void MPU_Write_Byte(uint8_t addr,uint8_t reg,uint8_t data)
{
I2CMasterSlaveAddrSet(I2C3_BASE,addr,false);
I2CMasterDataPut(I2C3_BASE,reg);
I2CMasterControl(I2C3_BASE,I2C_MASTER_CMD_BURST_SEND_START);
while(I2CMasterBusy(I2C3_BASE));
I2CMasterDataPut(I2C3_BASE,data);
I2CMasterControl(I2C3_BASE,I2C_MASTER_CMD_BURST_SEND_CONT);
while(I2CMasterBusy(I2C3_BASE));
while(!(I2CMasterErr(I2C3_BASE)==I2C_MASTER_ERR_NONE));
I2CMasterControl(I2C3_BASE,I2C_MASTER_CMD_BURST_SEND_FINISH);
}
uint8_t MPU_Read_Byte(uint8_t addr,uint8_t reg)
{
uint8_t res;
I2CMasterSlaveAddrSet(I2C3_BASE,addr,false);
I2CMasterDataPut(I2C3_BASE,reg);
I2CMasterControl(I2C3_BASE,I2C_MASTER_CMD_BURST_SEND_START);
while(I2CMasterBusy(I2C3_BASE));
I2CMasterSlaveAddrSet(I2C3_BASE,addr,true);
I2CMasterControl(I2C3_BASE,I2C_MASTER_CMD_SINGLE_RECEIVE);
while(I2CMasterBusy(I2C3_BASE));
while(!(I2CMasterErr(I2C3_BASE)==I2C_MASTER_ERR_NONE));
res=I2CMasterDataGet(I2C3_BASE);
return res;
}
void MPU_Read_Len(uint8_t addr,uint8_t reg,uint8_t len,uint8_t *buf)
{
uint32_t DataNumber;
uint32_t MsterCMD;
I2CMasterSlaveAddrSet(I2C3_BASE,addr,false);
I2CMasterDataPut(I2C3_BASE,reg);
I2CMasterControl(I2C3_BASE,I2C_MASTER_CMD_SINGLE_SEND);
while(I2CMasterBusy(I2C3_BASE));
I2CMasterSlaveAddrSet(I2C3_BASE,addr,true);
for(DataNumber=0;DataNumber<len;DataNumber++)
{
if(DataNumber==0)
{
MsterCMD=I2C_MASTER_CMD_BURST_RECEIVE_START;
}
else if(DataNumber==(len-1))
{
MsterCMD=I2C_MASTER_CMD_FIFO_BURST_RECEIVE_FINISH;
}
else
{
MsterCMD=I2C_MASTER_CMD_BURST_RECEIVE_CONT;
}
I2CMasterControl(I2C3_BASE,MsterCMD);
while(I2CMasterBusy(I2C3_BASE));
while(!(I2CMasterErr(I2C3_BASE)==I2C_MASTER_ERR_NONE));
*buf=I2CMasterDataGet(I2C3_BASE);
buf++;
}
}