用I2C实现STM32与GY-26的通信中遇到的问题

2019-07-21 04:18发布

       我用STM32模拟的I2C与GY-26进行通信,向GY-26写指令的时候,GY-26没有返回应答,一直是高电平。模拟I2C程序没有问题,因为我用模拟I2C程序能成功的与24C02的通信。             捕获.PNG 这是GY-26的通信协议,        GY_26_WriteOneByte(0x00,0x31);//测量角度

void GY_26_WriteOneByte(u8 cmd,u8 data)
{
        IIC_Start();  //开始信号
        IIC_Send_Byte(cmd);//发送指令
        IIC_Wait_Ack();//等待应答
        IIC_Send_Byte(data);//发送数据
        IIC_Wait_Ack();          //等待应答
        IIC_Stop();//产生一个停止条件
        delay_ms(10);
}
这是GY-26发送指令的程序,就是卡死在了,IIC_Wait_Ack();//等待应答,总是高电平,没有应答。我怀疑是STM32频率太快的原因,因为手册上说GY-26的响应频率是15HZ。大家怎么看,能给我提示一下思路吗?我现在不知道要怎么调试了! 谢谢各位!!
PS:我用3.3v接4.7K的电阻做上拉试了试,然后去掉上拉电阻又试了试,结果一样,都是没有应答,SDA线一直是3.3V高电平。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
TengW
1楼-- · 2019-07-21 04:29
I2C没能实现,我改用串口了,还是要谢谢各位。
Acuity
2楼-- · 2019-07-21 06:06
 精彩回答 2  元偷偷看……
xlong_06
3楼-- · 2019-07-21 09:18
绝大多数IIC的模块协议是相同的,但是在读取数据上或者连续读取数据上会有差别,特别是你的器件地址要对,否则就不能工作。
TengW
4楼-- · 2019-07-21 11:37
Acuity 发表于 2017-11-2 00:27
检查i2c地址是否正确,注意是否包含读写位的地址 ;无应答则检查检查时序。

它的I2C地址是0xe0,
//GY26读写地址

#define GY_WR_ADDR 0xE0
#define GY_RD_ADDR 0xE1
这是我定义的地址。时序没有问题,因为可以与板载的24C02进行通信。
TengW
5楼-- · 2019-07-21 14:16
xlong_06 发表于 2017-11-2 09:31
绝大多数IIC的模块协议是相同的,但是在读取数据上或者连续读取数据上会有差别,特别是你的器件地址要对, ...

它的I2C地址是0xe0,
//GY26读写地址

#define GY_WR_ADDR 0xE0
#define GY_RD_ADDR 0xE1
这是我定义的地址。我向GY-26发送第一个数据的时候,就没有应答,没有用到连续读写。
TengW
6楼-- · 2019-07-21 18:25
Acuity 发表于 2017-11-2 00:27
检查i2c地址是否正确,注意是否包含读写位的地址 ;无应答则检查检查时序。

你好,写指令能实现了,但是读取到的值一直不对。一直都是一个固定的数。
GY_26_WriteOneByte(0x00,0x31);//测量角度
GY_26_ReadByte(0x00,gy_buf);//从00h地址开始读取


void GY_26_ReadByte(u16 ReadAddr,u8 *buf)
{                 
        u8 i;
  IIC_Start(); //开始信号
        IIC_Send_Byte(GY_WR_ADDR);//写指令
        IIC_Wait_Ack();//等待应答
        IIC_Send_Byte(ReadAddr);//发送地址
        IIC_Wait_Ack();//等待应答
        IIC_Start();                    //开始信号
        IIC_Send_Byte(GY_RD_ADDR);//读指令
        IIC_Wait_Ack();//等待应答
        for(i=0;i<8;i++)
        {
                if(i==7)
                        buf = IIC_Read_Byte(0);//最后发送非应答
                else
                {
                        buf = IIC_Read_Byte(1);//发送应答
                }
        }
         IIC_Stop();//产生停止信号
}


这是怎么回事,能帮我解答一下吗

一周热门 更多>