OpenEdv-开源电子网

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

请问有人使用模拟IIC或SPI读取气压传感器BMP280没

[复制链接]

145

主题

445

帖子

0

精华

高级会员

Rank: 4

积分
823
金钱
823
注册时间
2014-1-15
在线时间
350 小时
发表于 2017-5-23 16:22:43 | 显示全部楼层 |阅读模式
100金钱
本帖最后由 Di诺 于 2017-5-23 16:27 编辑

试了好久,连芯片ID怎么都读不出来。。。下面模拟iic程序有问题???


void BMP280_CfgSDAOutput(void)
{
    nrf_gpio_cfg_output(BMP280_SDA_PIN);   
}
/******************************************************************************/
void BMP280_CfgSDAInput(void)
{
    nrf_gpio_cfg_input(BMP280_SDA_PIN,NRF_GPIO_PIN_PULLUP);
}
/******************************************************************************/
void BMP280_SetSDA(void)
{
    nrf_gpio_pin_set(BMP280_SDA_PIN);   
}
/******************************************************************************/
void BMP280_ClearSDA(void)
{
    nrf_gpio_pin_clear(BMP280_SDA_PIN);   
}
/******************************************************************************/
void BMP280_SetSCK(void)
{
    nrf_gpio_pin_set(BMP280_SCK_PIN);   
}
/******************************************************************************/
void BMP280_ClearSCK(void)
{
    nrf_gpio_pin_clear(BMP280_SCK_PIN);   
}
/******************************************************************************/
void BMP280_Init(void)
{
    nrf_gpio_cfg_output(BMP280_EN_PIN);
    nrf_gpio_pin_set(BMP280_EN_PIN);
    nrf_gpio_cfg_output(BMP280_CSB_PIN);
    BMP280_CfgSDAOutput();
    nrf_gpio_cfg_output(BMP280_SCK_PIN);
    nrf_gpio_cfg_output(BMP280_SDO_PIN);


        nrf_gpio_pin_clear(BMP280_SDO_PIN);
    nrf_gpio_pin_set(BMP280_CSB_PIN);
        nrf_gpio_pin_clear(BMP280_EN_PIN);
    BMP280_SetSDA();
    nrf_delay_us(5);
    BMP280_SetSCK();
    nrf_delay_us(200000);
}
/******************************************************************************/
void IIC_Start(void)
{
    BMP280_CfgSDAOutput();
    BMP280_SetSDA();
    BMP280_SetSCK();
    nrf_delay_us(5);   

    BMP280_ClearSDA();
    nrf_delay_us(5);   
    BMP280_ClearSCK();
//    nrf_delay_us(1);   
}
/******************************************************************************/
void IIC_Stop(void)
{
    BMP280_CfgSDAOutput();
    BMP280_ClearSCK();
    BMP280_ClearSDA();

    nrf_delay_us(5);

    BMP280_SetSCK();
        nrf_delay_us(5);   
    BMP280_SetSDA();
    nrf_delay_us(5);   
}
/*******************************************************************************

*/

uint8_t IIC_WaitAck(void)
{
    uint8_t ack;

    BMP280_CfgSDAInput();
    BMP280_SetSDA();
    nrf_delay_us(1);

    BMP280_SetSCK();
    nrf_delay_us(5);

    if(nrf_gpio_pin_read(BMP280_SDA_PIN) == 1)
    {
        ack = 1;
    }
    else
    {
        ack = 0;
    }
    BMP280_ClearSCK();
    nrf_delay_us(5);
    return ack;   
}
/******************************************************************************/
void IIC_Ack(void)
{
    BMP280_ClearSCK();
    BMP280_CfgSDAOutput();
    BMP280_ClearSDA();

    nrf_delay_us(5);
    BMP280_SetSCK();
    nrf_delay_us(5);
    BMP280_ClearSCK();
//    BMP280_SetSDA();
}
/******************************************************************************/
void IIC_NoAck(void)
{
    BMP280_ClearSCK();
    BMP280_CfgSDAOutput();
    BMP280_SetSDA();

    nrf_delay_us(5);
    BMP280_SetSCK();
    nrf_delay_us(5);
    BMP280_ClearSCK();
}
/******************************************************************************/
void IIC_SendByte(uint8_t dat)
{
    uint8_t i, d;
    BMP280_CfgSDAOutput();
    BMP280_ClearSCK();
//    nrf_delay_us(1);

    d = dat;
    for(i = 0; i < 8; i++)
    {
        if((d & 0x80)>>7)
        {
            BMP280_SetSDA();
        }
        else
        {
            BMP280_ClearSDA();
        }
        d<<=1;
        nrf_delay_us(5);
        BMP280_SetSCK();
        nrf_delay_us(5);
        BMP280_ClearSCK();
        nrf_delay_us(5);   
    }
}
/******************************************************************************/
uint8_t IIC_ReadByte(void)
{
    uint8_t d, i;

    BMP280_CfgSDAInput();
    nrf_delay_us(1);

    d = 0;

    for(i = 0; i < 8; i++)
    {
        BMP280_ClearSCK();
        nrf_delay_us(5);
        BMP280_SetSCK();
        d <<= 1;

        if(nrf_gpio_pin_read(BMP280_SDA_PIN) == 1)
        {
            d++;
        }
    }

    return d;
}
/******************************************************************************/
uint8_t BMP280_ReadOneByte(uint8_t addr)
{
    uint8_t flag, tmp;

    IIC_Start();

    IIC_SendByte(BMP280_SLAVE_ADDR );
    IIC_WaitAck();
   // if(== 0)
    {
        IIC_SendByte(addr);
        IIC_WaitAck();
       // if( == 0)
        {
            IIC_Start();
            IIC_SendByte(BMP280_SLAVE_ADDR | 0x01);
            IIC_WaitAck();
            //if( == 0)
            {
                tmp = IIC_ReadByte();
                IIC_NoAck();
            }
        }
    }
    IIC_Stop();
    return tmp;
}
/******************************************************************************/
uint16_t BMP280_ReadTwoByte(uint8_t addr)
{
    uint8_t flag;
    uint16_t d;

    IIC_Start();

    IIC_SendByte(BMP280_SLAVE_ADDR);
    d = 0;

    if(flag == 0)
    {
        IIC_SendByte(addr<<1);
        IIC_Start();
        IIC_SendByte(BMP280_SLAVE_ADDR | 0x01);
        d = ((uint16_t)IIC_ReadByte())<<8;
        IIC_Ack();
        d |= (uint16_t)IIC_ReadByte();
        IIC_NoAck();
        IIC_Stop();
    }

    return d;   
}
/******************************************************************************/
void BMP280_WriteOneByte(uint8_t addr, uint8_t dat)
{
    IIC_Start();
    IIC_SendByte(BMP280_SLAVE_ADDR);
    IIC_SendByte(addr);
    IIC_SendByte(dat);
    IIC_Stop();
}

/******************************************************************************/
uint8_t bmp280_id;

void BMP280_CS(void)
{   
    bmp280_id = BMP280_ReadOneByte(BMP280_CHIPID_REG);
}
/******************************************************************************/





























最佳答案

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

使用道具 举报

145

主题

445

帖子

0

精华

高级会员

Rank: 4

积分
823
金钱
823
注册时间
2014-1-15
在线时间
350 小时
 楼主| 发表于 2017-5-23 16:22:44 | 显示全部楼层
回复

使用道具 举报

6

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2015-6-19
在线时间
23 小时
发表于 2017-5-23 17:38:49 | 显示全部楼层
我之前用过SPI接口。IIC没试过。
你们城里人代码写得真好~~~
回复

使用道具 举报

145

主题

445

帖子

0

精华

高级会员

Rank: 4

积分
823
金钱
823
注册时间
2014-1-15
在线时间
350 小时
 楼主| 发表于 2017-5-24 09:06:30 | 显示全部楼层
卜道翁 发表于 2017-5-23 17:38
我之前用过SPI接口。IIC没试过。

是模拟的SPI吗?能不能让我抄袭一下?
回复

使用道具 举报

6

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2015-6-19
在线时间
23 小时
发表于 2017-5-25 09:14:34 | 显示全部楼层
Di诺 发表于 2017-5-24 09:06
是模拟的SPI吗?能不能让我抄袭一下?

硬件spi接口
你们城里人代码写得真好~~~
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7523
金钱
7523
注册时间
2016-11-30
在线时间
641 小时
发表于 2017-5-25 09:44:47 | 显示全部楼层
拿走不谢!

BMP280.rar

3.58 KB, 下载次数: 561

回复

使用道具 举报

6

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2015-6-19
在线时间
23 小时
发表于 2017-5-25 09:55:51 | 显示全部楼层
你们城里人代码写得真好~~~
回复

使用道具 举报

0

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2015-9-1
在线时间
29 小时
发表于 2017-5-25 10:16:07 | 显示全部楼层
有的IIC的命令构成是不一样的,我以前就碰到,比24C16小的,都是多了个等待回复命令,比24C16大的,就没有等待回复命令,多个命令就通信不上
回复

使用道具 举报

0

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2015-9-1
在线时间
29 小时
发表于 2017-5-25 10:16:37 | 显示全部楼层
读一个字节的命令
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-9-29
在线时间
3 小时
发表于 2019-9-29 20:23:27 | 显示全部楼层

太6666了
回复

使用道具 举报

4

主题

11

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2019-11-2
在线时间
13 小时
发表于 2019-11-11 17:19:34 | 显示全部楼层
请问您的模拟IIC读气压实现了吗?求指导
回复

使用道具 举报

15

主题

74

帖子

0

精华

初级会员

Rank: 2

积分
199
金钱
199
注册时间
2020-10-9
在线时间
34 小时
发表于 2021-5-17 15:10:00 | 显示全部楼层

请问您的模拟IIC读气压实现了吗?求指导
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-23 18:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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