[I2C读取功能在发送确认位后卡住

问题描述 投票:0回答:1

我正在尝试与我的PIC16F1789中的MPU-9250(加速度计和许多其他东西)进行通信。我的函数如下所示:

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;
}

我已经处理了9250数据表第35页上的“单字节读取序列”:https://cdn.sparkfun.com/assets/learn_tutorials/5/5/0/MPU9250REV1.0.pdf

和PIC数据表:http://ww1.microchip.com/downloads/en/DeviceDoc/40001675C.pdf

调试时,在我发送NACK位后,程序卡在了i2cWait()中。由于未清除SSPCON2寄存器(PIC数据表的第341页)的ACKEN位(第4位),所以它被卡住,因此程序被卡在while()中。

为什么不通过硬件清除位?

c pic i2c
1个回答
0
投票

看来您正在使用0b1 << 0来与从站地址一起“写入”。但是,它应该为0。

© www.soinside.com 2019 - 2024. All rights reserved.