LPC900系列单片机I2C总线一主多从通信实例

所需积分/C币:14 2014-07-15 12:43:07 296KB PDF
收藏 收藏
举报

LPC900系列单片机I2C总线一主多从通信实例.pdf
广州周立功单片机发展有限公司Tel:(020)3873097638730977Fax:38730925htp/ww. zlgmcu. com 从机1通信 初始化 取反LED10 与标志置位 清零写标志 读标志置位 接收数据 正确 ↓取反LED 清零读标志 图3从机主程序流程图 通信初始化 向从机1发送写命令 发送10字节数据,取反 LEDO 向从机1发送读命令 接收10字节数据 接收正确 ↓取反LED1 对从机2进行操作 图4主机程序流程图 广州周立功单片机发展有限公司Tel:(020)3873097638730977Fax:38730925htp/ww. zlgmcu. com 程序流程如图2、图3和图4所小。图2中给出了从机1的中断服务程序的流程图。图 3给出了从机1的主程序流程图。图4给出了主机的程序流程图。从机1和从机2的流程图 相同,在此仅给出从枳1的程序流程图。主机对从机1和丛机2的操作相类似,因而在流程 图中仅以“对从机2进行操作”表示。 3.2编程要点 P8啁LPC932是通过对寄存器的操作达到对C总线进行控制的目的。其中涉及的寄存器 有6个,分别为I2CON(rC控制寄存器)、2DAT(数据寄存器)、I2STAT(状态寄存器)、 I2ADR(地址寄存器)、I2SCIH(占空比寄存器高字节)、I2SCLL(SCL占空比寄存器低字 节)。这里给出I2CON寄存器的功能描述,如表1所示。 C通信的操作模式有4种 主发送器模式 主接收器模式 从接收器模式 从发送器模式 每次的通信都是由主机发起的。具体为主机发送起始条件,然后发送要操作的从机地址 和读写命令。在收到从机应答后,进行相应操作。如果是主发送器模式,则由主机发送数据 到从机,从机每收到一宇节数据就发送应答信号相应主机。如果是主接收器模式,则数据是 由从机发送到主机的,主机每收到一个字节就发送应答信号相应从机。在主机为主发送器模 式时,从机为从接收器模式。在主机为主接收器模式时,从机为从发送器模式。通信完毕 主机发送停止信号,结束操作。IC的通信格式归纳如图4所小。 表11G控制寄存器 7 6 0 I2EN STA STO SI AA CRSEL I2EN:C接口使能位 STA:起始标志位 ●STO:停止标志位 IC中断标志位 ●AA:声明应答标志位 CRSEL:SCL时钟选择标忐位 8「从址多A数A】数】A】P 传输的数据 n个字节+应答 A=应答(SDA为低) 主机到从机 A=非应答(SDA为高) 从机到主机 s=起始条件 P=停止条件 如果数据由主机发送,则应答由从机产生 如果数据由从机发送,则应答由主机产生 图5C通信格式 广州周立功单片机发展有限公司Tel:(020)3873097638730977Fax:38730925htp:/www.zlgmcu.com 以下归纳出rC通信初始化和程序设计要点。 IC通信初始化的步骤为: a)初始化端口,SDA和SCL必须为井漏方式。 b)初始化寄存器I2SCLH和I2SCL,其设置不仅涉及到占空比,也涉及到总线的通信 速率,计算公式为fFLK/(2*(I2SCLH+I2SCLL)) c)初始化I2CON为0x44,即使能rC总线、允许应答、使能内部SCL发生器。主机可 以不设置应答位,但从机必须设置应答位 d)从杋程序中还要设置相应的从机地址,其方法是把从机地址写到I2ADR中。寄存 器的最低位是通用调用位。置位时,对通用地址进行识别。 e)如果PC以中断方式通信,则要置位E2C和EA。本实验中从机就是以中断方式进 行通信的。 IC通信程序设计要点 a)每次通信的起始条件和停止条件均由主机发起,从机只是负责喳听主机信号。起 始条件和停止条件是通过置位2CON中的STA和SIO位达到的 b)当主机获得总线,成功发送启动条件后,地址和数据的发送是通过写数据寄存器 I2DAT达到的。 c)每次发送地址和数据后应该查询状态寄存器I2STAT检查数据发送状态以进行下 一步动作。 d)每次通信完毕后主机和从机均应该释放总线。 4.源程序清单 程序清单4.1主机稈序(C51版) /*米米米冰米冰冰**×**冰冰米米冰冰x*来*冰米冰冰冰*来表*济米 *文件名:D2 MAster. c 版权: 周立功单片机研究所 *功能 LPC900rC总线演示程序(主机) 2004/12/28 米水水客水容水岩水客不容*容容水水米水客水》容容水容水水米凇米水水容水岩兴容农水容米米水米水容水 #include"reg932 #"hi2c c51.h' /包含C主方式软件包头文件 #define uchar unsigned char #define SLAVEl 0x60 ∥定义从机1地址 #define SLAVE2 0x50 ∥定义从机2地址 定义数据表,主从机均相同,发送方按数据表发送,接收方按表判断数据的正确性 uchar code matalab[10]={0x01,0x02,0x03,0X04,0x05,0x06,0x07,0x08,0x09,0x10} sbit LED-P0C2 LEDI-P0 3 Delay(int) void event loop( void); roid maino 广州周立功单片机发展有限公司Tel:(020)3873097638730977Fax:38730925htp/ww. zlgmcu. com uchar buff[10] 定义数据接收缓冲区 uchar i,err PIMI-OX0C 定义SDA(P13)和SCL(P12)为开漏方式 P1M2=0x0C POMI=0x00 ∥定义LED驱动为推挽方式 POM2=OXUC. LED-1 /开机闪一下LED Delay(1000): LED=O while(l) event loop ∥开始事件循环 求米米水米求*求*半》**来*米水米客求*k*半***来求来米米求幸非*k*半求来求*米冰米非非 *函数名称 event oo 功能:事件循环 半*半幸*率*半***半*幸*半半来******军半半****来**米*******半*幸*幸*半来半半幸**率*半幸* void event loop(void) uchar 1.err Delay(loo0); ISendstrExt(SLAVEl, DataTab, 10) /向从机1发起与操作 LED=LED Delay(1000) it(IRcv StrExt(sLAVEI,buff, 10)) 向从机1发起读操作 errO for(i=0;i<10,i+) 判断接收到的数据是否符合数据表内容 if(buff]!=DataTab[i]) ferr=1; if(crr)LEDI= -LEDl; i ∥正确则取反LED表示 for(i-0;i<10,i+-) /清空数据接收区 buffet」=0; Dclay(1000) ISendStrExt(SLAVE2, Data Tah, 10); /向从机2发起写操作 LED= LED 广州周立功单片机发展有限公司Tel:(020)3873097638730977Fax:38730925htp/ww. zlgmcu. com Dlay(1000); if(RcvStrExt(SLAVE2, buff, 10)) 向从机2发起读操作 err- for(i=0; i< 10; 1++) 判断接收到的缴据是否符合数据表内容 { if(buff[i]!-Data Tab[d err-1 if(lerr)LED]=-LEDI ∥正确则取反LED1表示 for(i=0;<10;i+) /清空数据接收区 buff[il-0; /本*本*本本本本春本本本本本*本*本本本春*本本幸本本本本本本春衣本本本*本本本春本春本本 函数名称: 功能 延时 菜入口参数: 延时值 半*半幸*率*半***半*幸*半半来******军半半****来**米*******半*幸*幸*半来半半幸**率*半幸* void Delay(int 1) while(io) forG=0j<=1000j计+); 程序清单4.2从机程序(C51版 /**菜米菜米冰家冰米*×冰冰米凉*米淋米冰冰冰*冰*冰*米米米冰家求浓冰*※*冰*菜*米冰 *文件名 I2CSlave.c 版权:周立功单片机研究所 *功能 LPC900P?C总线演示程序(从机) 日期: 2004/12/28 苯菜冰浓苯冰米冰×冰张米苯*米冰浓*米*苯家米米菜冰客浓**来※*米米米冰 #include reg932 h #" hi2csla cslh" /)含C软什包从方式头文什 #define uchar unsigned char #define SLAVE ADDR Ox50 从机地址,2个从机地址应该不同 LED=P0 2 广州周立功单片机发展有限公司Tel:(020)3873097638730977Fax:38730925htp/ww. zlgmcu. com LEDI=P03 Dclay(uchar); 定义薮据表,主从机均相同,以判断数据接收正确性 uchar code matalab[10]={0x01,0x02.0x03.0X04,0x05,0x06,0x07,0x08,0x09,0x10}; bi ReadFlag=0 定义读标志 bit SendFlag=0 定义发送标志 uchar ∥定义数据缓冲区和索引 *米*半半*半*半***家***来幸米*半半*半*半幸米半****来幸*半***幸*半*米**幸幸来半半半半*半幸半*幸 函数名称 L2c Int 功能: rC中断服务 半**事*串率*率》半半常半*来***中半*率器**半***来*半*半率率半半串*和*串*半*串*串率半率半* void I2c Int( void)interrupt 6 I2C中断处理函数 switch(I2STAT) case rdsla /主机发起读操作 dex O while(l) 发送数据,响应主机 if(send3yte( Data Tablindex」)≥=0) break; index + if( index>=10)break; SendFlag=1 置发送标志,表示发送完毕 break. case Wisla 机发起写操作 index=0 while(1) 接收主机发送的数据 if( rev Byte(buff+index )-0 )break index++. if( index>=10) break CadlAg=I 置读标志,表示收到数据 break break. I2CON=0x44 释放总线 id main( 广州周立功单片机发展有限公司Tel:(020)3873097638730977Fax:38730925htp/ww. zlgmcu. com uchar 1. crr PIMI=OXOC. 定义SDA(P13)和SCL(P12)为开漏方式 PlM2-0x0C: POMI=Ox00 定义LED驱动为推挽方式 POM2=OXOC E2C=I. 允许I2C中断 EA-1; SetBus(SLAVE ADDR); 设为从机 LED=1 /开机闪一下LED Dlay(255); LED-0 if( SendFlag /果已发送数据则取反LED1表示 LEDI=LEDI SendFlag=0 err=0 if(readF 如果接收到数据则执行 for(i-0;i<10,i+-) /判断接收到的数据是合符合数据表内容 if(buff[]!=Data- if(err)LED=lED: ∥正确则取反LED表示 for(i-0;i<10,i+) /清空数据接收区 buft」=0 CadlAg=0 来*半半*水架半**来岸半率半*率*半*半*串*半*半半宰*半**半*率**来**半*半事来非率 函数名称 dclay 功能 延时 入口参数: i延时值 米苯米苯苯※*x※来冰苯米苯冰苯冰苯冰*冰*×***苯凉米茶米米家米*冰*冰凉*菜*菜冰家冰*冰**x冰苯 void Delay(uchar i 广州周立功单片机发展有限公司Tel:(020)3873097638730977Fax:38730925htp/ww. zlgmcu. com int for=0j<=669j++); 程序清单4.3主机程序(ASM版) 来*******来半*半*事半*中*串***兴*****来***率幸串半非率**来****半 ;文件名 L2CMastcr. asm 饭权:周立功单片机研究所 功能 LPC900Ⅰ2C总线演示程序(主机) 日期 2004/12/28 **半**半*串来半半*率*半*串*半*串率半兴*半*来*来=半*冰*串来*半兴来*****半* 义P89LPC932的L2C相关寄存器的定义 L2ADR DATA ODEH I2DAT DATA ODAH 22CON DATA OD8II I2STAT DATA OD9H I2SCLH DATA ODDH I2SCLL DATA ODCH STA BIT IcON, 5 SI BIT IcON. 3 定义P8LPC932的部分特殊寄存器 POM1 DATA 84H POM2 DATA 85H PIMI DATA IH PIM2 DATA 92H ;为软件包定义变量 ACK BIT 10H 应答标志位 DATA 50H 器件从地址 SUBA DATA 51H 器件子地址 NUMBYTE DATA 2H ;读/写的字节数 ;使用前定义常量: SDA P1.3 SCL EQU P1.2 MTD EQU 30H ;发送数据缓冲区首址(缓冲区30H-3FH MRD EQU OnI 接收数据缓冲区首址(缓冲区40-4F LED BIT P0.2

...展开详情
试读 16P LPC900系列单片机I2C总线一主多从通信实例
立即下载 低至0.43元/次 身份认证VIP会员低至7折
抢沙发
一个资源只可评论一次,评论内容不能少于5个字
上传资源赚积分or赚钱
最新推荐
LPC900系列单片机I2C总线一主多从通信实例 14积分/C币 立即下载
1/16
LPC900系列单片机I2C总线一主多从通信实例第1页
LPC900系列单片机I2C总线一主多从通信实例第2页
LPC900系列单片机I2C总线一主多从通信实例第3页
LPC900系列单片机I2C总线一主多从通信实例第4页

试读结束, 可继续读1页

14积分/C币 立即下载 >