打印

STM32用I2C读IAQengine

[复制链接]
楼主: ustb_cc
手机看帖
扫描二维码
随时随地手机跟帖
21
bear1| | 2014-9-1 14:45 | 只看该作者 回帖奖励 |倒序浏览
这个问题st到现在还没有解决啊?

使用特权

评论回复
22
电子过客| | 2014-9-1 14:48 | 只看该作者
asdy00000 发表于 2014-9-1 10:55
应该是您的数据格式处理不对。

我调试的没有应答是回事啊?

我刚做IAQ ,能不能发给我份啊。
516521158@qq.com

使用特权

评论回复
23
asdy00000| | 2014-9-1 16:21 | 只看该作者
电子过客 发表于 2014-9-1 14:48
我刚做IAQ ,能不能发给我份啊。
516521158@qq.com

没有啊。我也在弄呢。。怎么调都没有应答。

使用特权

评论回复
24
电子过客| | 2014-9-1 20:35 | 只看该作者
asdy00000 发表于 2014-9-1 16:21
没有啊。我也在弄呢。。怎么调都没有应答。

你的IAQ说明3M多吗,我的英文的才400多k,没关系的我只是想参考下它采集时序,
尤其是后边的7个字节,完全弄蒙了

使用特权

评论回复
25
asdy00000| | 2014-9-2 09:08 | 只看该作者
本帖最后由 asdy00000 于 2014-9-2 17:12 编辑
电子过客 发表于 2014-9-1 20:35
你的IAQ说明3M多吗,我的英文的才400多k,没关系的我只是想参考下它采集时序,
尤其是后边的7个字节,完 ...


我的也是400多k的,您能指导一下怎么能接收到应答吗?!
我现在不确定是软件问题还是硬件问题,感觉硬件问题大些。。上拉电阻那个地方用3.3V上拉可以吗?您的部分程序可以共享一下吗?

使用特权

评论回复
26
电子过客| | 2014-9-2 10:32 | 只看该作者
asdy00000 发表于 2014-9-2 09:08
我的也是400多k的,您能指导一下怎么能接收到应答吗?!
我现在不确定是软件问题还是硬件问题,感觉硬件 ...

我刚弄清楚协议,别人的51测试程序
#include <intrins.h>
#include <New51.h>
#include <intrins.h>
#include <absacc.h>
#include <stdio.h>
#include <math.h>
#define  _I2C_C_
unsigned char SystemError;
#define  NOPS();{_nop_();_nop_();_nop_();_nop_();_nop_();}
typedef unsigned char BYTE;
typedef unsigned char byte;
typedef unsigned int  word;
word tcount;
word a;
typedef unsigned int uchar;

unsigned char data_buf[1];
sbit    SCL = P1^6;
sbit    SDA = P1^7;
bit bdata I2C_Ack;
void I2C_Init(void);
void I2C_Start(void);
void I2C_Stop(void);

/
//---------------------------------
//  Function: void I2C_Start(void)
//  Discrption:
//----------------------------------
void I2C_Start(void)
{
  SDA = 1;
  SCL = 1;
  NOPS(); //Initial
  SDA = 0;
  NOPS();       //START
  SCL = 0;
}

//---------------------------------
//  Function: void I2C_Stop(void)
//  Discrption:
//----------------------------------
void I2C_Stop(void)
{
  SCL = 0;
  SDA = 0;
  NOPS();     //Initial
  SCL = 1;
  NOPS();       //STOP   
  SDA = 1;
}

//---------------------------------
//  Function: void I2C_Start(void)
//  Discrption:
//----------------------------------

WaitAck(void)
{
  unsigned char errtime = 255;
  SDA = 1;
  NOPS();
  SCL = 1;
  NOPS();
  SystemError = 0x10;
  while(SDA)
  {
    errtime--;
    if(!errtime)
    {
      I2C_Stop();
      SystemError = 0x11;
      return;
    }
  }
  SCL = 0;
}

//---------------------------------
//  Function: void SendAck(void)
//  Discrption:
//----------------------------------
void SendAck(void)
{
  SDA =0 ;
  NOPS();
  SCL = 1;
  NOPS();
  SCL = 0;
}

//---------------------------------
//  Function: void SendNotAck(void)
//  Discrption:
//----------------------------------
void SendNotAck(void)
{
  SDA =1 ;
  NOPS();
  SCL = 1;
  NOPS();
  SCL = 0;
}

//-----------------------------------------------------
//  Function: void I2CSendByte(unsigned char send_data)
//  Discrption:
//-----------------------------------------------------
void I2CSendByte(unsigned char send_data)
{
  unsigned char count = 8;
  for(count = 0;count<8;count++)
  {
    SCL = 0;
    _nop_();
   SDA = (bit)(send_data & 0x80);
   send_data <<= 1;
   NOPS();
   SCL = 1;
   NOPS();  
  }
  SCL = 0;
}

//-----------------------------------------------------
//  Function: unsigned char I2CReceiveByte(void)
//  Discrption:
//-----------------------------------------------------
unsigned char I2CReceiveByte(void)
{
  unsigned char count = 8;
  unsigned char dat = 0;   
  SDA = 1;
  for(count = 0;count<8;count++)
  {   
   dat <<= 1;
   SCL = 0;
   NOPS();
   SCL = 1;
   NOPS();
   dat |= SDA;   
  }
  SCL = 0;
  return(dat);
}

//--------------------------------------------------------------------------
//  Function: void WriteCharToChip(unsigned int address,unsigned char dat)
//  Discrption:
//--------------------------------------------------------------------------
void WriteCharToChip(unsigned int address,unsigned char dat)
{
  I2C_Start();
  //I2CSendByte(0xA0);    //
   I2CSendByte(0x5a);
  WaitAck();
  I2CSendByte((char)(address)>>8);  //????AT24C02,AT24C64,AT24C128,AT24C256??,??????????
  Delay(300);
  WaitAck();
  I2CSendByte((char)(address));
  WaitAck();  
  I2CSendByte(dat);
  Delay(300);
  WaitAck();
  I2C_Stop();
}
//--------------------------------------------------------------------------
//  Function: unsigned char ReadCharFromChip(unsigned int Address)
//  Discrption:
//--------------------------------------------------------------------------
unsigned char ReadCharFromChip(unsigned int Address)
{
   unsigned char recv_data;
   I2C_Start();
   //I2CSendByte(0xA0);  //
     I2CSendByte(0x5a);
   WaitAck();
   I2CSendByte((char)(Address>>8));//
   WaitAck();
   I2CSendByte((char)(Address));
   WaitAck();
   I2C_Start();
   //I2CSendByte(0xA1);  //
    I2CSendByte(0x5b);
   WaitAck();
   recv_data = I2CReceiveByte();
   SendNotAck();
   I2C_Stop();
   return(recv_data);

void main(void)
{  unsigned char Read_data;
  Timer_Init();
  P3=0xff;
  P1=0xff;
  P2=0xf0;
  I2C_Init();
  I2C_Start();
  I2C_Stop();
  Send_Uart(0xa5);
  Send_Byte(CMD_RESET);
  Display();
while(1)
{  // WriteCharToChip(0x10,0xa3);    //
   // Read_data = ReadCharFromChip(0x10);  //
    WriteCharToChip(0xb5,0x5a);   
   Read_data = ReadCharFromChip(0xb5);   
    Display(Read_data);                   
    Delay_us(20000);
         Delay_us(20000);
       
  }
  }



使用特权

评论回复
27
电子过客| | 2014-9-2 10:35 | 只看该作者
asdy00000 发表于 2014-9-2 09:08
我的也是400多k的,您能指导一下怎么能接收到应答吗?!
我现在不确定是软件问题还是硬件问题,感觉硬件 ...

我的邮箱是516521158.qq.com希望你发一份或分享下代码

使用特权

评论回复
28
asdy00000| | 2014-9-2 14:44 | 只看该作者
电子过客 发表于 2014-9-2 10:35
我的邮箱是516521158.qq.com希望你发一份或分享下代码

您发送地址代码的部分有些问题。。
我现在有应答了。。但是后面的读数有问题。。不对。。
#include "stm32f10x.h"
#include "util.h"
#include <stdio.h>
/* Private macro -------------------------------------------------------------*/
#define SCLL                                   GPIOB->BRR = GPIO_Pin_10
#define SCLH                                GPIOB->BSRR = GPIO_Pin_10                                             
#define SDAL                                GPIOB->BRR = GPIO_Pin_11
#define SDAH                                GPIOB->BSRR = GPIO_Pin_11

#define SDA_STATE                        GPIOB->IDR&GPIO_Pin_11

enum I2C_REPLY {I2C_NACK = 0, I2C_ACK = 1};

enum I2C_STATE {I2C_READY = 0, I2C_BUSY = 1, I2C_ERROR = 2};
/* Private functions ---------------------------------------------------------*/
static u8 I2C_Start(void);
static void I2C_Stop(void);
static void I2C_Ack(u8);
static u8 I2C_Wait_Ack(void);
static void I2C_SendByte(u8);
static u8 I2C_ReceiveByte(void);
/*******************************************************************************/
void IAQ_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;

        //配置I2C1_SCL(PB6)和I2C1_SDA(PB7)开漏输出
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/*******************************************************************************/
static u8 I2C_Start(void)
{
        SDAH;
        SCLH;
        delay_us(5);
        if(!SDA_STATE) {
                printf("I2C is busy!\r\n");
                return I2C_BUSY;         
        }
        SDAL;
        delay_us(5);
        SCLL;
        delay_us(10);
        if(SDA_STATE) {
                printf("I2C is error!\r\n");
                return I2C_ERROR;
        }
        return I2C_READY;
}
/*******************************************************************************/
static void I2C_Stop(void)
{
        SDAL;
        delay_us(5);
        SCLH;
        delay_us(5);
        SDAH;
        delay_us(5);
}
/*******************************************************************************/
static void I2C_Ack(u8 i)
{
        if(i)
                SDAL;                                //ACK
        else                                       
                SDAH;                                //NACK
        delay_us(2);
        SCLH;
        delay_us(2);
        SCLL;
        delay_us(2);
}
/*******************************************************************************/
static u8 I2C_Wait_Ack(void)
{
        u8 ucErrTime = 0;
        SDAH;
        delay_us(2);
        SCLH;
        delay_us(2);
        while(SDA_STATE)
        {
                ucErrTime++;
                if(ucErrTime > 250)
                {
                        I2C_Stop();
                        printf("I2C NACK!\r\n");
                        return I2C_NACK;
                }
        }
        SCLL;
        delay_us(2);
        return I2C_ACK;
}
/*******************************************************************************/
static void I2C_SendByte(u8 d)
{
        u8 i;

        SCLL;
        delay_us(2);
        for(i=0x80;i!=0;i/=2)
        {
                  if(i&d)
                           SDAH;
                  else
                           SDAL;
                delay_us(2);
                  SCLH;
                  delay_us(2);
                  SCLL;
                  delay_us(2);
        }
}
/*******************************************************************************/
static u8 I2C_ReceiveByte(void)
{
        u8 i, d=0;
        SDAH;
        SCLL;
        delay_us(2);
        for(i=0x80;i!=0;i/=2)
        {
                  SCLH;
                delay_us(2);
                if(SDA_STATE)
                           d |= i;
                 SCLL;
                  delay_us(2);
        }
        return d;
}
/*******************************************************************************/
u8 IAQ_Read(u8 *pBuffer, u8 NumByteToRead)
{
        if(I2C_Start()) {
                printf("Start error!\r\n");
                return 1;
        }
        I2C_SendByte(0xB5);
        if(!I2C_Wait_Ack()) {
                printf("No Ack after send address!\r\n");
                return 2;
        }
  
        while(NumByteToRead--) {
                        delay_us(20);
                        *pBuffer++ = I2C_ReceiveByte();
                        delay_us(20);
                        if(NumByteToRead)
                                I2C_Ack(1);
                        else
                                I2C_Ack(0);        
        }
        return 0;
}

使用特权

评论回复
29
电子过客| | 2014-9-2 15:39 | 只看该作者
asdy00000 发表于 2014-9-2 14:44
您发送地址代码的部分有些问题。。
我现在有应答了。。但是后面的读数有问题。。不对。。
#include "stm3 ...

这是我在卖家要的,人家肯定是全给你,而是部分,我也就是参考下人家采集的过程,

使用特权

评论回复
30
电子过客| | 2014-9-2 15:42 | 只看该作者
asdy00000 发表于 2014-9-2 14:44
您发送地址代码的部分有些问题。。
我现在有应答了。。但是后面的读数有问题。。不对。。
#include "stm3 ...

另外这传感器的头15分钟数据是不对的,因为它需要遇热的,感谢分享多多指教

使用特权

评论回复
31
asdy00000| | 2014-9-2 15:52 | 只看该作者
电子过客 发表于 2014-9-2 15:42
另外这传感器的头15分钟数据是不对的,因为它需要遇热的,感谢分享多多指教 ...

我的传感器一直通电呢。。读出来的数据第一个字节是有点变化,其他字节的数都是FF(不变)。我感觉读数的时序什么的不对。。现在也没查出来原因。。

使用特权

评论回复
32
电子过客| | 2014-9-2 16:26 | 只看该作者
asdy00000 发表于 2014-9-2 15:52
我的传感器一直通电呢。。读出来的数据第一个字节是有点变化,其他字节的数都是FF(不变)。我感觉读数的 ...

上拉电阻你选的4.7k吗,改小一点试试

使用特权

评论回复
33
asdy00000| | 2014-9-2 16:52 | 只看该作者
本帖最后由 asdy00000 于 2014-9-2 16:53 编辑
电子过客 发表于 2014-9-2 16:26
上拉电阻你选的4.7k吗,改小一点试试


是4.7k啊。。这与上拉电阻有关系?我的start和发送地址0xB5的ack都好用。。就是读数不对啊。。您读的怎么样?您的qq多少号啊?

使用特权

评论回复
34
asdy00000| | 2014-9-2 16:58 | 只看该作者
本帖最后由 asdy00000 于 2014-9-2 17:00 编辑
zdxyydy 发表于 2014-8-27 21:41
我也遇到问题了, iaq 有应答,可是后面读的数据感觉不对啊, status字节一直是0xff,求完整手册,感谢!!!  ...


您好,我也遇到了和您一样的问题,除了第一个字节其他的都是0xff,请您指导一下!谢了哈!郁闷很久了。。唉。。

使用特权

评论回复
35
电子过客| | 2014-9-2 17:26 | 只看该作者
asdy00000 发表于 2014-9-2 16:52
是4.7k啊。。这与上拉电阻有关系?我的start和发送地址0xB5的ack都好用。。就是读数不对啊。。您读的怎么 ...

我刚接触IAQ,,还没有测试呢, 你多多指教, 你读的是7个字节吗,取得的值是头俩个的字节数值,企鹅516521158

使用特权

评论回复
36
asdy00000| | 2014-9-2 17:41 | 只看该作者
电子过客 发表于 2014-9-2 17:26
我刚接触IAQ,,还没有测试呢, 你多多指教, 你读的是7个字节吗,取得的值是头俩个的字节数值,企鹅51652 ...

你要加速哦。。赶紧调啊。。我就指望你了啊。。呵呵。。

使用特权

评论回复
37
电子过客| | 2014-9-3 14:53 | 只看该作者
asdy00000 发表于 2014-9-2 17:41
你要加速哦。。赶紧调啊。。我就指望你了啊。。呵呵。。

你的QQ多少啊

使用特权

评论回复
38
asdy00000| | 2014-9-3 15:05 | 只看该作者
电子过客 发表于 2014-9-3 14:53
你的QQ多少啊

71170626

使用特权

评论回复
39
humgre| | 2014-9-17 23:40 | 只看该作者
本帖最后由 humgre 于 2014-9-19 10:02 编辑

求大神呀!

使用特权

评论回复
40
xingfeng515| | 2015-1-21 16:01 | 只看该作者
我也一直没有应答,求大神啊,QQ;1794537980

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则