📄 lpc214x test.c
字号:
************************************************************************/
void CPU_IO_SetAddrBus(INT8U mode)
{
switch(mode)
{
case 0: //全部作为GPIO
PINSEL2 &= ~(0x0000001F<<23);
break;
case 2: //用作2位地址总线
PINSEL2 &= ~(0x0000001F<<23); //A3:2
PINSEL2 |= 0x00000001<<25;
break;
case 4: //用作4位地址总线
PINSEL2 &= ~(0x0000001F<<23); //A5:2
PINSEL2 |= 0x00000002<25;
break;
case 6: //用作6位地址总线
PINSEL2 &= ~(0x0000001F<<23); //A7:2
PINSEL2 |= 0x00000003<<25;
break;
case 8: //用作8位地址总线
PINSEL2 &= ~(0x0000001F<<23);
PINSEL2 |= 0x00000013<<23; //A7:0
break;
case 10: //用作10位地址总线
PINSEL2 &= ~(0x0000001F<<23);
PINSEL2 |= 0x00000004<<25; //A11:2
break;
case 14: //用作14位地址总线
PINSEL2 &= ~(0x0000001F<<23);
PINSEL2 |= 0x00000005<<25; //A15:2
break;
case 16: //用作16位地址总线
PINSEL2 &= ~(0x0000001F<<23);
PINSEL2 |= 0x000000017<<23; //A15:0
break;
case 18: //用作18位地址总线
PINSEL2 &= ~(0x0000001F<<23);
PINSEL2 |= 0x000000006<<25; //A19:2
break;
case 22: //用作22位地址总线
PINSEL2 &= ~(0x0000001F<<23);
PINSEL2 |= 0x000000007<<25; //A19:2
break;
case 24: //用作24位地址总线
PINSEL2 |= 0x00000001F<<23; //A23:0
break;
default:
break;
}
}
#endif
void CPU_IO_JtagEnable(void)
{
CPU_IO_SetP1Fnct(26, 1);
}
void CPU_IO_JtagDisable(void)
{
CPU_IO_SetP1Fnct(26, CPU_IO_GPIO);
}
void CPU_IO_TrackEnable(void)
{
CPU_IO_SetP1Fnct(16, 1);
}
void CPU_IO_TrackDisable(void)
{
CPU_IO_SetP1Fnct(16, CPU_IO_GPIO);
}
#ifdef CPU_I2C0_EN
/****************************************************************************
* 函数名称 :__irq CPU_I2C_IRQ0() *
* 函数名次 :硬件I2C中断服务程序。 *
* 入口参数 :无 *
* 出口参数 :无 *
* 说明 :注意处理子地址为2字节的情况。 *
*****************************************************************************/
void __irq CPU_I2C_IRQ0(void)
{ //读取I2C状态寄存器I2DAT
//按照全局变量的设置进行操作及设置软件标志
//清除中断逻辑,中断返回
switch (I2STAT & 0xF8)
{ //根据状态码进行相应的处理
case 0x08: //已发送起始条件 主发送和主接收都有
//装入SLA+W或者SLA+R
if(I2CPara[0].SubAddrEn == 1) //SLA+R 指定子地址读
{
I2DAT = I2CPara[0].SlAddr & 0xFE; //先写入地址
}
else //SLA+W
{
I2DAT = I2CPara[0].SlAddr; //否则直接发送从机地址
}
//清零SI位
I2CONCLR = (1 << 3)| //SI
(1 << 5); //STA
break;
case 0x10: //已发送重复起始条件 主发送和主接收都有
//装入SLA+W或者SLA+R
I2DAT = I2CPara[0].SlAddr; //重起总线后,重发从地址
I2CONCLR = 0x28; //清零SI,STA
break;
case 0x18:
case 0x28: //已发送I2DAT中的数据,已接收ACK
if (I2CPara[0].SubAddrEn == 0)
{
if (I2CPara[0].BytesNum > 0)
{
I2DAT = *I2CPara[0].Buf++;
I2CONCLR = 0x28; //清零SI,STA
I2CPara[0].BytesNum--;
}
else //没有数据发送了
{ //停止总线
I2CONSET = (1 << 4); //STO
I2CONCLR = 0x28; //清零SI,STA
I2CPara[0].End = 1; //总线已经停止
}
}
if(I2CPara[0].SubAddrEn == 1) //若是指定地址读,则重新启动总线
{
if (I2CPara[0].SubAddrNum == 2)
{
I2DAT = ((I2CPara[0].SubAddr >> 8) & 0xff);
I2CONCLR = 0x28; //清零SI,STA
I2CPara[0].SubAddrNum--;
break;
}
if(I2CPara[0].SubAddrNum == 1)
{
I2DAT = (I2CPara[0].SubAddr & 0xff);
I2CONCLR = 0x28; //清零SI,STA
I2CPara[0].SubAddrNum--;
break;
}
if (I2CPara[0].SubAddrNum == 0)
{
I2CONSET = 0x20;
I2CONCLR = 0x08;
I2CPara[0].SubAddrEn = 0; //子地址己处理
break;
}
}
if (I2CPara[0].SubAddrEn == 2)//指定子地址写,子地址尚未指定,则发送子地址
{
if (I2CPara[0].SubAddrNum > 0)
{
if (I2CPara[0].SubAddrNum == 2)
{
I2DAT = ((I2CPara[0].SubAddr >> 8) & 0xff);
I2CONCLR = 0x28;
I2CPara[0].SubAddrNum--;
break;
}
if (I2CPara[0].SubAddrNum == 1)
{
I2DAT = (I2CPara[0].SubAddr & 0xff);
I2CONCLR = 0x28;
I2CPara[0].SubAddrNum--;
I2CPara[0].SubAddrEn = 0;
break;
}
}
}
break;
case 0x40: //已发送SLA+R,已接收ACK
if (I2CPara[0].BytesNum <= 1) //如果是最后一个字节
{
I2CONCLR = 1 << 2; //下次发送非应答信号
}
else
{
I2CONSET = 1 << 2; //下次发送应答信号
}
I2CONCLR = 0x28; //清零SI,STA
break;
case 0x20: //已发送SLA+W,已接收非应答
case 0x30: //已发送I2DAT中的数据,已接收非应答
case 0x38: //在SLA+R/W或数据字节中丢失仲裁
case 0x48: //已发送SLA+R,已接收非应答
I2CONCLR = 0x28;
I2CPara[0].End = 0xFF;
break;
case 0x50: //已接收数据字节,已返回ACK
*I2CPara[0].Buf++ = I2DAT;
I2CPara[0].BytesNum--;
if (I2CPara[0].BytesNum == 1)//接收最后一个字节
{
I2CONCLR = 0x2C; //STA,SI,AA = 0
}
else
{
I2CONSET = 0x04; //AA=1
I2CONCLR = 0x28;
}
break;
case 0x58: //已接收数据字节,已返回非应答
*I2CPara[0].Buf++ = I2DAT; //读取最后一字节数据
I2CONSET = 0x10; //结束总线
I2CONCLR = 0x28;
I2CPara[0].End = 1;
break;
default:
break;
}
VICVectAddr = 0x00; //中断处理结束
}
#endif //The #endif of #ifdef CPU_I2C0_EN
#ifdef CPU_I2C1_EN
/****************************************************************************
* 函数名称 :__irq CPU_I2C_IRQ1() *
* 函数名次 :硬件I2C1中断服务程序。 *
* 入口参数 :无 *
* 出口参数 :无 *
* 说明 :注意处理子地址为2字节的情况。 *
*****************************************************************************/
void __irq CPU_I2C_IRQ1(void)
{ //读取I2C状态寄存器I2C1DAT
//按照全局变量的设置进行操作及设置软件标志
//清除中断逻辑,中断返回
switch (I2C1STAT & 0xF8)
{ //根据状态码进行相应的处理
case 0x08: //已发送起始条件 //主发送和主接收都有
//装入SLA+W或者SLA+R
if(I2CPara[1].SubAddrEn == 1)//SLA+R //指定子地址读
{
I2C1DAT = I2CPara[1].SlAddr & 0xFE; //先写入地址
}
else //SLA+W
{
I2C1DAT = I2CPara[1].SlAddr; //否则直接发送从机地址
}
//清零SI位
I2C1CONCLR = (1 << 3)| //SI
(1 << 5); //STA
break;
case 0x10: //已发送重复起始条件 //主发送和主接收都有
//装入SLA+W或者SLA+R
I2C1DAT = I2CPara[1].SlAddr; //重起总线后,重发从地址
I2C1CONCLR = 0x28; //清零SI,STA
break;
case 0x18:
case 0x28: //已发送I2C1DAT中的数据,已接收ACK
if (I2CPara[1].SubAddrEn == 0)
{
if (I2CPara[1].BytesNum > 0)
{
I2C1DAT = *I2CPara[1].Buf++;
I2C1CONCLR = 0x28; //清零SI,STA
I2CPara[1].BytesNum--;
}
else //没有数据发送了
{ //停止总线
I2C1CONSET = (1 << 4); //STO
I2C1CONCLR = 0x28; //清零SI,STA
I2CPara[1].End = 1; //总线已经停止
}
}
if(I2CPara[1].SubAddrEn == 1) //若是指定地址读,则重新启动总线
{
if (I2CPara[1].SubAddrNum == 2)
{
I2C1DAT = ((I2CPara[1].SubAddr >> 8) & 0xff);
I2C1CONCLR = 0x28; //清零SI,STA
I2CPara[1].SubAddrNum--;
break;
}
if(I2CPara[1].SubAddrNum == 1)
{
I2C1DAT = (I2CPara[1].SubAddr & 0xff);
I2C1CONCLR = 0x28; //清零SI,STA
I2CPara[1].SubAddrNum--;
break;
}
if (I2CPara[1].SubAddrNum == 0)
{
I2C1CONSET = 0x20;
I2C1CONCLR = 0x08;
I2CPara[1].SubAddrEn = 0; //子地址己处理
break;
}
}
if (I2CPara[1].SubAddrEn == 2)//指定子地址写,子地址尚未指定,则发送子地址
{
if (I2CPara[1].SubAddrNum > 0)
{
if (I2CPara[1].SubAddrNum == 2)
{
I2C1DAT = ((I2CPara[1].SubAddr >> 8) & 0xff);
I2C1CONCLR = 0x28;
I2CPara[1].SubAddrNum--;
break;
}
if (I2CPara[1].SubAddrNum == 1)
{
I2C1DAT = (I2CPara[1].SubAddr & 0xff);
I2C1CONCLR = 0x28;
I2CPara[1].SubAddrNum--;
I2CPara[1].SubAddrEn = 0;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -