Функция чтения I2C застревает после отправки бита подтверждения - PullRequest
0 голосов
/ 13 октября 2019

Я пытаюсь связаться с MPU-9250 (акселерометр и многие другие вещи) из моего PIC16F1789. Мои функции выглядят следующим образом:

void i2cWait(){
  while((SSP1STAT & 0x04) || (SSP1CON2 & 0x1F));
}

unsigned char i2cReadCycle(unsigned char regAddr){
    unsigned char val;
    // Start
    i2cWait();
    SEN = 1;

    // Address + Write Bit
    i2cWait();
    SSPBUF = (slvAdd<<1 | (0b1<<0)); // address slave + write
    i2cWait();

    //Register address
    SSP1BUF = regAddr; // address register + read
    i2cWait();

    //Start
    SEN = 1;
    i2cWait();

    // Address + Read Bit
    SSP1BUF = ((slvAdd<<1) | (0b0<<0)); //Address + read (0)
    i2cWait();

    // Daten Auslesen
    RCEN = 1;
    i2cWait();
    val = SSP1BUF;
    i2cWait();
    ACKDT = 1; // set acknowlege Bit (1 = Not Acknowlege, 0 = Acknowlege)
    ACKEN = 1; // send acknowlege Bit

    // Stop
    i2cWait();
    PEN = 1;

    return val;
}

Я работал с «Последовательностью однобайтового чтения» на странице 35 таблицы 9250: https://cdn.sparkfun.com/assets/learn_tutorials/5/5/0/MPU9250REV1.0.pdf

И таблица данных PIC: http://ww1.microchip.com/downloads/en/DeviceDoc/40001675C.pdf

При отладке программа застревает в i2cWait () после отправки бита NACK. Он застревает, потому что бит ACKEN (бит 4) регистра SSPCON2 (Страница 341 таблицы данных PIC) не очищается, поэтому программа застревает в while ().

Почему бит не получаеточищается аппаратно?

1 Ответ

1 голос
/ 14 октября 2019

Похоже, вы используете 0b1 << 0 для «записи» вместе с адресом подчиненного устройства. Однако, согласно таблице данных MPU9250REV1.0, это должно быть 0. Проверьте раздел 7.4 на стр. 35. </p>

Хотя это может быть нелогичным, если установить «0» для записи, имеет смысл, если вы думаете,«общего вызова», инициируемого с ведомого адреса 0b0000000 и бита «записи» 0.

Это также означает изменение бита «чтения» в вашем коде на 1.

В текущей реализации смешивание битов чтения и записи приводит к зависанию проблемы, ожидающей после установки NACK.

...