我正在尝试与我的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()中。
为什么不通过硬件清除位?
看来您正在使用0b1 << 0来与从站地址一起“写入”。但是,它应该为0。