【问题标题】:How to read a sequence of bytes through I2C?如何通过 I2C 读取字节序列?
【发布时间】:2012-01-19 23:05:42
【问题描述】:

我想从我的加速度计中读取一个字节序列。我无法让它工作。 当我逐字节读取时,一切正常,但是当我尝试读取序列时,我无法获得真实值。

  void ADXL_ReadSeq(uint8_t StartAddr,signed char *data)
    {
        // StartAddr |= (1<<7); //
        while(I2C_GetFlagStatus(I2CG, I2C_FLAG_BUSY));  // While the bus is busy
        I2C_GenerateSTART(I2CG, ENABLE);    // Send START condition
        while(!I2C_CheckEvent(I2CG, I2C_EVENT_MASTER_MODE_SELECT)); // Test on EV5 and clear it
        I2C_Send7bitAddress(I2CG, DEV_ADDR<< 1, I2C_Direction_Transmitter); // Send address for write (SAD+W)
        while(!I2C_CheckEvent(I2CG, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));   // Test on EV6 and clear it
        I2C_SendData(I2CG,ADXL_R| ADXL_MB|StartAddr );  // Send the internal address to read from: MSB of the address first
        while(!I2C_CheckEvent(I2CG, I2C_EVENT_MASTER_BYTE_TRANSMITTED));    // Test on EV8 and clear it
        I2C_GenerateSTART(I2CG, ENABLE);    // Send STRAT condition a second time
        while(!I2C_CheckEvent(I2CG, I2C_EVENT_MASTER_MODE_SELECT)); // Test on EV5 and clear it
        I2C_Send7bitAddress(I2CG, DEV_ADDR<< 1, I2C_Direction_Receiver);    // Send address for read
        while(!I2C_CheckEvent(I2CG,I2C_EVENT_MASTER_BYTE_RECEIVED));    // Test on EV6 and clear it
        int num=6;
        while (num)
            {
                if(num==1)
                {
                    I2C_AcknowledgeConfig(I2C1, DISABLE);   /* ЧоєуТ»О»єуТЄ№Ш±ХУ¦ґрµД */
                    I2C_GenerateSTOP(I2C1, ENABLE);         /* ·ўЛННЈЦ№О» */
                }

                while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));  /* EV7 */
                *data = I2C_ReceiveData(I2C1);
                data++;
                /* Decrement the read bytes counter */
                num--;
            }
            /* ФЩґОФКРнУ¦ґрДЈКЅ */
            I2C_AcknowledgeConfig(I2C1, ENABLE);

    }

我做错了什么? 我将此函数从使用 SPI http://code.google.com/p/flyless/source/browse/trunk/FLYLess/src/hal/adxl345.c的其他函数转换@

【问题讨论】:

  • 发布您的正确工作代码,其中数据正在逐字节读取。你调试了吗? (至少有一些通过 uart 的消息)它卡在哪里了?
  • 代码运行正常,但加速度计数据不正确。稍后我会发布一些代码。

标签: c arm sequence i2c stm32


【解决方案1】:

检查您的加速度计的文档。 I2C 与 SPI 有很大不同,您的设备可能不支持 I2C 读取的序列。

【讨论】:

  • 我检查了文档,它说按顺序读取数据而不是逐字节读取数据更好。
  • 能否请您提供加速度计的零件名称?
  • 好的,没问题,随便问。 “ADXL345”
  • 好吧,也许我发现了问题。根据数据表,写入寄存器地址后必须生成RESTART 条件,而不是简单的START。或者生成 STOP 然后 START。
  • 抱歉回复延迟。你是对的!谢谢!我的 ADXL345 现在可以正常工作了。
猜你喜欢
  • 1970-01-01
  • 2020-11-04
  • 2022-08-13
  • 1970-01-01
  • 2014-09-17
  • 1970-01-01
  • 2020-09-13
  • 2012-03-09
  • 2012-03-03
相关资源
最近更新 更多