我使用的是 PIC16F1789 和 MPU-9250。我的 I2C 阅读功能中的代码如下所示:
unsigned char i2cSensor_Read(unsigned char regAddr){
unsigned char val;
// Start
i2cWait();
SEN = 1;
// Address + Write Bit
i2cWait();
SSP1BUF = ((slvAdd<<1) | (0b0<<0)); // address slave + write (0)
i2cWait();
//Register address
SSP1BUF = regAddr; // address register
i2cWait();
//Start
RSEN = 1;
i2cWait();
// Address + Read Bit
SSP1BUF = ((slvAdd<<1) | (0b1<<0)); //Address + read (1)
i2cWait();
// Read data
RCEN = 1;
i2cWait();
val = SSP1BUF;
ACKDT = 1; // set acknowlege Bit (1 = Not Acknowlege, 0 = Acknowlege)
ACKEN = 1; // send acknowlege Bit
// Stop
i2cWait();
PEN = 1;
return val;
}
调用最后一个 i2cWait() 时,程序挂起。等待函数如下所示:
void i2cWait(){
while((SSP1STAT & 0x04) || (SSP1CON2 & 0x1F));
}
我使用过 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() 中。
为什么会这样?从站是否必须清除该位?从设备坏了吗?