历史上的今天
返回首页

历史上的今天

今天是:2025年01月15日(星期三)

正在发生

2019年01月15日 | LPC_11C14平台I2C分析

2019-01-15 来源:eefocus

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; 

        …… 

推荐阅读

史海拾趣

喜美克斯(Cvilux)公司的发展小趣事

随着公司规模的逐渐扩大,喜美克斯公司开始思考如何进一步拓展市场。他们深入研究市场趋势和消费者需求,制定了针对不同市场的精准营销策略。通过与当地合作伙伴的紧密合作,喜美克斯成功地将产品打入了多个新兴市场,实现了销售额的快速增长。

BREL International Components公司的发展小趣事

BREL International Components公司自创立之初,就致力于电子元件的技术创新。在早期阶段,公司研发出一款高性能的集成电路,其稳定性和耐用性远超市场同类产品。这一创新为BREL赢得了众多客户的青睐,公司迅速在电子元件市场占据了一席之地。随着技术的不断进步,BREL持续推出创新产品,如低功耗的芯片和高速传输的连接器,进一步巩固了其在行业内的领先地位。

Cermetek Microelectronics公司的发展小趣事

在追求经济效益的同时,Cermetek Microelectronics公司也积极履行社会责任。公司注重环保和可持续发展,采用环保材料和生产工艺,减少对环境的影响。此外,公司还积极参与社会公益事业,为社会做出贡献。这种负责任的态度不仅赢得了社会各界的认可,也为公司的长远发展注入了正能量。

这五个故事展示了Cermetek Microelectronics公司在电子行业中的发展历程和取得的成就。通过技术积累、品质管理、持续创新、国际化战略和社会责任等方面的努力,公司逐渐在微电子领域树立起了自己的品牌形象和市场地位。

General Electric Company公司的发展小趣事
可能是由于电源噪声或外部干扰引起的。解决方案是加强电源滤波、使用屏蔽措施并优化信号路径。
Advanced Interconnections Corp公司的发展小趣事

随着环保意识的日益增强,AIC公司积极响应国家号召,推动绿色制造。公司引进了先进的环保设备和技术,对生产过程进行绿色化改造。同时,AIC公司还加大了对环保材料的研发力度,推出了多款符合环保标准的产品。这些举措不仅提升了公司的环保形象,也为公司的可持续发展奠定了坚实基础。

这些故事展示了AIC公司在电子行业中的发展历程和策略,但请注意,这些故事是基于虚构的,并不代表任何真实公司的实际经历。每个公司的发展道路都是独特的,受到众多因素的影响。

DZUS公司的发展小趣事

进入XX年代,DZUS公司面临了来自国内外竞争对手的严峻挑战。为了保持市场领先地位,公司加大了对技术创新的投入。研发团队成功开发了一系列新型紧固件,不仅提高了产品的性能和可靠性,还降低了生产成本。这些创新产品帮助DZUS公司巩固了市场地位,并赢得了更多客户的信赖。

问答坊 | AI 解惑

解析高速PCB设计中的布线策略

  差分线对的工作原理是使接收到的信号等于两个互补并且彼此互为参考的信号之间的差值,因此可以极大地降低信号的电气噪声效应。而单端信号的工作原理是接收信号等于信号与电源或地之间的差值 ,因此信号或电源系统上的噪声不能被有效抵消。这就 ...…

查看全部问答>

wince 按键控制系统菜单实现问题

哪位用过ZLG7290这款芯片,我现在也在使用。 我想请教大家个问题:如何写驱动实现控制wince的系统菜单的?比如打开左下角的菜单,上下移动菜单,或者关闭任意程序等。谢谢…

查看全部问答>

我不理解这么牛B的汇编语言

IF {FALSE}         mov     r0, r4         mov     r1, #256                 ...…

查看全部问答>

编译EVC出错

orelibc.lib(pegwmain.obj) : error LNK2019: unresolved external symbol WinMain referenced in function WinMainCRTStartup ARMV4IDbg/SPLLoaderDlg.exe : fatal error LNK1120: 1 unresolved externals 开始错误是这样的 后来按照这样改 Pr ...…

查看全部问答>

EVC4.0编译出错,求助!

EVC4.0编译程序的时候,会出现Error spawning cl.exe的错误,是怎么回事啊?…

查看全部问答>

wince5.0 window media player 6.4 支持标准RTSP

要让wince5.0 window media player 6.4 支持标准RTSP,所以要写一个RTSP 的filter, 我的问题是,只要注册了这个rtsp的filter ,用media player6.4接收rtsp的流就会直接调用我这个RTSP 的filter? 还是还要修改注册表其他地方??…

查看全部问答>

DSP平台的USB接口设计原理

USB接口(Universal Serial Bus)是一种通用的高速串行接口。它最主要的特点是它的高速传输特性。USB1.1理论速度极限可以达到12Mb/s,USB2.0可达到480Mb/s。这样,它可以很好解决大数据量的数据在嵌入式系统与PC机之间的互传问题;同时,它支持热 ...…

查看全部问答>

IEEE JSSC的论文从60年代到2005年全集15G电骡地址

由于原文档太大,采用点对点的方法很占带宽,现在改用电螺分享,速度会很快,为了方便下载,重新打包成700M的大小,共18个文档,地址文件详见附件。 晚上10:00以后速度会很快,不过总共有12G的内容,一个新的文档要下完还是需要一定时间的。 最后 ...…

查看全部问答>

EDN那个活动,开发套件的介绍怎么没了?

前两天还看见了。谁给再发一遍。…

查看全部问答>

怎么进不去中断函数啊?

#include   static unsigned int results;   void main(void) {   volatile unsigned int i;//unsigned long int j;   WDTCTL = WDTPW+WDTHOLD;             ...…

查看全部问答>