OpenEdv-开源电子网

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

STM32与MAX44009 IIC通信异常

[复制链接]

1

主题

7

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2015-5-8
在线时间
3 小时
发表于 2019-1-22 16:35:51 | 显示全部楼层 |阅读模式
RT,最近在调MAX44009 光照传感器,采用STM32F103采集数据,IIC部分的代码都是以前验证过很多遍的,确保没有问题,按照数据手册上连续读0x03、0x04两各寄存器的时序图写的代码,测试数据没问题,就是寄存器值无法更新,每次按复位键后数据才刷新
看数据手册说只有监测到IIC_STOP信号后寄存器的值才会更新,代码的数据读取部分也体现了这一步操作,调了两天了,是在想不出漏洞在哪,跪求有经验的大神们不吝赐教

unsigned int MAX44009_ReadData(unsigned char RegAddr1, unsigned char RegAddr2)
{                                  
        unsigned char lsb;
        unsigned char msb;
       
  IIC_Start();         
        IIC_Write_Byte(SLAVE_ADDRESS<<1);                                 //·¢&#203;íéè±&#184;D′&#195;üá&#238;
        IIC_Wait_Ack();
        IIC_Write_Byte(RegAddr1);                                                                 //·¢&#203;í&#188;&#196;′&#230;&#198;÷1μ&#216;&#214;·
        IIC_Wait_Ack();                 

        IIC_Start();                     
        IIC_Write_Byte((SLAVE_ADDRESS<<1) + 1);  //&#182;áμúò&#187;&#184;&#246;&#188;&#196;′&#230;&#198;÷êy&#190;Y          
        IIC_Wait_Ack();         
        msb = IIC_Read_Byte(0);                                                                         //NO ACK       

        IIC_Start();
        IIC_Write_Byte(SLAVE_ADDRESS<<1);                                 //·¢&#203;íéè±&#184;D′&#195;üá&#238;
        IIC_Wait_Ack();
        IIC_Write_Byte(RegAddr2);                                                                 //·¢&#203;í&#188;&#196;′&#230;&#198;÷2μ&#216;&#214;·
        IIC_Wait_Ack();
       
        IIC_Start();                     
        IIC_Write_Byte((SLAVE_ADDRESS<<1) + 1);  //&#182;áμú&#182;t&#184;&#246;&#188;&#196;′&#230;&#198;÷êy&#190;Y          
        IIC_Wait_Ack();       
        lsb = IIC_Read_Byte(0);                                                                         //NO ACK
        IIC_Stop();                                                                                                                         //2úéúò&#187;&#184;&#246;í£&#214;1ì&#245;&#188;t         
       
        return (msb << 8) | lsb;
}

//D′&#188;&#196;′&#230;&#198;÷
void MAX44009_WriteData(unsigned char RegAddr, unsigned char value)
{                                                                                                                                                                                          
  IIC_Start();  
        IIC_Write_Byte(SLAVE_ADDRESS<<1);                          //·¢&#203;íéè±&#184;D′&#195;üá&#238;
        IIC_Wait_Ack();
        IIC_Write_Byte(RegAddr);                                                                //·¢&#203;í&#188;&#196;′&#230;&#198;÷μ&#216;&#214;·
        IIC_Wait_Ack();                 

        IIC_Write_Byte(value);                                                                         //·¢&#203;íêy&#190;Y                                                          
        IIC_Wait_Ack();  
  IIC_Stop();                                                                                                                        //2úéúò&#187;&#184;&#246;í£&#214;1ì&#245;&#188;t
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2020-5-6
在线时间
22 小时
发表于 2020-5-7 14:09:07 | 显示全部楼层
wo也是寄存器值无法更新,楼主解决了吗
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2020-10-11
在线时间
0 小时
发表于 2020-10-11 11:14:56 | 显示全部楼层
请问楼主解决了吗========
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2020-12-30
在线时间
1 小时
发表于 2021-1-22 02:04:01 | 显示全部楼层
我也遇到了此问题,
最终排查到的地方是,IIC_STOP() 函数,

我在 IIC_SCL=1; 与 IIC_SDA=1; 之间加了几微秒的延时,
成功解决了MAX44009寄存器不更新的问题。

该方法确实能解决我遇到的问题,但对于其他朋友的问题是否适用,还仅供参考哈。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 16:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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