OpenEdv-开源电子网

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

MIN32 模拟I2C读取BMP280,输出数据错误。求大神解答。

[复制链接]

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2018-7-9
在线时间
15 小时
发表于 2022-1-17 16:58:18 | 显示全部楼层 |阅读模式
通过PA6,PA7 模拟 i2C,参考网上读取BMP280程序,但是读数不对,求大神帮修改下程序。
气压:582.051514
温度 :0.000000
高度 :5125.797852



Template V1.1.zip

3.74 MB, 下载次数: 18

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

使用道具 举报

2

主题

458

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4473
金钱
4473
注册时间
2018-5-14
在线时间
959 小时
发表于 2022-1-18 17:14:51 | 显示全部楼层
本帖最后由 姚先起 于 2022-1-18 17:25 编辑

复制代码
回复 支持 反对

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2018-7-9
在线时间
15 小时
 楼主| 发表于 2022-1-18 17:22:53 | 显示全部楼层
已经解决,把I2C的时序调整下就可以。#include "myiic.h"
#include "delay.h"
#include "stm32f10x.h"
#include "stdbool.h"

char   test=0;
//3õê¼»ˉIIC
void IIC_Init(void)
{                                             
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOA, ENABLE );          
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   //íÆíìêä3ö
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOA, ENABLE );          
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;   //¿a©êä3ö
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        SDA_H;
        SCL_L;
}
/*******************************************************************************
* Function Name  : I2C_delay
* Description    : Simulation IIC Timing series delay
* Input          : None
* Output         : None
* Return         : None
****************************************************************************** */
void I2C_delay(void)
{
               
   u8 i=5; //Õaàï¿éòÔóÅ»ˉËù¶è        £¬¾-2aêÔ×îμíμ½5»1ÄüD′èë
   while(i)
   {
     i--;
   }  
}

void delay5us(void)
{
               
   int i=5;  
   while(i)
   {
     i--;
   }  
}
/*******************************************************************************
* Function Name  : I2C_Start
* Description    : Master Start Simulation IIC Communication
* Input          : None
* Output         : None
* Return         : Wheather         Start
****************************************************************************** */
//static void iicDevStart(void)
bool iicDevStart(void)
{
//        SDA_OUT();     //sdaÏßêä3ö
//        IIC_SDA=1;                    
//        IIC_SCL=1;
//        delay_us(4);//
//         IIC_SDA=0;//START:when CLK is high,DATA change form high to low
//        delay_us(4);
//        IIC_SCL=0;//ÇˉסI2C×üÏߣ¬×¼±¸·¢Ëí»ò½óêÕêy¾Y
        SDA_H;
        SCL_H;
        delay_us(4);//I2C_delay();
        if(!SDA_read)return false;        //SDAÏßÎaμíμçÆ½Ôò×üÏßÃ|,íË3ö
        SDA_L;
        delay_us(4);//I2C_delay();
        if(SDA_read) return false;        //SDAÏßÎa¸ßμçÆ½Ôò×üÏß3ö′í,íË3ö
        SDA_L;
        delay_us(4);//I2C_delay();
        return true;
}          
//2úéúIIC1í£Ö1DÅoÅ
static void iicDevStop(void)
{
//        SDA_OUT();//sdaÏßêä3ö
//        IIC_SCL=0;
//        IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
//         delay_us(4);
//        IIC_SCL=1;
//        IIC_SDA=1;//·¢ËíI2C×üÏß½áêøDÅoÅ
//        delay_us(4);                       

        SCL_L;
//        I2C_delay();
        SDA_L;
        delay_us(4);//I2C_delay();
        SCL_H;
//        I2C_delay();
        SDA_H;
        delay_us(4);//I2C_delay();
}
/*******************************************************************************
* Function Name  : I2C_WaitAck
* Description    : Master Reserive Slave Acknowledge Single
* Input          : None
* Output         : None
* Return         : Wheather         Reserive Slave Acknowledge Single
****************************************************************************** *///μè′yó|′eDÅoÅμ½à′
//·μ»ØÖμ£o1£¬½óêÕó|′eê§°ü
//        0£¬½óêÕó|′e3é1|
static u8 iicDevWaitAck(void)
{
//        u8 ucErrTime=0;
//        SDA_IN();      //SDAéèÖÃÎaêäèë  
//        IIC_SDA=1;delay_us(1);          
//        IIC_SCL=1;delay_us(1);         
//        while(READ_SDA)
//        {
//                ucErrTime++;
//                if(ucErrTime>250)
//                {
//                        iicDevStop();
//                        return 1;
//                }
//        }
//        IIC_SCL=0;//ê±Öóêä3ö0           
//        return 0;  
       
        SCL_L;
//        I2C_delay();
        SDA_H;                       
        delay_us(1);//I2C_delay();
        SCL_H;
        delay_us(1);//I2C_delay();
        if(SDA_read)
        {
      SCL_L;
//            I2C_delay();
      return false;
        }
        SCL_L;
//        I2C_delay();
        return true;
}
/*******************************************************************************
* Function Name  : I2C_Ack
* Description    : Master Send Acknowledge Single
* Input          : None
* Output         : None
* Return         : None
****************************************************************************** */
//2úéúACKó|′e
static void iicDevAck(void)
{
//        IIC_SCL=0;
//        SDA_OUT();
//        IIC_SDA=0;
//        delay_us(1);
//        IIC_SCL=1;
//        delay_us(1);
//        IIC_SCL=0;
       
        SCL_L;
//        I2C_delay();
        SDA_L;
        delay_us(1);//I2C_delay();
        SCL_H;
        delay_us(1);//I2C_delay();
        SCL_L;
//        I2C_delay();
}
/*******************************************************************************
* Function Name  : I2C_NoAck
* Description    : Master Send No Acknowledge Single
* Input          : None
* Output         : None
* Return         : None
****************************************************************************** */
//2»2úéúACKó|′e                    
static void iicDevNAck(void)
{
//        IIC_SCL=0;
//        SDA_OUT();
//        IIC_SDA=1;
//        delay_us(1);
//        IIC_SCL=1;
//        delay_us(1);
//        IIC_SCL=0;
       
        SCL_L;
//        I2C_delay();
        SDA_H;
        delay_us(1);//I2C_delay();
        SCL_H;
        delay_us(1);//I2C_delay();
        SCL_L;
//        I2C_delay();
}               
/*******************************************************************************
* Function Name  : I2C_SendByte
* Description    : Master Send a Byte to Slave
* Input          : Will Send Date
* Output         : None
* Return         : None
****************************************************************************** */
//IIC1·¢Ëíò»¸ö×Ö½ú
//·μ»Ø′ó»úóDÎTó|′e
//1£¬óDó|′e
//0£¬ÎTó|′e                          
static void iicDevSendByte(u8 txd)
{                        
//    u8 t;   
//          SDA_OUT();             
//    IIC_SCL=0;//à-μíê±Öó¿aê¼êy¾Y′«êä
//    for(t=0;t<8;t++)
//    {              
//        IIC_SDA=(txd&0x80)>>7;
//        txd<<=1;           
//                delay_us(1);   
//                IIC_SCL=1;
//                delay_us(1);
//                IIC_SCL=0;       
//                delay_us(1);
//    }                        
                u8 i=8;
    while(i--)
    {
        SCL_L;
        delay_us(1);//I2C_delay();
      if(txd&0x80)
        SDA_H;  
      else
        SDA_L;   
        txd<<=1;
        delay_us(1);//I2C_delay();
                    SCL_H;
        delay_us(1);//I2C_delay();
    }
    SCL_L;
                delay_us(1);
}             
//&#182;á1&#184;&#246;×&#214;&#189;ú£&#172;ack=1ê±£&#172;·¢&#203;íACK£&#172;ack=0£&#172;·¢&#203;ínACK   
static u8 iicDevReceiveByte(u8 ack)
{
        u8 i,receive=0;
        SDA_H;// SDA_IN();//SDAéè&#214;&#195;&#206;aê&#228;è&#235;
    for(i=0;i<8;i++ )
        {
        SCL_L;//IIC_SCL=0;
        delay_us(1);
                    SCL_H;//IIC_SCL=1;
        receive<<=1;
    if(SDA_read)receive++;   
                delay_us(1);
    }                                         
    if (!ack)
        iicDevNAck();//·¢&#203;ínACK
    else
        iicDevAck(); //·¢&#203;íACK   
    return receive;
}

//′ó&#214;&#184;&#182;¨μ&#216;&#214;·&#182;á3&#246;ò&#187;&#184;&#246;êy&#190;Y
//ReadAddr:&#191;aê&#188;&#182;áêyμ&#196;μ&#216;&#214;·  
//·μ&#187;&#216;&#214;μ  :&#182;áμ&#189;μ&#196;êy&#190;Y
u8 iicDevReadByte(u8 devaddr,u8 addr)
{                                  
        u8 temp=0;                                                                                                                                                               
        iicDevStart();  
        iicDevSendByte(devaddr);//·¢&#203;í&#198;÷&#188;tD′&#195;üá&#238;           
        iicDevWaitAck();
        iicDevSendByte(addr);   //·¢&#203;íμíμ&#216;&#214;·
        iicDevWaitAck();       

        iicDevStart();                     
        iicDevSendByte(devaddr|1);//·¢&#203;í&#198;÷&#188;t&#182;á&#195;üá&#238;                          
        iicDevWaitAck();         
        temp=iicDevReceiveByte(0);                          
        iicDevStop();//2úéúò&#187;&#184;&#246;í£&#214;1ì&#245;&#188;t            
        return temp;
}
//á&#172;D&#248;&#182;á&#182;à&#184;&#246;×&#214;&#189;ú
//addr:&#198;eê&#188;μ&#216;&#214;·
//rbuf:&#182;áêy&#190;Y&#187;o′&#230;
//len:êy&#190;Y3¤&#182;è
void iicDevRead(u8 devaddr,u8 addr,u8 len,u8 *rbuf)
{
        int i=0;
        iicDevStart();  
        iicDevSendByte(devaddr);  
        iicDevWaitAck();       
        iicDevSendByte(addr);//μ&#216;&#214;·×&#212;&#212;&#246;  
        iicDevWaitAck();       

        iicDevStart();         
        iicDevSendByte(devaddr|1);         
        iicDevWaitAck();       
        for(i=0; i<len; i++)
        {
                if(i==len-1)
                {
                        rbuf[i] = iicDevReceiveByte(0);//×&#238;oóò&#187;&#184;&#246;×&#214;&#189;ú2&#187;ó|′e
                }
                else
                        rbuf[i] = iicDevReceiveByte(1);
        }
        iicDevStop( );       
}
//′ó&#214;&#184;&#182;¨μ&#216;&#214;·D′è&#235;ò&#187;&#184;&#246;êy&#190;Y
//WriteAddr ′è&#235;êy&#190;Yμ&#196;&#196;&#191;μ&#196;μ&#216;&#214;·   
//DataToWrite:òaD′è&#235;μ&#196;êy&#190;Y
void iicDevWriteByte(u8 devaddr,u8 addr,u8 data)
{                                                                                                                                                                                          
        iicDevStart();  
        iicDevSendByte(devaddr); //·¢&#203;í&#198;÷&#188;tD′&#195;üá&#238;          
        iicDevWaitAck();          
        iicDevSendByte(addr);   //·¢&#203;íμíμ&#216;&#214;·
        iicDevWaitAck();                                                                                                              
        iicDevSendByte(data); //·¢&#203;í×&#214;&#189;ú                                                          
        iicDevWaitAck();                                
        iicDevStop();                //2úéúò&#187;&#184;&#246;í£&#214;1ì&#245;&#188;t          
}

//á&#172;D&#248;D′&#182;à&#184;&#246;×&#214;&#189;ú
//addr:&#198;eê&#188;μ&#216;&#214;·
//wbuf′êy&#190;Y&#187;o′&#230;
//len:êy&#190;Yμ&#196;3¤&#182;è
void iicDevWrite(u8 devaddr,u8 addr,u8 len,u8 *wbuf)
{
        int i=0;
        iicDevStart();  
        iicDevSendByte(devaddr);         
        iicDevWaitAck();       
        iicDevSendByte(addr);  //μ&#216;&#214;·×&#212;&#212;&#246;
        iicDevWaitAck();       
        for(i=0; i<len; i++)
        {
                iicDevSendByte(wbuf[i]);  
                iicDevWaitAck();               
        }
        iicDevStop();       
}


回复 支持 反对

使用道具 举报

13

主题

644

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1998
金钱
1998
注册时间
2021-4-16
在线时间
509 小时
发表于 2022-1-19 11:56:45 | 显示全部楼层
帮顶   
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-20 13:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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