我面临一个奇怪的问题。我一直在我的 PIC16F1459 上使用 bit bangin I2C 功能,但现在我想使用 MSSP(SPI,I2C 主从外设)。所以我开始根据数据表编写函数,开始、停止等。我遇到的问题是我的 PIC 不会确认我发送到 I2C EEPROM 的数据。数据表中明确指出,可以在 SSPCON2.ACKSTAT 中找到 ACK 状态。所以我的猜测是轮询这个位,直到从机响应我的数据,但程序挂在 while 循环中。
void vReadACK (void)
{
while (SSPCON2.ACKSTAT != 0);
}
这是我的写函数,我的 I2CCheck 函数和 I2C 主初始化函数
void vI2CEcrireOctet (UC ucData, UC ucRW)
{
vI2CCheck();
switch (ucRW)
{
case READ:
SSPBUF = ucData + 1;
break;
case WRITE:
SSPBUF = ucData + 0;
break;
}
vReadACK();
}
void vI2CCheck (void)
{
while (SSPCON2.ACKEN); //ACKEN not cleared, wait
while (SSPCON2.RCEN); //RCEN not cleared, wait
while (SSPCON2.PEN); //STOP not cleared, wait
while (SSPCON2.SEN); //Start not cleared, wait
while (SSPCON2.RSEN); //Rep start not cleared, wait
while (SSP1STAT.R_NOT_W); //TX not done wait
}
void vInitI2CMaster (void)
{
TRISB4_bit = 1; //SDA IN
TRISB6_bit = 1; //SCL IN
SSP1STAT.SMP = 1; //No slew rate
SSP1STAT.CKE = 0; //Disable SMBus inputs
SSPADD = 0x27; //100 KHz
SSPCON1 = 0b00101000; //I2C Master mode
SSPCON3 = 0b00000000; //Rien de slave
}
如您所知,24LC32A WriteProtect 连接到 VSS,A2-A1-A0 连接到 GND,所以地址为 0xA0。4k7 上拉在 I2C 线上。PIC16F1459 在 16MHz INTOSC。
我完全被困住了。我浏览了 MSSP 数据表 5 到 6 次,没有发现任何问题。你们能帮忙吗?
这是我的逻辑分析仪预览(删除 vReadAck() 中的 while )