📄 i2cint.c
字号:
if (I2C0_suba_num == 2)
{ I20DAT = ((I2C0_suba >> 8) & 0xff);
I20CONCLR = 0x28; /* 清零SI,STA */
I2C0_suba_num--;
break;
}
if(I2C0_suba_num == 1)
{ I20DAT = (I2C0_suba & 0xff);
I20CONCLR = 0x28; /* 清零SI,STA */
I2C0_suba_num--;
break;
}
if (I2C0_suba_num == 0)
{ I20CONSET = 0x20;
I20CONCLR = 0x08;
I2C0_suba_en = 0; /* 子地址己处理 */
break;
}
}
if (I2C0_suba_en == 2)/* 指定子地址写,子地址尚未指定,则发送子地址 */
{
if (I2C0_suba_num > 0)
{ if (I2C0_suba_num == 2)
{ I20DAT = ((I2C0_suba >> 8) & 0xff);
I20CONCLR = 0x28;
I2C0_suba_num--;
break;
}
if (I2C0_suba_num == 1)
{ I20DAT = (I2C0_suba & 0xff);
I20CONCLR = 0x28;
I2C0_suba_num--;
I2C0_suba_en = 0;
break;
}
}
}
break;
case 0x40: /* 已发送SLA+R,已接收ACK */
if (I2C0_num <= 1) /* 如果是最后一个字节 */
{ I20CONCLR = 1 << 2; /* 下次发送非应答信号 */
}
else
{ I20CONSET = 1 << 2; /* 下次发送应答信号 */
}
I20CONCLR = 0x28; /* 清零SI,STA */
break;
case 0x20: /* 已发送SLA+W,已接收非应答 */
case 0x30: /* 已发送I2DAT中的数据,已接收非应答 */
case 0x38: /* 在SLA+R/W或数据字节中丢失仲裁 */
case 0x48: /* 已发送SLA+R,已接收非应答 */
I20CONCLR = 0x28;
break;
case 0x50: /* 已接收数据字节,已返回ACK */
*I2C0_buf++ = I20DAT;
I2C0_num--;
if (I2C0_num == 1)/* 接收最后一个字节 */
{ I20CONCLR = 0x2C; /* STA,SI,AA = 0 */
}
else
{ I20CONSET = 0x04; /* AA=1 */
I20CONCLR = 0x28;
}
break;
case 0x58: /* 已接收数据字节,已返回非应答 */
*I2C0_buf++ = I20DAT; /* 读取最后一字节数据 */
I20CONSET = 0x10; /* 结束总线 */
I20CONCLR = 0x28;
isr_sem_send (wait_end0_sem);
break;
default:
break;
}
}
#endif
#if USE_I2C_CTRL1 == 1
/* 读取I2C状态寄存器I2DAT */
/* 按照全局变量的设置进行操作及设置软件标志 */
/* 清除中断逻辑,中断返回 */
if(I21CONSET & 1 << 3)
{
switch (I21STAT & 0xF8)
{ /* 根据状态码进行相应的处理 */
case 0x08: /* 已发送起始条件 */ /* 主发送和主接收都有 */
/* 装入SLA+W或者SLA+R */
if(I2C1_suba_en == 1)/* SLA+R */ /* 指定子地址读 */
{ I21DAT = I2C1_sla & 0xFE; /* 先写入地址 */
}
else /* SLA+W */
{ I21DAT = I2C1_sla; /* 否则直接发送从机地址 */
}
/* 清零SI位 */
I21CONCLR = (1 << 3)| /* SI */
(1 << 5); /* STA */
break;
case 0x10: /*已发送重复起始条件 */ /* 主发送和主接收都有 */
/* 装入SLA+W或者SLA+R */
I21DAT = I2C1_sla; /* 重起总线后,重发从地址 */
I21CONCLR = 0x28; /* 清零SI,STA */
break;
case 0x18:
case 0x28: /* 已发送I2DAT中的数据,已接收ACK */
if (I2C1_suba_en == 0)
{
if (I2C1_num > 0)
{ I21DAT = *I2C1_buf++;
I21CONCLR = 0x28; /* 清零SI,STA */
I2C1_num--;
}
else /* 没有数据发送了 */
{ /* 停止总线 */
I21CONSET = (1 << 4); /* STO */
I21CONCLR = 0x28; /* 清零SI,STA */
isr_sem_send (wait_end1_sem); /* 总线已经停止 */
}
}
if(I2C1_suba_en == 1) /* 若是指定地址读,则重新启动总线 */
{
if (I2C1_suba_num == 2)
{ I21DAT = ((I2C1_suba >> 8) & 0xff);
I21CONCLR = 0x28; /* 清零SI,STA */
I2C1_suba_num--;
break;
}
if(I2C1_suba_num == 1)
{ I21DAT = (I2C1_suba & 0xff);
I21CONCLR = 0x28; /* 清零SI,STA */
I2C1_suba_num--;
break;
}
if (I2C1_suba_num == 0)
{ I21CONSET = 0x20;
I21CONCLR = 0x08;
I2C1_suba_en = 0; /* 子地址己处理 */
break;
}
}
if (I2C1_suba_en == 2)/* 指定子地址写,子地址尚未指定,则发送子地址 */
{
if (I2C1_suba_num > 0)
{ if (I2C1_suba_num == 2)
{ I21DAT = ((I2C1_suba >> 8) & 0xff);
I21CONCLR = 0x28;
I2C1_suba_num--;
break;
}
if (I2C1_suba_num == 1)
{ I21DAT = (I2C1_suba & 0xff);
I21CONCLR = 0x28;
I2C1_suba_num--;
I2C1_suba_en = 0;
break;
}
}
}
break;
case 0x40: /* 已发送SLA+R,已接收ACK */
if (I2C1_num <= 1) /* 如果是最后一个字节 */
{ I21CONCLR = 1 << 2; /* 下次发送非应答信号 */
}
else
{ I21CONSET = 1 << 2; /* 下次发送应答信号 */
}
I21CONCLR = 0x28; /* 清零SI,STA */
break;
case 0x20: /* 已发送SLA+W,已接收非应答 */
case 0x30: /* 已发送I2DAT中的数据,已接收非应答 */
case 0x38: /* 在SLA+R/W或数据字节中丢失仲裁 */
case 0x48: /* 已发送SLA+R,已接收非应答 */
I21CONCLR = 0x28;
break;
case 0x50: /* 已接收数据字节,已返回ACK */
*I2C1_buf++ = I21DAT;
I2C1_num--;
if (I2C1_num == 1)/* 接收最后一个字节 */
{ I21CONCLR = 0x2C; /* STA,SI,AA = 0 */
}
else
{ I21CONSET = 0x04; /* AA=1 */
I21CONCLR = 0x28;
}
break;
case 0x58: /* 已接收数据字节,已返回非应答 */
*I2C1_buf++ = I21DAT; /* 读取最后一字节数据 */
I21CONSET = 0x10; /* 结束总线 */
I21CONCLR = 0x28;
isr_sem_send (wait_end1_sem);
break;
default:
break;
}
}
#endif
#if USE_I2C_CTRL2 == 1
/* 读取I2C状态寄存器I2DAT */
/* 按照全局变量的设置进行操作及设置软件标志 */
/* 清除中断逻辑,中断返回 */
if(I22CONSET & 1 << 3)
{
switch (I22STAT & 0xF8)
{ /* 根据状态码进行相应的处理 */
case 0x08: /* 已发送起始条件 */ /* 主发送和主接收都有 */
/* 装入SLA+W或者SLA+R */
if(I2C2_suba_en == 1)/* SLA+R */ /* 指定子地址读 */
{ I22DAT = I2C2_sla & 0xFE; /* 先写入地址 */
}
else /* SLA+W */
{ I22DAT = I2C2_sla; /* 否则直接发送从机地址 */
}
/* 清零SI位 */
I22CONCLR = (1 << 3)| /* SI */
(1 << 5); /* STA */
break;
case 0x10: /*已发送重复起始条件 */ /* 主发送和主接收都有 */
/* 装入SLA+W或者SLA+R */
I22DAT = I2C2_sla; /* 重起总线后,重发从地址 */
I22CONCLR = 0x28; /* 清零SI,STA */
break;
case 0x18:
case 0x28: /* 已发送I2DAT中的数据,已接收ACK */
if (I2C2_suba_en == 0)
{
if (I2C2_num > 0)
{ I22DAT = *I2C2_buf++;
I22CONCLR = 0x28; /* 清零SI,STA */
I2C2_num--;
}
else /* 没有数据发送了 */
{ /* 停止总线 */
I22CONSET = (1 << 4); /* STO */
I22CONCLR = 0x28; /* 清零SI,STA */
isr_sem_send (wait_end2_sem); /* 总线已经停止 */
}
}
if(I2C2_suba_en == 1) /* 若是指定地址读,则重新启动总线 */
{
if (I2C2_suba_num == 2)
{ I22DAT = ((I2C2_suba >> 8) & 0xff);
I22CONCLR = 0x28; /* 清零SI,STA */
I2C2_suba_num--;
break;
}
if(I2C2_suba_num == 1)
{ I22DAT = (I2C2_suba & 0xff);
I22CONCLR = 0x28; /* 清零SI,STA */
I2C2_suba_num--;
break;
}
if (I2C2_suba_num == 0)
{ I22CONSET = 0x20;
I22CONCLR = 0x08;
I2C2_suba_en = 0; /* 子地址己处理 */
break;
}
}
if (I2C2_suba_en == 2)/* 指定子地址写,子地址尚未指定,则发送子地址 */
{
if (I2C2_suba_num > 0)
{ if (I2C2_suba_num == 2)
{ I22DAT = ((I2C2_suba >> 8) & 0xff);
I22CONCLR = 0x28;
I2C2_suba_num--;
break;
}
if (I2C2_suba_num == 1)
{ I22DAT = (I2C2_suba & 0xff);
I22CONCLR = 0x28;
I2C2_suba_num--;
I2C2_suba_en = 0;
break;
}
}
}
break;
case 0x40: /* 已发送SLA+R,已接收ACK */
if (I2C2_num <= 1) /* 如果是最后一个字节 */
{ I22CONCLR = 1 << 2; /* 下次发送非应答信号 */
}
else
{ I22CONSET = 1 << 2; /* 下次发送应答信号 */
}
I22CONCLR = 0x28; /* 清零SI,STA */
break;
case 0x20: /* 已发送SLA+W,已接收非应答 */
case 0x30: /* 已发送I2DAT中的数据,已接收非应答 */
case 0x38: /* 在SLA+R/W或数据字节中丢失仲裁 */
case 0x48: /* 已发送SLA+R,已接收非应答 */
I22CONCLR = 0x28;
break;
case 0x50: /* 已接收数据字节,已返回ACK */
*I2C2_buf++ = I22DAT;
I2C2_num--;
if (I2C2_num == 1)/* 接收最后一个字节 */
{ I22CONCLR = 0x2C; /* STA,SI,AA = 0 */
}
else
{ I22CONSET = 0x04; /* AA=1 */
I22CONCLR = 0x28;
}
break;
case 0x58: /* 已接收数据字节,已返回非应答 */
*I2C2_buf++ = I22DAT; /* 读取最后一字节数据 */
I22CONSET = 0x10; /* 结束总线 */
I22CONCLR = 0x28;
isr_sem_send (wait_end2_sem);
break;
default:
break;
}
}
#endif
VICVectAddr = 0x00; /* 中断处理结束 */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -