У меня два устройства i2 c. Оба хорошо работают, но когда я читаю с одного, а затем пишу с другим, второй не является подтверждением - PullRequest
0 голосов
/ 23 марта 2020

У меня есть два устройства MPU6050 и EEPROM 24C256. Я могу писать и читать как в одиночку. Но когда я пытаюсь прочитать из MPU6050 и записать данные в EEPROM в одном сеансе, EEPROM не отвечает. Я использую библиотеки mbed OS. И мой вопрос ... Это проблема с библиотекой, кодом или аппаратным обеспечением?

MPU6050: последовательность чтения: введите описание изображения здесь

Секвенция записи EEPROM: введите описание изображения здесь

// CODE

const char imuAddress = 0x68<<1;
const char imuDataAddress = 0x3B;
const char eepAddress = 0xA0;
const char data[3] = {1.1, 2.2, 3.3};
char acc[3];

//reading acceleration data from IMU
    while(true){
        i2c.start();
        if(i2c.write(imuAddress) != 1){
            i2c.stop();
            continue;
        }
        if(i2c.write(imuDataAddress) != 1){
            i2c.stop();
            continue;
        }
        i2c.start();
        if(i2c.write(imuAddress | 0x01) != 1){
            i2c.stop();
            continue;
        }
        for (int i = 0; i < 2; i++){
            i2c.read(1);   //read and respond ACK to continue
        }
        i2c.read(0);   //read and respond NACK to stop reading
        i2c.stop();
        break;
    }
//write data to EEPROM
    while(true){
            i2c.start();
            if(i2c.write(eepAddress) != 1){   //here is the problem (EEPROM does not respond)
                i2c.stop();
                continue;
            }
            if(i2c.write(0x00) != 1){
                i2c.stop();
                continue;
            }
            if(i2c.write(0x00) != 1){
                i2c.stop();
                continue;
            }
            bool ack = true;
            for(int i = 0; i < 3; i++){
                if(i2c.write(data[i]) != 1){
                    i2c.stop();
                    ack = false;
                    break;
                }
            }
            if (ack == true){
                i2c.stop();
                break;    
            }
        }

1 Ответ

0 голосов
/ 23 марта 2020

У меня есть пара начальных мыслей, но есть ли у вас доступ к осциллографу? Странно, что каждый работает индивидуально. Это заставляет меня думать, что это может быть проблемой между переходом. (Возможно, попробовать задержку между ними? Также, возможно, удалите остановки в начальном чтении, поскольку они не нужны)

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

...