wanglituan 发表于 2024-6-12 16:53:36

STC8H8K64U做为I2C从设备应用咨询

1、参考官方的程序如下:


      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;
                I2CTXD = buffer;
            }
            else
            {
                buffer = I2CRXD;      //处理RECV事件(RECV DATA)
            }
      }

2、主机发送过来的数据如下,0x8A是地址

0X8A0XC00X01
0X8A0XC20X01
0X8A0XAC 0X01

0X8A 0XAD0X01
0X8A 0XAB0X00
0X8A 0XAA0X01

如果要把上面的数据除了0x8A外都保存到数组中,如何处理?数组接收后为【0xc0,0x01,0xc2,0c01,0xac,0x01,0xad,0x01,0xab,0x00,0xaa,0x01】
谢谢!

8H8K64U 发表于 2024-6-14 08:49:23

技术回复: 这是纯软件处理,跟硬件没什么关系,收到的数据进行判断保存需要的内容就可以了。

wanglituan 发表于 2024-6-14 17:13:30

我有量个问题需要再确认下:
1.如果选11.0592M,地址要匹配就不行,选24M才可以;
2.选24M程序可以读取主机发过来的数了,但是中间等待时间比较长后,再发送0x8a,0xad,0x00,这里就接受不到了,程序如下,不确定哪里有问题?
    while (1)
    {
      if (I2CSLST & 0x40)
      {
            I2CSLST &= ~0x40;                   //处理START事件
      }
      else if (I2CSLST & 0x20)
      {
            I2CSLST &= ~0x20;                   //处理RECV事件
            if (isda)
            {
                isda = 0;                     //处理RECV事件(RECV DEVICE ADDR)
            }
            else if (isma)
            {
                isma = 0;                     //处理RECV事件(RECV MEMORY ADDR)
                                buffer=I2CRXD;
                                addr++;
                //data1=I2CRXD;
                //addr = I2CRXD;
                //I2CTXD = buffer;
            }
            else
            {
                                buffer = I2CRXD;      //处理RECV事件(RECV DATA)
                //buffer = I2CRXD;      //处理RECV事件(RECV DATA)
                addr++;
            }
      }
      else if (I2CSLST & 0x10)
      {
            I2CSLST &= ~0x10;                   //处理SEND事件
            if (I2CSLST & 0x02)
            {
                I2CTXD = 0xff;                  //接收到NAK则停止读取数据
            }
            else
            {
                I2CTXD = buffer;      //接收到ACK则继续读取数据
            }
      }
      
      else if (I2CSLST & 0x08)
      {
            I2CSLST &= ~0x08;                   //处理STOP事件
            isda = 1;
            isma = 1;
      }

//---------------开机--------------
       if((power_flash==0) && (buffer==0xaa) && (buffer==0x01))
      {
                  delay_ms(200);
                        ICN6211_Init();
                        LED_EN=1;//背光打开
                        power_flash=1;
                        addr = 0;
                }
//---------------关机---------------
      if((power_flash==1) && (buffer==0xAD) && (buffer==0x00))
      {
                        LED_EN=0;//背光关闭
                  ICN6211_RST=0;
                  power_flash=0;
                  addr = 0;
                  isda = 1;                                 //用户变量初始化
                    isma = 1;
                        for(i = 0; i <24; i++)
                        {
                          buffer = 0;
                        }
                        while(1);
                }
    }

wanglituan 发表于 2024-6-14 17:33:41

这个I2C地址复用,会不会中间有和读取另一从设备有很多数据通信,影响到后面接收0x8a,0xad,0x00信号了?
页: [1]
查看完整版本: STC8H8K64U做为I2C从设备应用咨询