找回密码
 立即注册
查看: 218|回复: 3

STC8H8K64U做为I2C从设备应用咨询

[复制链接]

2

主题

3

回帖

18

积分

新手上路

积分
18
发表于 2024-6-12 16:53:36 | 显示全部楼层 |阅读模式
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[addr];
            }
            else
            {
                buffer[addr++] = I2CRXD;        //处理RECV事件(RECV DATA)
            }
        }

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

0X8A  0XC0  0X01
0X8A  0XC2  0X01
0X8A  0XAC 0X01

0X8A 0XAD  0X01
0X8A 0XAB  0X00
0X8A 0XAA  0X01

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-04-27 14:40:11
已绑定手机

16

主题

468

回帖

2165

积分

版主

积分
2165
QQ
发表于 2024-6-14 08:49:23 | 显示全部楼层
技术回复: 这是纯软件处理,跟硬件没什么关系,收到的数据进行判断保存需要的内容就可以了。
www.STCAI.com
回复 支持 反对

使用道具 举报 送花

2

主题

3

回帖

18

积分

新手上路

积分
18
发表于 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[addr]=I2CRXD;
                                addr++;
                //data1=I2CRXD;
                //addr = I2CRXD;
                //I2CTXD = buffer[addr];
            }
            else
            {
                                buffer[addr] = I2CRXD;        //处理RECV事件(RECV DATA)
                //buffer[addr++] = I2CRXD;        //处理RECV事件(RECV DATA)
                addr++;
            }
        }
        else if (I2CSLST & 0x10)
        {
            I2CSLST &= ~0x10;                   //处理SEND事件
            if (I2CSLST & 0x02)
            {
                I2CTXD = 0xff;                  //接收到NAK则停止读取数据
            }
            else
            {
                I2CTXD = buffer[0];        //接收到ACK则继续读取数据
            }
        }
        
        else if (I2CSLST & 0x08)
        {
            I2CSLST &= ~0x08;                   //处理STOP事件
            isda = 1;
            isma = 1;
        }

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

使用道具 举报 送花

2

主题

3

回帖

18

积分

新手上路

积分
18
发表于 2024-6-14 17:33:41 | 显示全部楼层
这个I2C地址复用,会不会中间有和读取另一从设备有很多数据通信,影响到后面接收0x8a,0xad,0x00信号了?
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 08:15 , Processed in 0.125604 second(s), 67 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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