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);
}
解决了,是我H618 I2C总线的配置问题
页:
[1]