gpt4 book ai didi

c - PIC16F1459 I2C 主控器 24LC32 的确认问题

转载 作者:行者123 更新时间:2023-11-30 17:29:59 26 4
gpt4 key购买 nike

我遇到了一个奇怪的问题。我一直在 PIC16F1459 上使用 bit bangin I2C 功能,但现在我想使用 MSSP(SPI,I2C 主从外设)。所以我开始根据数据表编写函数,开始、停止等。我遇到的问题是我的 PIC 不会确认我发送到 I2C EEPROM 的数据。数据表中明确指出,ACK 状态可以在 SSPCON2.ACKSTAT 中找到。所以我的猜测是轮询该位,直到从机响应我的数据,但程序卡在 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 )

最佳答案

看来我已经找到了问题的答案。我所做的正是这样做的方法。问题似乎是从设备响应所需的总线空闲时间延迟。在 16Mhz 时,我的 I2C 对于 EEPROM 内存来说可能太快了。因此,我在停止操作之后添加了一个小的延迟函数,因此写入序列被延迟并且 BAM 起作用。

公交车空闲时间:公交车计时在新的之前必须是免费的传输可以开始。

关于c - PIC16F1459 I2C 主控器 24LC32 的确认问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25372683/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com