2020-01-01 17:48发布
SkyGz 发表于 2016-8-2 22:54 我前段时间 也碰过, 卡在这 后来可以了
微信截图_20160803104259.png (56.01 KB, 下载次数: 0)
下载附件
2016-8-3 10:39 上传
於氏天鹰 发表于 2016-8-3 10:33 我用了您的方法,现在在读取的时候第一次的EV6能够通过了,但是读取时候不是需要再次重启I2C的吗,在它重 ...
最多设置5个标签!
我用了您的方法,现在在读取的时候第一次的EV6能够通过了,但是读取时候不是需要再次重启I2C的吗,在它重启后进行7位地址发送后再检测EV6就无法通过了
微信截图_20160803104259.png (56.01 KB, 下载次数: 0)
下载附件
2016-8-3 10:39 上传
不用, 之后都不用I2C_REBOOT, 也不会再出现卡的情况(不过不要在DEBUG下单步调试, 直接全速运行 看会不会卡就行)
我的读写函数
void I2C_WriteByte(unsigned char id,unsigned char write_address,unsigned char byte)
{
I2C_GenerateSTART(I2C1,ENABLE);
//产生起始条件
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
//等待ACK
I2C_Send7bitAddress(I2C1,id,I2C_Direction_Transmitter);
//向设备发送设备地址
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
//等待ACK
I2C_SendData(I2C1, write_address);
//寄存器地址
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
//等待ACK
I2C_SendData(I2C1, byte);
//发送数据
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
//发送完成
I2C_GenerateSTOP(I2C1, ENABLE);
//产生结束信号
}
//----------------------------------------------------//
unsigned char I2C_ReadByte(unsigned char id, unsigned char read_address)
{
unsigned char temp;
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
//等待I2C
I2C_GenerateSTART(I2C1, ENABLE);
//产生起始信号
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
//EV5
I2C_Send7bitAddress(I2C1, id, I2C_Direction_Transmitter);
//发送地址
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
//EV6
I2C_Cmd(I2C1, ENABLE);
//重新设置可以清楚EV6
I2C_SendData(I2C1, read_address);
//发送读得地址
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
//EV8
I2C_GenerateSTART(I2C1, ENABLE);
//重新发送
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
//EV5
I2C_Send7bitAddress(I2C1, id, I2C_Direction_Receiver);
//发送读地址
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
//EV6
I2C_AcknowledgeConfig(I2C1, DISABLE);
I2C_GenerateSTOP(I2C1, ENABLE);
//关闭应答和停止条件产生
while(!(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)));
temp = I2C_ReceiveData(I2C1);
I2C_AcknowledgeConfig(I2C1, ENABLE);
return temp;
}
------------------------------------------------------------------------------------------------------------------------
MPU_GetData(MPU6050_Addr, ACCEL_XOUT_H, 14, BUF_6050_buff);
void MPU6050_GetData(u8 id, u8 reg, u8 len, u8 *buff)
{
//启动传输发送首寄存器地址
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
I2C_GenerateSTART(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1, id, I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_Cmd(I2C1, ENABLE);
I2C_SendData(I2C1, reg);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
//开始接受
I2C_GenerateSTART(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1, id, I2C_Direction_Receiver);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
while (len)
{
while(!(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)));
*buff = I2C_ReceiveData(I2C1);
if(len == 2)
{
I2C_AcknowledgeConfig(I2C1, DISABLE);//最后一个不应答
}
buff++;
len--;
}
I2C_AcknowledgeConfig(I2C1, ENABLE);
I2C_GenerateSTOP(I2C1, ENABLE);
}
一周热门 更多>