freescale第7章
*1 第7章 SCI串行通讯接口 第1节 串行通信概述 第2节 SCI结构 第3节 SCI寄存器 第4节 SCI实验 *2 SCI Serial Communication Interface 第7章 SCI串行通讯接口 一、什么是SCI 二、什么是串行通讯 为什么要通讯 第1节 串行通信概述 *3 三、串行通信与并行通信 并行通信数据的各位(bit)同时进行传送。 优点传送速度快 缺点需用传送线多,不适于远距离传送, 串行通信数据的各位逐个按顺序传送。 优点需用传送线少,适于远距离传送。 缺点传送速度较低。 四、串行通信的传输制式 *4 单工数据只能单方向传送(发送或接收)。 半双工数据可以双向传送,但只有一个通信回路,故不能同时发送和接 收。 全双工数据可以同时双向传送,具有两个独立的通信回路。 五、异步通信与同步通信 异步通信通信双方无统一的时钟脉冲控制。数据以“帧”(frame)为单位传 送。 帧格式起始位、数据位、奇偶校验位、停止位。 *5 同步通信传送双方有统一时钟脉冲协调同步。数据以帧为单位传送。 帧格式同步字符、(1-2个,1个一般用ASCII码SYNC-16H,2个一般用国 际通用码EB90H) 数据字符、(个数不限,一般用ASCII码)、校 验字符(1-2个) 波特率每秒钟传送的二进制代码的位数,单位为b/S,即bps 六、串行通信协议(异步通信) ⑴.起始位信号线上无数据传送时为1开始传送时发一个0信号,即起始位。 ⑵.数据位紧接起始位之后,个数一般为7-8位。 ⑶.奇偶校验位紧接数据位之后。一般为1位。 奇校验数据位与奇偶位中1的总个数为奇数。 偶校验数据位与奇偶位中1的总个数为偶数。 ⑷.停止位一帧数据的结束标志,一般为“1”。 ⑸.波特率通信双方约定一个相同的波特率。 ⑹.联络(握手)信号由数据通道线之外的一些专用信号线提供 *6 第7章 SCI串行通讯接口 第2节 SCI结构 * 7 第7章 SCI串行通讯接口 SCI发送器结构 管脚 移位寄存器 数据缓冲器 控制寄存器 状态寄存器 中断控制逻辑 SCI接收器结构 先写SCIBDH 0 x00 SC0ICR1 SCI0CR2 SCI0SR1 SCI0SR2 SCI0DRH SCI0DRL 第3节 SCI寄存器 波特率设置 SCIBDH SCIBDL ;如果分开则先写SCIBDH SCIBD 4000000/16/9600; SCIC1 7LOOPS LOOPS 1,送器出与接收器入内部接。 6 SCISWAI 0在等待模式下,SCI 运行,因而SCI可以作醒CPU中断的源。 1当CPU于等待模式,SCI停止。 5 RSRC 接收器源 只有 LOOPS位被置1,位才有意或有效。当LOOPS 1,接收器入与 送器出内部接。RSRC的作用是确定此接是否与TxD管脚接。 0此LOOPS 1,RSRC 0内部回送模式,TxD管脚不与送器出和接收器入接。 1此LOOPS 1,RSRC 1 SCI模式,TxD管脚与送器出和接收器入接。 4 M 9位或8位模式 0正常,起始位+8个数据位(首先是LSB)+停止位。 1接收器和送器使用9位数据字符。起始位+8个数据位(首先是LSB)+第9位数据位+停止位。 3 WAKE 接收器醒方法(一般用在多机理系中) 0空 醒。1地址位醒。 2 ILT 空 型 0空字符位数在起始位后启。1空字符位数在停止位后启。 1 PE 奇偶校使能使能硬件奇偶校生和。当奇偶使能,数据字符的MSB(第8或第9数 据位)被奇偶校位。 0无硬件奇偶校生和。1奇偶校被使能。 0 PT 奇偶校型如果奇偶校被使能(PE1),位用于偶校或奇校。偶校指的是数据 字符中1的数量(包括奇偶校位)偶数。奇校指的是数据字符中1的数量(包括奇偶校位) 奇数。 0偶校。1奇校。 第3节 SCI寄存器 SCIC2 7TIE 送中断使能(于状位TDRE) 0不启TDRE中断(使用方式)。1启TDRE中断,当TDRE志1,生硬件中断求 。 6TCIE 送完成中断使能(于TC) 0启TC中断,当TC志1,行硬件中断求;1不启TC中断(使用方式) 5RIE 接收器中断使能(于RDRF) 0不启RDRF中断(使用方式);1启RDRF中断,当RDRF志1,生硬件中断求 。 4ILIE 空中断使能(于IDLE) 0来自 IDLE 的硬件中断被禁止(使用方式)。1当 IDLE 志1,行硬件中断求。 3TE 送器使能0送器关; 1送器打开 2RE 接收器使能当SCI接收器关,RxD 管脚重新成通用目的端口I/O管脚。 0接收器关; 1接收器打开 1RWU 接收器醒控制可被改写1,用于将 SCI 接收器置等待状,等待中的醒条件足才工作 。醒条件由WAKE决定。用置 RWU后,醒条件足后,硬件会自清除 RWU。 0 SCI 接收器正常 工作; 1SCI接收器等待醒条件才工作。 0SBK 送中断向 SBK 写1再写0,会将中断字符(10位或11位的0)插正在送的数据流中。只要 SBK 1,附加的由10位或11位的0成的中断字符就插了数据流中。根据置和清除SBK 的 短 ,第二个中断字符可能也被插数据流中。 0正常送器操作。 1将中断字符(10位或11位的0)插正在送的数据流中。 第3节 SCI寄存器 SCIS1 7 TD RE 送数据寄存器空志复位,或者当数据从送数据冲器移到送移位器,TDRE自置1 ,了清除 TDRE, SCIS1 行操作,然后写 SCI 数据寄存器(SCID)。 0送数据寄存器(存区)。1送数据寄存器(存区)空。 6 TC 送完成志复位、或者当TDRE1,且没有数据、前符或中断字符正在被送,TC 被置位。 0送器正在工作(送数据、或中断)。1送器空(送操作束)。 TC1,通 SCIS1行操作,然后完成下列三件事情中的任何一件,可以自清除 TC 1)写 SCID,送新数据; 2)通将 TE 写0再写1,送一个前符; 3)通向 SCIC2 的 SBK写1,送一个中断字符。 5RD RF 接收数据寄存器志当一个字符从接收移位器至接收数据寄存器(SCID),RDRF 1 状。RDRF1 ,了清除 RDRF,要取 SCIS1然后再取 SCI 数据寄存器(SCID)。 4 IDLE 空 志在一个活周期后,当 SCI 接收在一个全字符周期内成空状,IDLE被置位 。当 ILT0,在起始位后,接收器开始空位的周期个数(即出了多少个空位)行数。因 此,如果接收字符都1,些位周期和停止位周期将一直被数,直到接收到的个数足了接收器所 需的、可以确定是一个空字符的条件。个条件是10位或是11位的“1”(是10位是11位取决于M 控制位)。当 ILT1,只有在停止位后,接收器才会启空位周期数。因此,前一字符最后的停 止位和任意高平位不会被入数范。要清除 IDLE,在 IDLE1 ,先取 SCIS1,再取 SCI 数据寄存器(SCID)。IDLE 被清除后,只有在一个新字符被接收且 RDRF被置后,IDLE 才可 以被再次置。即使接收在一个外周期内保持空状,IDLE 也能被置一次。 0无空 。1空被。 第3节 SCI寄存器 SCIS1 3OR 接收包志当一个新的字符准被移至接收数据寄存器, 先前接收到的 字符没从 SCID中走,OR被置位。此新字符(即相关 信息)将失。先取 SCIS1,再取数据寄存器(SCID)清除OR志。 0无包。 1接收包(新SCI 数据失)。 2NF 噪声志接收器起始位采7次,而其它数据位和停止位采3次。如果些采 不是完全一致,表示有噪声, RDRF被置位,NF也被置位。先取 SCIS1,再取 数据寄存器(SCID)清除 志。 0无噪声被 到。1当前 的SCID数据存在接受噪声,可能不可靠。 1FE 志当接收器在停止位 出的地方 到 0, 数据没 , RDRF 置位会同置位PE。先取 SCIS1,再取数据寄存器(SCID)清除 志 。 0无 被 到,但并不意味着没有 。1有 。 0PF 奇偶校 志当奇偶校使能(PE 1),但接收到的字符中的奇偶校位与所 期望的奇偶校 不一致,PF被置位。先取 SCIS1,再取数据寄存器(SCID)清 除 志。 0无奇偶校 。 1奇偶校 。 第3节 SCI寄存器 SCIS2 2 BRK13 中断字符度BRK13用于 更的中断字符度。 的 并不受位状 的影响。 0中断字符10位周期(如果 M1 11位) 1中断字符13位周期(如果 M1 14位) 0RAF 接收器激活志当 SCI 接收器 到一个有效起始位开始,RAF 被置位,并且, 当接收器 到一个空 ,RAF被自清除。在命令MCU停止模式前,此状 志可用于 是否有一个 SCI 字符正在被接收。 0 SCI接收器空,等待一个起始位。 1 SCI接收器激活(RxD入不空)。 第3节 SCI寄存器 SCIC3 7 R8 接收器的第9个数据位当 SCI 配置9个数据位(M1),R8可被 是第9个接 收数据位。在SCID之前取R8,因 取SCID操作会启 志清除程, 志清除后可能有新数据写入R8和SCID。 6 T8 送器的第9个数据位当 SCI 配置9个数据位(M1),T8 作第9个送数 据位,在写SCID之前写T8(如果T8需要写入新)。 5 TXDIR 模式下TxD 管脚方向当SCI 被配置 半双工操作(LOOPSRSRC1) ,位决定 TxD 管脚的数据方向。 0 模式下 TxD 管脚 入; 1 模式下 TxD 管脚 出。 4TXINV 送数据倒置置此位使得被送数据出的极性反。 30SCIS1中接收包、噪声、 、奇偶校出错中断允许设置。 0中断禁止; 1中断允许。 第3节 SCI寄存器 void InitSCIword baud_div { SCIBD Fbusclk/16/baud_div; //设波特率 //SCIC1 0 x00; } //end InitSCI // Freescale允许的波特率误差对于8bit数据传送是±4.5, // 于9bit数据传送是±4。 void SendCharchar s_char { byte dummy; //读取SCIS1的临时单元 SCIC2 0 x08; // 允许Tx dummy SCIS1; //清除TDRE SCID s_char; //清除TDRE第二步 whileSCIS1_TDRE{ //feedCOP; }; whileSCIS1_TC { //feedCOP; }; SCIC2_TE 0; } //end SendChar 第4节 SCI实验 一些小程序 char RecChar { byte rec_char; if SCIS1_RDRF //清除RDRF rec_char SCID; // 清除RDRF第二步 SCIC2_RE 1; // enable Rx whileSCIS1_RDRF{ //feedCOP; }; rec_char SCID; // get recieved character SendCharrec_char; // echo received character return rec_char ; } //end RecChar 接收字符 第4节 SCI实验 一些小程序 void SendMsgchar msg[] { byte ix0; // String pointer byte dummy; // 读取SCIS1 byte nxt_char; SCIC2 0 x08; // enable Tx dummy SCIS1; // 清除TDRE nxt_char msg[ix]; whilenxt_char 0 x00 { SCID nxt_char; // 清除TDRE第二步 nxt_char msg[ix]; whileSCIS1_TDRE{ //feedCOP; }; //delay30; } //end whileSCI1D whileSCIS1_TC{ //feedCOP; }; SCIC2_TE 0; } //end SendMsg 发送字符数组 第4节 SCI实验 一些小程序 实验要求根据3个基本函数,与超级终端构建用户通讯界面。 void SendCharchar s_char; char RecChar;void SendMsgchar msg[] 开机显示 Welcome to the MC9S08QG8 SCI Application Select Menu 1 LED On-Off one time 2 LED On-Off five times 3 LED On-Off always 4 LED Freeze number to cute 根据选择的数字,执行相应的功能, 可以使用RTI 。 第4节 SCI实验 实验步骤 1〉新建一个C工程; 2〉在中断允许之前,增加初始化代码,同时声明全局变量LedOnOffCnt PTBDD 0 xFF; SOPT1 0 x03; //stop COP,Enable RST SCIBD 4000000/16/9600; SRTISC 0 x16; //允许RTI中断,周期512ms LedOnOffCnt 0; 3〉在for死循环之前添加显示界面与菜单 SendMsg“\f Welcome to the MC9S08QG8 SCI Application\r\n“; SendMsg“Select Menu\r\n“; SendMsg“ 1 LED On-Off one time\r\n“; SendMsg“ 2 LED On-Off five times\r\n“; SendMsg“ 3 LED On-Off always\r\n“; SendMsg“ 4 LED Freeze\r\n“; SendMsg“number to cute “; 第4节 SCI实验 实验步骤 4〉在for死循环里面添加读取串口输入的switch case 结构 switch RecChar { case 0 x31 LedOnOffCnt 2; //亮灭1次 SendMsg“\r\nnumber to cute “; break; case 0 x32 LedOnOffCnt 10;//亮灭5次 SendMsg“\r\nnumber to cute “; break; case 0 x33 LedOnOffCnt 20;//一直亮灭 SendMsg“\r\nnumber to cute “; break; case 0 x34 LedOnOffCnt 0; //停止 SendMsg“\r\nnumber to cute “; break; default SendMsg“ Invalid selection“; SendMsg“\r\nnumber to cute “; break; } //end switch 第4节 SCI实验 实验步骤 5〉最后添加RTI中断服务子程序,根据LedOnOffCnt的数值,决定亮灭次数。 interrupt 23 void RTI_ISR { ifLedOnOffCnt0 { //freeze when cnt0 PTBD 0 xff; //change LED status ifLedOnOffCnt10{ //if not always LedOnOffCnt--; } } SRTISC 0 x56; //清除标志 } 第4节 SCI实验 实验步骤 6〉在主程序之前添加SCI的三个基本函数 //////***************发送字节 void SendCharchar s_char { byte dummy; //读取SCIS1的临时单元 SCIC2 0 x08; // 允许Tx dummy SCIS1; //清除TDRE SCID s_char; //清除TDRE第二步 whileSCIS1_TDRE{ //feedCOP; }; whileSCIS1_TC{ //feedCOP; }; SCIC2_TE 0; } //end SendChar 第4节 SCI实验 实验步骤 6〉在主程序之前添加SCI的三个基本函数 //*******************接收字节 char RecChar { byte rec_char; if SCIS1_RDRF //清除RDRF rec_char SCID; // 清除RDRF第二步 SCIC2_RE 1; // enable Rx whileSCIS1_RDRF{ //feedCOP; }; rec_char SCID; // get recieved character SendCharrec_char; // echo received character return SCID; } //end RecChar 第4节 SCI实验 实验步骤 6〉在主程序之前添加SCI的三个基本函数 //*******************发送字符串 void SendMsgchar msg[] { byte ix0; // String pointer byte dummy; // 读取SCIS1 byte nxt_char; SCIC2 0 x08; // enable Tx dummy SCIS1; // 清除TDRE nxt_char msg[ix]; whilenxt_char 0 x00 { SCID nxt_char; // 清除TDRE第二步 nxt_char msg[ix]; whileSCIS1_TDRE{ //feedCOP; }; //delay30; } //end whileSCI1D whileSCIS1_TC{ //feedCOP; }; SCIC2_TE 0; } //end SendMsg 第4节 SCI实验