maigejun 发表于 2025-12-2 14:53:46

STC8G1K08-PIN作为从机时无法正常响应主机I2C | 解决了

目前在用全志的H618作为上位机来控制STC8G,

我在H618上使用i2cdetect向stc8g所在的总线上发送检测信号,但是每次一检测到STC8G所在的地址时,就会卡死,直到请求超时跳过它。
具体表现为h618发送了开始信号和地址后,stc8g接收到信号,拉高了SDA,拉低了SCL,并且一直保持着不变。

我反反复复的检查了多次代码,还是无法确定是哪出现了问题,求大佬们指点


STC8G代码:

#include <STC8G.H>

#define STAIF (I2CSLST & 0x40)
#define CLR_STAIF (I2CSLST &= ~0x40)

#define RXIF(I2CSLST & 0x20)
#define CLR_RXIF(I2CSLST &= ~0x20)         

#define TXIF(I2CSLST & 0x10)
#define CLR_TXIF(I2CSLST &= ~0x10)

#define STOIF (I2CSLST & 0x08)
#define CLR_STOIF (I2CSLST &= ~0x08)

#define SLACKI (I2CSLST & 0x02)
#define SLACKO (I2CSLST & 0x01)

sbit I2C_SCL = P3^2;
sbit I2C_SDA = P3^3;

// --- 全局变量 ---
bit isda;                                       //设备地址标志
bit isma;                                       //存储地址标志
unsigned char addr;
unsigned char pdata buffer;   


void I2C_Isr() interrupt 24
{
      _push_(P_SW2);
      P_SW2 |= 0x80;
      if(STAIF)
      {
                CLR_STAIF;                                        // 处理START事件
                isda = 1;                                        // 若为重复起始信号时,必须做此设置
      }
      else if(RXIF)
      {
                CLR_RXIF;                                        // 处理RECV事件
                if(isda)
                {
                        isda = 0;                              // 处理RECV事件(收到设备地址)
                }
                else if(isma)
                {
                        isma = 0;                              // 处理RECV事件(收到内存地址)
                }
                else
                {
                        buffer = I2CRXD;// 处理RECV事件(收到数据)
                }
      }
      else if(TXIF)
      {
                CLR_TXIF;                                        // 处理SEND事件
                if(SLACKI)
                {
                        I2CTXD = 0xFF;                        // 收到NAK则停止读取数据
                }
                else
                {
                        I2CTXD = buffer[++addr];// 接收到ACK则继续读取数据
                }
      }
      else if(STOIF)
      {
                CLR_STOIF;                                        // 处理STOP事件
                isda = 1;
                isma = 1;
      }
      _pop_(P_SW2);
}

void I2C_Init()
{
      P_SW2 |= 0x80;

      I2CCFG   = 0x81;         //使能 I2C 从机模式
      I2CSLADR = 0x5a;//这里接收所有的设备地址
      // 设置P32和P33为开漏模式
      P3M1 |= 0x0C;
      P3M0 |= 0x0C;
      I2CSLST = 0x00; //IIC从机状态寄存器清零
      I2CSLCR = 0x78; //使能从机模式中断

      isda = 1;               //用户变量初始化
      isma = 1;                //寄存器地址
      addr = 0;                //设备地址
      I2CTXD = buffer;

      EA = 1;               // 控制总中断
}

void IO_init(void)
{
    P1M1   = 0;      P1M0   = 0;
      P3M1   = 0;      P3M0   = 0;
    P5M1   = 0;      P5M0   = 0;
}

void main()
{
      IO_init();
      I2C_Init();
      while(1);
}

maigejun 发表于 2025-12-2 15:37:03

解决了,是我H618 I2C总线的配置问题
页: [1]
查看完整版本: STC8G1K08-PIN作为从机时无法正常响应主机I2C | 解决了