0

我面临一个奇怪的问题。我一直在我的 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 )

4

2 回答 2

0

尽管您“完全知道”知道“PIC 不会确认我发送到 I2C EEPROM 的数据”,因为它不应该这样做,但您似乎仍然误解了 I2C 确认应该如何工作。它们被称为确认,因为它们可以被肯定(ACK)和否定(NAK)确认。如果您查看您发布的分析仪屏幕截图,您会发现它非常清楚地将每个发送的字节标记为已被发送器 NAK'ed。

要正确检查 I2C ACK,您应该轮询该ACKTIM位的后沿,然后检查该ACKSTAT位以确定从机是发送 ACK 位还是 NAK 位。像这样的东西:

int
vReadACK() {
    while(!SSPCON3.ACKTIM);
    while(SSPCON3.ACKTIM);
    return SSPCON2.ACKSTAT;
}

至于为什么您的从属设备显然对每个字节都进行了 NAK,从您发布的代码中并不清楚,但是您的代码中有一些明显的遗漏。您需要生成开始和停止条件,但您没有显示任何代码来执行此操作。

于 2014-08-19T00:48:05.023 回答
0

好吧,看来我已经找到了我的问题的答案。我正在做的是这样做的确切方式。问题似乎是从站响应所需的总线空闲时间延迟。在 16Mhz 时,我的 I2C 可能对于 EEPROM 存储器来说太快了。所以我在停止操作之后添加了一个小的延迟功能,所以写入序列被延迟并且 BAM 工作。

总线空闲时间:在开始新的传输之前总线必须空闲的时间。

于 2014-08-19T00:38:43.117 回答