Как прочитать последовательность байтов через I2C? - PullRequest
1 голос
/ 14 декабря 2011

Я хочу прочитать последовательность байтов с моего акселерометра.Я не могу заставить это работать.Когда я читаю побайтно, все в порядке, но когда я пытаюсь прочитать последовательность, я не могу получить истинные значения.

  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

1 Ответ

2 голосов
/ 05 января 2012

Проверьте документацию для вашего акселерометра. I2C сильно отличается от SPI, и ваше устройство может не поддерживать последовательность, читаемую I2C.

...