求助 STC8H8K64U IIC 从机模式通讯问题
1. STC8H8K64U 作为从机与其它单片机通讯时,某一字节的最高位发送1时,数据存在延迟!!具体表现为:当从机发送{2, 2, 254, 2, 254, 254}时,最高位每次由0变为1时,都存在延迟,如图所示,这是为什么呢?
目前速率是160kHz,当速率为200kHz时,延迟导致误认为STOP,从而导致IIC传输故障 把你硬件原理图 贴出来,另外 I2C 要加上拉电阻,I/O模式设置为开漏 可能是上拉不足导致的上升沿速度慢,上拉电阻(单片机内部的4K上拉或外部上拉电阻)是如何设置的? 神农鼎 发表于 2025-11-14 19:04
把你硬件原理图 贴出来,另外 I2C 要加上拉电阻,I/O模式设置为开漏
开漏,外部上拉2K 电阻 DebugLab 发表于 2025-11-15 15:17
可能是上拉不足导致的上升沿速度慢,上拉电阻(单片机内部的4K上拉或外部上拉电阻)是如何设置的? ...
开漏,外部上拉2K 电阻 jkeeawoq 发表于 2025-11-17 10:46
开漏,外部上拉2K 电阻
应该是主机释放ACK后,STC单片机的发送数据还没准备好导致的
这是IIC 中断代码:
void I2C_Isr() interrupt 24
{
if (I2CSLST & 0x40)
{
I2CSLST &= ~0x40; //处理START事件
isda = 1; //若为重复起始信号时必须作此设置
write_count = 0;
}
else if (I2CSLST & 0x20)
{
I2CSLST &= ~0x20; //处理RECV事件
if (isda)
{
isda = 0; //处理RECV事件(RECV DEVICE ADDR)
}
else if (isma)
{
isma = 0; //处理RECV事件(RECV MEMORY ADDR)
addr = I2CRXD;
current_addr = addr;
I2CTXD = iic_buffer;
}
else //处理RECV事件(RECV DATA)
{
iic_buffer = I2CRXD; //处理RECV事件(RECV DATA)
}
}
else if (I2CSLST & 0x10)
{
I2CSLST &= ~0x10; //处理SEND事件
if (I2CSLST & 0x02)
{
I2CTXD = 0xff; //接收到NAK则停止读取数据
}
else
{
I2CTXD = iic_buffer[++addr]; //接收到ACK则继续读取数据
}
}
else if (I2CSLST & 0x08)
{
I2CSLST &= ~0x08; //处理STOP事件
if (iic_stop_callback != NULL) {
iic_stop_callback(current_addr, write_count);
}
isma = 1;
isda = 1;
}
} https://www.stcaimcu.com/data/download/Datasheet/STC8H.pdf
先用 2个 STC8H8K64U 实现下:
请问解决了吗
页:
[1]