找回密码
 立即注册
查看: 250|回复: 9

求助 STC8H8K64U IIC 从机模式通讯问题

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2026-02-27 13:21:27
已绑定手机

1

主题

5

回帖

27

积分

新手上路

积分
27
发表于 2025-11-14 16:15:10 | 显示全部楼层 |阅读模式
1. STC8H8K64U 作为从机与其它单片机通讯时,某一字节的最高位发送1时,数据存在延迟!!
具体表现为:当从机发送{2, 2, 254, 2, 254, 254}时,最高位每次由0变为1时,都存在延迟,如图所示,这是为什么呢?

DS1Z_QuickPrint1.png
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2026-02-27 13:21:27
已绑定手机

1

主题

5

回帖

27

积分

新手上路

积分
27
发表于 2025-11-14 16:22:10 | 显示全部楼层
目前速率是160kHz,当速率为200kHz时,延迟导致误认为STOP,从而导致IIC传输故障
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:368
  • 最近打卡:2026-04-02 08:50:05

844

主题

1万

回帖

2万

积分

管理员

积分
22799
发表于 2025-11-14 19:04:51 | 显示全部楼层
把你硬件原理图 贴出来,另外 I2C 要加上拉电阻,I/O模式设置为开漏
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:725
  • 最近打卡:2026-03-30 12:09:34
已绑定手机

97

主题

7246

回帖

1万

积分

超级版主

积分
13798
发表于 2025-11-15 15:17:39 | 显示全部楼层
可能是上拉不足导致的上升沿速度慢,上拉电阻(单片机内部的4K上拉或外部上拉电阻)是如何设置的?
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2026-02-27 13:21:27
已绑定手机

1

主题

5

回帖

27

积分

新手上路

积分
27
发表于 2025-11-17 10:45:49 | 显示全部楼层
神*** 发表于 2025-11-14 19:04
把你硬件原理图 贴出来,另外 I2C 要加上拉电阻,I/O模式设置为开漏

开漏,外部上拉2K 电阻
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2026-02-27 13:21:27
已绑定手机

1

主题

5

回帖

27

积分

新手上路

积分
27
发表于 2025-11-17 10:46:01 | 显示全部楼层
Debu*** 发表于 2025-11-15 15:17
可能是上拉不足导致的上升沿速度慢,上拉电阻(单片机内部的4K上拉或外部上拉电阻)是如何设置的? ...

开漏,外部上拉2K 电阻
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2026-02-27 13:21:27
已绑定手机

1

主题

5

回帖

27

积分

新手上路

积分
27
发表于 2025-11-17 10:48:38 | 显示全部楼层
jkee*** 发表于 2025-11-17 10:46
开漏,外部上拉2K 电阻

应该是主机释放ACK后,STC单片机的发送数据还没准备好导致的
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2026-02-27 13:21:27
已绑定手机

1

主题

5

回帖

27

积分

新手上路

积分
27
发表于 2025-11-17 10:50:49 | 显示全部楼层

这是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[addr];
        }
        else //处理RECV事件(RECV DATA)
        {
            iic_buffer[addr++] = 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;
    }
}
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:368
  • 最近打卡:2026-04-02 08:50:05

844

主题

1万

回帖

2万

积分

管理员

积分
22799
发表于 2025-11-21 10:27:53 | 显示全部楼层
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:45
  • 最近打卡:2026-02-04 14:49:07

0

主题

6

回帖

292

积分

中级会员

积分
292
发表于 2025-12-5 15:16:45 | 显示全部楼层
请问解决了吗
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-4-3 02:15 , Processed in 0.119121 second(s), 88 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表