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】
谢谢!
技术回复: 这是纯软件处理,跟硬件没什么关系,收到的数据进行判断保存需要的内容就可以了。 我有量个问题需要再确认下:
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);
}
} 这个I2C地址复用,会不会中间有和读取另一从设备有很多数据通信,影响到后面接收0x8a,0xad,0x00信号了?
页:
[1]