OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3956|回复: 8

I2C读取16数据的时候,低位一致是0xFF

[复制链接]

17

主题

119

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
466
金钱
466
注册时间
2018-4-26
在线时间
78 小时
发表于 2018-9-13 13:33:42 | 显示全部楼层 |阅读模式
1金钱
     我在用I2C与一个模块通信的时候,写没问题,读出来的时候有问题,我读16位的数据,高位没问题是我写的值,低位就是一致是0XFF,请问一下是什么原因

                lpt_WriteOneByte(0x0004,0x581C);
                //pt2257_WriteOneByte(0x01,0x77);
                spi_data=lpt_ReadOneByte(0x0004);
                delay_ms(500);
                printf("temp=%x\n",spi_data);


void lpt_WriteOneByte(u16 WriteAddr,u16 DataToWrite)
{                                                                                                                                                                                          
               IIC_Start();  
                IIC_Send_Byte(0X54);            //·¢ËíD′Ãüáî
                IIC_Wait_Ack();
                IIC_Send_Byte((WriteAddr>>8)&0xFF);//·¢Ëí¸ßμØÖ·          
       
        IIC_Wait_Ack();          
       IIC_Send_Byte(WriteAddr&0xFF);   //·¢ËíμíμØÖ·
        IIC_Wait_Ack();                                                                                                              
        IIC_Send_Byte((DataToWrite>>8)&0xFF);     //·¢Ëí×Ö½ú                                                          
        IIC_Wait_Ack();                                
        IIC_Send_Byte(DataToWrite&0xFF);     //·¢Ëí×Ö½ú                                                          
        IIC_Wait_Ack();                 
    IIC_Stop();//2úéúò»¸öí£Ö1ìõ¼t
        delay_ms(10);         
}


u16 lpt_ReadOneByte(u16 ReadAddr)
{                                  
        u8 temp[2];       
        u8 i;       
        u16 REG_data=0;
        IIC_Start();  

        IIC_Send_Byte(0x54);           //·¢ËíD′Ãüáî
        i=IIC_Wait_Ack();
        if(i==1)
        printf("ack fail");
        IIC_Send_Byte((ReadAddr>>8)&0xFF);//·¢Ëí¸ßμØÖ·             
        IIC_Wait_Ack();
        IIC_Send_Byte(ReadAddr&0xFF);   //·¢ËíμíμØÖ·
        IIC_Wait_Ack();            
        IIC_Start();                     
        IIC_Send_Byte(0x55);           //½øèë½óêÕģ꽠                         
        IIC_Wait_Ack();         
        temp[0]=IIC_Read_Byte(0);
        //printf("temop[0] is %x\n",temp[0]);
        IIC_Wait_Ack();       
        temp[1]=IIC_Read_Byte(0);
        //printf("temop[1] is %x\n",temp[1]);
        IIC_Wait_Ack();       
        IIC_Stop();//2úéúò»¸öí£Ö1ìõ¼t       
        REG_data=(temp[0]<<8)|temp[1];       
        return REG_data;
}


写的没问题,读出来的就有问题,

最佳答案

查看完整内容[请看2#楼]

解决了,是读取16位的时候,I2C的时序有问题,修改之后,示波器波形OK
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

119

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
466
金钱
466
注册时间
2018-4-26
在线时间
78 小时
 楼主| 发表于 2018-9-13 13:33:43 | 显示全部楼层
解决了,是读取16位的时候,I2C的时序有问题,修改之后,示波器波形OK
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-9-15 01:44:43 | 显示全部楼层
帮顶
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-9-15 08:30:11 | 显示全部楼层
楼主可以试一试,读取这个I2C器件某个16位寄存器的数值,尤其是像是那些什么设备ID、制造商ID之类的、存储常量的寄存器,如果能够正确读出16位,说明是楼主写16bit时的程序有问题;反之,则说明读16bit的数据有问题。
十六进制带我飞。
回复

使用道具 举报

4

主题

380

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3088
金钱
3088
注册时间
2015-10-17
在线时间
320 小时
发表于 2018-9-15 08:30:46 | 显示全部楼层
iic读,到底是你主机应答,还是等待应答,好好看看规格书,也许有发现
回复

使用道具 举报

4

主题

380

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3088
金钱
3088
注册时间
2015-10-17
在线时间
320 小时
发表于 2018-9-15 08:31:47 | 显示全部楼层
别这么小气,1个金钱,一点回答的动力都没有
回复

使用道具 举报

17

主题

119

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
466
金钱
466
注册时间
2018-4-26
在线时间
78 小时
 楼主| 发表于 2018-9-15 09:55:09 | 显示全部楼层
DreamWaterPro 发表于 2018-9-15 08:30
楼主可以试一试,读取这个I2C器件某个16位寄存器的数值,尤其是像是那些什么设备ID、制造商ID之类的、存储 ...

谢谢,写16位数据是肯定没问题的,因为我试过while(1)里一直写,然后用示波器抓了一下波形,数据是对的,也有应答,应该是读的时序的问题,今天正好有空我就在找找原因
回复

使用道具 举报

17

主题

119

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
466
金钱
466
注册时间
2018-4-26
在线时间
78 小时
 楼主| 发表于 2018-9-15 10:02:55 | 显示全部楼层
hgr211 发表于 2018-9-15 08:30
iic读,到底是你主机应答,还是等待应答,好好看看规格书,也许有发现

你说的有道理,我这个点没考虑进去,读的时候从机发数据给主机,那应答信号应该是主机给从机的,那应答位数据线的模式应该配置为输出,我等待应答SDA转为了输入,我试一下,有结果我就结帖
回复

使用道具 举报

17

主题

119

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
466
金钱
466
注册时间
2018-4-26
在线时间
78 小时
 楼主| 发表于 2018-9-15 10:03:25 | 显示全部楼层
hgr211 发表于 2018-9-15 08:31
别这么小气,1个金钱,一点回答的动力都没有

没在意金钱的问题,不好意思
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 05:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表