⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lpc214x test.c

📁 LPC2140 cpu外设全接口 注释详细到极点了
💻 C
📖 第 1 页 / 共 5 页
字号:
************************************************************************/
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 + -