LPC_11C14平台I2C分析

发布者:Harmonious222最新更新时间:2019-01-15 来源: eefocus关键字:LPC_11C14平台  I2C分析 手机看文章 扫描二维码
随时随地手机看文章

1) IIC的初始化:复位IIC,使能IIC时钟单元,设置相应的I0口为IIC功能,清除应答位、起始位、中断位、IIC使能位,设置IIC传输速率,如果是从机的话,设置从机地址,IIC中断使能,最后启动IIC.


2) IIC的启动


uint32_t I2CStart( void ) 

        { 

                uint32_t timeout = 0; 

                uint32_t retVal = FALSE; 

                LPC_I2C->CONSET = I2CONSET_STA //设置起始位 

                /*循环等待起始位发送,设置超时时间*/ 

                while( 1 ) 

        { 

                if ( I2CMasterState == I2C_STARTED ) //起始位发送成功,中断中设置 

                { 

                retVal = TRUE; 

                break; 

                } 

                if ( timeout >= I2C_MAX_TIMEOUT ) //起始位发送超时 

                {

                        retVal = FALSE; 

                        break; 

                } 

                timeout++; 

                } 

                return( retVal ); 

                } 


        3)IIC的停止


        uint32_t I2CStop( void ) 

        { 

                LPC_I2C->CONSET = I2CONSET_STO; //设置停止位 

                LPC_I2C->CONCLR = I2CONCLR_SIC; //清除中断标志 

                /*等待停止位发送*/ 

                while( LPC_I2C->CONSET & I2CONSET_STO ); 

                return TRUE; 

        } 


        4)IIC的一次完整通信


        uint32_t I2CEngine( void ) 

        { 

                I2CMasterState = I2C_IDLE; //初始状态 

                RdIndex = 0; 

                WrIndex = 0; 

                if ( I2CStart() != TRUE ) //发送启动信号 

        { 

                I2CStop(); 

                return ( FALSE ); 

        } 


        while ( 1 ) 

        { 

                if ( I2CMasterState == DATA_NACK ) //判断数据是否传输完毕 

                { 

                        I2CStop(); //IIC停止 

                        break; 

                } 

        } 

        return ( TRUE ); 

        } 


        5)主发送代码


        void I2CWrite(uint8_t addr, uint8_t* buf, uint32_t len) 

        { 


                I2CAddr = addr; //设置从机地址 

                I2CMasterBuffer = buf; //主发送Buffer指向要传输的数据 

                I2CWriteLength = len; //发送数据的长度 

                I2CReadLength = 0; 

                I2CEngine(); //启动IIC完整的通信过程 

                I2CWriteLength = I2CWriteLength; 

        } 


        6)中断处理函数


        每次状态的改变,SI位都会置位,在中断处理函数中,根据不同的状态码,进行相应的操作,在这些操作中,清除SI位是必须要做的,在这里主要列出主发送中断的处理函数部分,其他部分可根据数据手册的操作流程进行相应的操作。

        void I2C_IRQHandler(void) 

        { 

                uint8_t StatValue; 

                /* 仅列出了主发送方式的处理*/ 

                StatValue = LPC_I2C->STAT; //读取状态码 

                witch ( StatValue ) //根据状态码执行不同的操作 

        { 

        case 0x08: //已发送起始条件 

        WrIndex = 0; 

        LPC_I2C->DAT = I2CAddr; //SLA + W装入数据寄存器 

        LPC_I2C->CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC);//请吃 SIC及STAC位 

        I2CMasterState = I2C_STARTED; 

        break; 


        case 0x10: //已发送重复起始条件 

        RdIndex = 0; 

        /* 发送SLA + R状态位 */ 

        LPC_I2C->DAT = I2CAddr; 

        LPC_I2C->CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC); 

        I2CMasterState = I2C_RESTARTED; 

        break; 


        case 0x18: //以发送SLA + W,并已接受ACK 

        if ( I2CMasterState == I2C_STARTED ) 

        { 

                LPC_I2C->DAT = I2CMasterBuffer[WrIndex++]; //发送数据写入DATA寄存器 

                I2CMasterState = DATA_ACK; 

        } 

        LPC_I2C->CONCLR = I2CONCLR_SIC; 

        break; 


        case 0x28: /* 数据已发送,返回ACK或非ACK*/ 

        case 0x30: 

        if ( WrIndex < I2CWriteLength ) //判断是否发送完,未完继续发送 

        { 

                LPC_I2C->DAT = I2CMasterBuffer[WrIndex++]; 

                I2CMasterState = DATA_ACK; 

        } 

        Else //指定长度的数据已发送完 

        { 

                if ( I2CReadLength != 0 ) 

                { 

                        LPC_I2C->CONSET = I2CONSET_STA; //设置重复起始条件 

                        I2CMasterState = I2C_REPEATED_START; 

                } 

        else 

                { 

                        I2CMasterState = DATA_NACK; 

                        LPC_I2C->CONSET = I2CONSET_STO; // 置位停止位 

                } 

        } 

        LPC_I2C->CONCLR = I2CONCLR_SIC; 

        break; 

        …… 

关键字:LPC_11C14平台  I2C分析 引用地址:LPC_11C14平台I2C分析

上一篇:LPC11C14通信接口之I2C
下一篇:关于STM32 NVIC配置的解释

推荐阅读最新更新时间:2024-03-16 16:22

mini2440 I2C驱动的分析与学习(一)
花了近一个星期的时间学习I2C的驱动,将心得描述如下。I2C是一个典型的较简单的子系统,比较适合学习,因为I2C协议要比PCI等等简单得多。 在mini2440上用I2C连了一块EEPROM的芯片。因此,在mini2440上面说I2C的驱动,主要是说怎么样通过I2C在这块EERPOM上面读写数据。有点像是这个EEPROM的驱动。 先分析几个相关的结构体。其实有时觉得C语言就是以结构体为中心的,基本上把重要的结构体看明白了,程序也就看懂了。 struct s3c24xx_i2c { spinlock_t lock; wait_queue_head_t wait; unsigned int sus
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved