我正在尝试与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 acknowledge Bit (1 = Not Acknowledge, 0 = Acknowledge) ACKEN = 1; // send acknowledge 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()中。为什么不通过硬件清除位? 最佳答案 看起来您正在使用0b1 尽管将写入设置为“ 0”可能是违反直觉的,但是如果您想到ist由从属地址0b0000000和“写入”位0发起的“常规调用”,这是有道理的。这还意味着将代码中的“读取”位更改为1。在当前的实现中,混合读写位会导致在设置NACK之后卡在等待中的问题。 10-05 21:39