OpenEdv-开源电子网

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

请问,MS5611的I2C模式为什么不起作用

[复制链接]

3

主题

17

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-12-29
在线时间
5 小时
发表于 2015-12-29 17:56:11 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 umbreLLa 于 2015-12-29 17:56 编辑

[mw_shl_code=c,true]#include "led.h"
#include "delay.h"
#include "sys.h"
#include "key.h"
#include "usart.h"
#include "myiic.h"



int main(void)
{
          u32 ADC;
   u16 PROM;
       
          SystemInit();
          delay_init(72);          
          NVIC_Configuration();
          uart_init(9600);
          LED_Init();
          KEY_Init();
          IIC_Init();


          while(1)
          {
                  delay_ms(1000);
  //                MS5611_reset();
                  MS5611_CONV();
                  MS5611_ADC_read();
  ADC = MS5611_ADC_answer();
                  printf ("%X\n",ADC);
  //                MS5611_reset();
          }

void MS5611_reset(void)
{
IIC_Start();
IIC_Send_Data(0xEC); //MS5611地址 = 1110 1100 = 0xEC
IIC_Wait_Ack();
IIC_Send_Data(0x1E); //MS5611复位命令:0001 1110
IIC_Wait_Ack();
IIC_Stop();
}

void MS5611_CONV(void)
{
IIC_Start();
IIC_Send_Data(0xEC); //MS5611Ð地址 = 1110 1100 = 0xEC
IIC_Wait_Ack();
IIC_Send_Data(0x48); //MS5611开启ADC转换 0100 1000
IIC_Wait_Ack();
IIC_Stop();
}

void MS5611_ADC_read(void)
{
IIC_Start();
IIC_Send_Data(0xEC); //MS5611地址 = 1110 1100 = 0xEC
IIC_Wait_Ack();
IIC_Send_Data(0x00); //MS5611读ADC 0000 0000
IIC_Wait_Ack();
IIC_Stop();
}

u32 MS5611_ADC_answer(void)
{
u32 data0,data1,data2;
u32 data;

  IIC_Start();
IIC_Send_Data(0xED); //MS5611地址+1 = 1110 1101 = 0xED
IIC_Wait_Ack();
data0 = IIC_Read_Data(1); //高8位
data1 = IIC_Read_Data(1); //中8位
data2 = IIC_Read_Data(0); //低8位
IIC_Stop();

data = (data0<<16)+(data1<<8)+data2;
return data;
}

}
[/mw_shl_code]


这个是我写的代码,拜托大家看看有没有问题,运行之后,显示FFFFFF,明显不起作用,不知道哪有问题。

最佳答案

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

已经解决了。 在开启MS5611的ADC转换后,要有一个延时才让MS5611进入ADC读模式。 在 MS5611_CONV();后加delay_ms(20);就能正常地读数了。 希望遇到同样问题的人看看吧。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

17

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-12-29
在线时间
5 小时
 楼主| 发表于 2015-12-29 17:56:12 | 显示全部楼层
已经解决了。
在开启MS5611的ADC转换后,要有一个延时才让MS5611进入ADC读模式。
在 MS5611_CONV();后加delay_ms(20);就能正常地读数了。

希望遇到同样问题的人看看吧。
回复

使用道具 举报

3

主题

17

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-12-29
在线时间
5 小时
 楼主| 发表于 2015-12-29 18:16:08 | 显示全部楼层
本帖最后由 umbreLLa 于 2015-12-29 18:19 编辑

我的CSB接的是高电平,所以地址是1110 110左对齐,也就是0xEC,没问题吧。


等待应答,IIC_Wait_Ack();和while(IIC_Wait_Ack());都试过了。。。
我实在搞不定了

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-12-29 22:26:02 | 显示全部楼层
2楼不是答案么
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

17

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-12-29
在线时间
5 小时
 楼主| 发表于 2015-12-30 09:16:34 | 显示全部楼层

那是我后来费老大劲才解决的= =,发出来分享下
回复

使用道具 举报

0

主题

7

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2023-7-7
在线时间
1 小时
发表于 2023-7-8 11:15:17 | 显示全部楼层
大佬,我显示出来就是一个定值,求解
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 06:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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