MC9S12XS128串行通信例程.doc_第1页
MC9S12XS128串行通信例程.doc_第2页
MC9S12XS128串行通信例程.doc_第3页
MC9S12XS128串行通信例程.doc_第4页
MC9S12XS128串行通信例程.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

SCI程序串行通信时MCU与外部设备之间进行通信的一种简单而有效的硬件方法。无论用查询方式还是中断方式进行串行通信编程,在程序初始化时均必须对SCI进行初始化。初始化主要包括波特率设置、通信格式的设置、发送接收数据方式的设置等。对SCI进行初始化,需要设置如下几部分:(1) 定义波特率 一般选内部总线时钟为串行通信的时钟源。通过设置SCI波特率寄存器SCI0BD的波特率选择位SBR12:0,来选择合适的分频系数。(2) 写控制字到SCI控制寄存器1(SCI0CR1) 设置是否允许SCI、数据长度、输出格式、选择唤醒方法、是否校验等。(3) 写控制字到SCI控制寄存器2(SCI0CR2)设置是否允许发送与接收、是中断接收还是查询接收等。串行通信程序如下:程序一:(中断方式)/* write in “Init.h” */#include /* common defines and macros */#include derivative.h /* derivative-specific definitions */void InitBusClk(void); /可以不使用锁相环void InitSci(void);/* write in “Init.c” */初始化程序#include Init.h/*/-初始化Bus Clock-/void InitBusClk(void) DisableInterrupts; CLKSEL=0X00; /PLLSEL 1 : Bus Clock=PLLCLK/2 / 0 : Bus Clock=OSCCLK/2 PLLCTL_PLLON=1; /开启PLL SYNR=0; /OSCCLK=16MHz REFDV=0X0F; /PLLCLK=2*OSCCLK*(1+SYNR)/(1+REFDV=32/16=2MHz while(!(CRGFLG_LOCK=1); /直到LOCK=1,when PLL is ready,退出循环 CLKSEL_PLLSEL=1; /PLLSEL 1 : Bus Clock=PLLCLK/2=2MHz/2=1MHz / 0 : Bus Clock=OSCCLK/2=16M/2=8MHz*/-初始化SCI-/void InitSci(void) SCI0BD=4545; /设波特率为110 /SCI baud rate = SCI module clock/(16*SCIBD)=Bus Clock/(16*SCIBD) / = 8MHz/(16*4545)=500kHz/4545=110bps /SCIBD : SBR12-SBR0,Value from 1 to 8191 SCI0CR1=0; SCI0CR2=0X2C; / 0010 1100 RIE=1,TE=1,RE=1 / RIE=1 RDRF and OR interrupt requests enabled / TE=1 Transmitter enabled / RE=1 Receiver enabled/* write in “SCI.h” */函数声明unsigned char SciRead();void SciWrite(byte);/* write in “SCI.c” */串行通信程序#include Init.h#include SCI.h/-读SCI数据-/unsigned char SciRead() if(SCI0SR1_RDRF=1)/数据从移位寄存器传送到SCI数据寄存器SCIDRL /SCI0SR1_RDRF=1表明数据寄存器SCI0DRL为满,可以接收新的数据 SCI0SR1_RDRF=1; /读取SCI数据寄存器会将RDRF清除,重新置位 return SCI0DRL; /返回数据寄存器的数值 /-写SCI数据-/void SciWrite(byte sci_value) while(!(SCI0SR1&0X80); /SCI0SR1_TDRE=1表明数据寄存器SCI0DRL为空,可以发送新的数据 SCI0DRH=0; SCI0DRL=sci_value; /发送新的数据至数据寄存器SCI0DR/-中断程序-/#pragma CODE_SEG NON_BANKEDinterrupt 20 void Sci_Intrrupt(void) /SCI的中断向量号为20 byte text; DisableInterrupts; /关中断 text=SciRead(); /接收数据寄存器SCI0DRL中的数据 asm nop; asm nop; SciWrite(text); /发送数据至数据寄存器SCI0DRL DDRA=0XFF; /设A口为输出,用来显示是否执行中断,可以不用 PORTA_PA6=!PORTA_PA6; EnableInterrupts; /开中断#pragma CODE_SEG DEFAULT/* write in “main.c” */#include Init.h#include SCI.hvoid main(void) /* put your own code here */ _DISABLE_COP(); /关看门狗 DisableInterrupts; /关中断 /InitBusClk(); InitSci(); EnableInterrupts; /开中断 for(;) / _FEED_COP(); /* feeds the dog */ /* loop forever */ /* please make sure that you never leave main */程序二:(查询方式)/* write in “Init.h” */#include /* common defines and macros */#include derivative.h /* derivative-specific definitions */芯片初始化相关函数声明void InitSCI(void);/* write in “Init.c” */头文件#include Init.h /芯片初始化头文件/-初始化SCI-/void InitSCI(void) SCI0BD=4545; /SCI baud rate = SCI module clock/(16*SCIBD)=Bus Clock/(16*SCIBD) / = 8MHz/(16*4545)=500000Hz/4545=110bps /SCIBD : SBR12-SBR0,Value from 1 to 8191 SCI0CR1=0X00; SCI0CR2=0X0C; /0010 1100 RIE=1,TE=1,RE=1 /RIE=1 RDRF and OR interrupt requests enabled /TE=1 Transmitter enabled /RE=1 Receiver enabled/* write in “SCI.h” */SCI.h串行通信头文件-/#include Init.h /串行通信相关函数声明void SCITXD(byte sci_value); /串行发送1个字节void SCISendN(byte n,byte ch); /串行发送n个字节byte SCIRXD(byte *p); /串行接收1个字节byte SCIReceiveN(byte n,byte ch); /串行接收n个字节/* write in “SCI.c” */#include SCI.h/SCITXD:串行发送1个字节-*void SCITXD(byte sci_value)while(!(SCI0SR1&0X80); /SCI0SR1_TDRE=1表明数据寄存器SCI0DRL为空,可以发送新的数据/SCI0DRH=0; /当使用8位数据格式时,只使用SCIDRL寄存器。当使用9位数据格式时, /先写SCIDRH寄存器,再写SCIDRL寄存器。 SCI0DRL=sci_value; /发送新的数据至数据寄存器SCI0DRL /SCISendN:串行发送N个字节-*void SCISendN(byte n,byte ch) byte i; for (i=0; in; i+) SCITXD(chi);/SCIRXD:串行收1个字节数据-*/功 能:从串行口接收1个字节的数据 */参 数:p=标志指针 */返 回:接收到的数据(若接收失败,返回0xff) */说 明:参数*p带回接收标志=0收到数据,=1未收到数据 */-*byte SCIRXD(byte *p) int k; byte i; for (k=0; k= 0xfbbb) i=0xff; *p=0x01; return i; /返回接收到的数据/SCIReceiveN:串行接收N个字节数据-*byte SCIReceiveN(byte n,byte ch) byte m; byte fp; m = 0; while (mn) /串行接收N个数据 chm = SCIRXD(&fp); if (fp = 1) return 1; /接收失败,返回1 m+; return 0; /接收成功,返回0/* write in “main.c” */#include Init.h#include SCI.hvoid main(void) /* put your own code here */ byte i; byte SerialBuff1; /存放接收数据的数组 DDRA=0XFF; /设A口为输出,用PORTA_PA6显示接收状态 DDRB=0XFF; /设B口为输出,标记数据传输过程 PORTB=0X55; /_DISABLE_COP(); DisableInterrupts; /关总中断 InitSCI(); PORTA_PA2=!PORTA_PA2; /EnableInterrupts; for(;) PORTB=PO

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论