历史上的今天
返回首页

历史上的今天

今天是:2025年08月19日(星期二)

正在发生

2021年08月19日 | SCI中断接收

2021-08-19 来源:eefocus

SCI 是全双工异步串行通信接口,主要用于 MCU 与其他计算机或设备之间的通信,几个独立的 MCU也能通过 SCI 实现串行通信,形成网络。 MC9S12XS128里有两个SCI(SCI0和 SCI1) 。设计 SCI 串口通信程序,主要是掌握八个寄存器,设置好初始化。


以下为SCI相关寄存器:

SCIBDH, SCIBDL寄存器


IREN(红外调制模式使能位) = 1 时,使能

= 0 时,禁止

TNP[0:1]:窄脉冲发射位

SBR[0:12]:波特率设置位

IREN = 1 时,SCI baud rate = SCI bus clock / (16 x SBR[12:0])

IREN = 0 时,SCI baud rate = SCI bus clock / (32 x SBR[12:1])


SCIDRH, SCIDRL寄存器


SCI 内部分别设有发送和接收两个数据寄存器,其低位都通过 SCIDRL 访问,读操作返回接收数据寄存器 RDR 的内容,写操作数据置入发送数据寄存器TDR。当 M=1 即运行在 9 位数据模式时,SCIDRL 和 SCIDRH 形成 9 位的 SCI数据字,这时必须先写入 SCIDRH,以便与低位字节(SCIDRL)一起进入发送移 位器。如果 M=0 即 SCI 只用于 7 位或 8 位的数据传送,可以只访问 SCIDRL。 当 PE=1 即奇偶校验允许时,奇偶校验位由硬件负责,无需软件干预。


R8:接收到的位 8,该位写操作无效。当 SCI 设置成 9 位数据运行模式时,该位是从串行数据流中接收到的第 9 位。


T8:发送位 8,任何时候可写。当 SCI 设置成 9 位数据模式时,该位是送到串行 数据流的第 9 位。该位不必为每个数据重新设置,每次发送可重复使用。


R[0…7]T[0…7]:收/发数据位 7-0,读操作返回只读寄存器 RDR 的内容,写操 作写入只写寄存器 TDR。


SCICR1寄存器


LOOPS: 在LOOP模式下,RXD引脚与SCI接收部分断开,发射部分输出在内部和接收部分相连接,此时RXD可作为普通IO口,TXD输出SCI信号

= 1 时, LOOP模式使能

= 0 时, 正常模式

SCISWAI:等待模式下 SCI 停止位

= 1 时:在等待模式下禁止 SCI

= 0 时:在等待模式下允许 SCI

RSRC:接收器信号源选择位,当 LOOPS=1 时,RSRC 决定接收器的内部反馈信号路径

= 1 时,接收器的输入连接到 TxD 引脚

= 0 时,接收器的输入在内部连接到发送器输出(并非 TxD 引脚)

M:方式选择位(选择字符帧格式)

= 1 时,1 个起始位,8 个数据位,第 9 个数据位,1 个停止位

= 0 时,1 个起始位,8 个数据位,1 个停止位

WAKE:唤醒选择位。

= 1 时,地址标志(最后一个数据位为 1)唤醒

= 0 时,介质空闲唤醒

ILT:空闲检测方式选择位,该位在 SCI 接收器可以使用的两种空闲检测方式中 选择一种。

= 1 时,保守检测,SCI 在停止位后才开始对“1”计数,因此最后一个字节的停止位以及该位以前的各个为“广的位,对检测的时间长短无影响

= 0 时,快速检测,SCI 在一个帧的开始位后立即开始对“1”计数,因此停止位以及停止位前面的任何“1”均被计算在内,这样可以提前检测到空闲状态

PE:奇偶校验允许位。

= 1 时,允许奇偶校验

= 0 时,禁止奇偶校验

PT:奇/偶校验选择位,如果奇偶校验允许,该位决定收发器使用奇校验还是偶校验。

= 1 时,选择奇校验

= 0 时,选择偶校验


SCICR2寄存器


TIE: 发送中断允许位,清 0 时禁止 TDRE 产生中断,若置 1 则允许 TDRE 位置 1 时产生 SCI 中断请求

TCIE:发送结束中断允许位,清 0 时禁止 TC 产生中断,若置 1 则允许 TC 位置1 时产生SCI 中断请求

RIE:接收中断允许位,清 0 时禁止 RDRF 和 OR 产生中断,若置 1 则允许 RDRF或 OR 置 1 时产生 SCI 中断请求

ILIE:空闲中断允许位,清 0 时禁止 IDLE 产生中断,若置 1 则允许 IDLE 位置1 时产生 SCI 中断请求

TE:发送允许位。该位由 0 置 1 时可用来发送空闲报头

= 1 时, 允许 SCI 发送部分工作,TxD 引脚(PSl/PS3)用于发送。

= 0 时, 发送器禁止

RE:接收允许位

= 1 时, 允许 SCI 接收器工作。

= 0 时, 接收器禁止

RWU:接收器唤醒控制位

= 1 时,允许唤醒功能,禁止接收器中断。通常,硬件通过自动清除该位来唤醒接收器

= 0 时,SCI 接收器正常工作

SBK:中止符发送允许位。只要该位保持为 1,发送器就不停地发出“0”;如果 变为 0,当前的全“0”帧发送结束后,TxD 引脚将变成空闲状态。如果 SBK 开 关一次,发送器将只发出 10(11)个“0”,然后复原,处于空闲或发送数据状态

= 1 时, 产生中止符,至少 10 或 11 个连续的“0”

= 0 时, 中止符产生器关闭


SCISR1寄存器


TDRE: 发送保持器空标志位。发送前必须读 SCISR1,并确认 TDRE=1,然

后将新的数据写入发送保持器以开始发送过程。复位后该位为1

= 1 时,发送保持器的数据已被传送到发送移位器,这时可以向发送保持器写入

新的数据

= 0 时,SC0DR 处于忙状态

TC: 发送结束标志。该位在发送器空闲(无发送动作)时置位。读 SCISRl,然

后写 SCIDR将清除该位

= 1 时,发送器空闲

= 0 时,发送器忙

RDRF:接收数据就绪标志。当收到的字符已经在SCIDR中就绪时,RDRF置 1,

顺次读取 SCISRl 和 SCIDR将会自动清除 RDRF。该位被清除后,必须等到 RxD

线变为活动,然后重新变成空闲以后,IDLE位才会被再次置 1

= 1 时,SCIDR 中数据已就绪

= 0 时,SCIDR 空。

IDLE: 空闲标志。检测到接收器 RxD 端空闲(收到 10 或者 11 个以上连续的

“1”)。当 RWU 位为 1 时,空闲状态不会使该位置 1。该位被清除后,必须等

到 RDRF置位(RxD线变为活动,然后重新变成空闲),IDLE位才会被再次置 1。

= 1 时,RxD线空闲

= 0 时,RxD线活动

OR:重叠错误标志。如果接收数据寄存器中的数据尚未读取(RDRF=1),接受移

位寄存器又准备向其传送新的数据,则称为重叠错误,该位被置1。必须清除该

位,才能使新的数据进入接收数据寄存器

= 1 时,出现重叠错误

= 0 时,无重叠

NF:噪声错误标志。噪声错误出现时,该位与 RDRF 在同一个周器内置位,但

如果同时或已经出现重叠错误,该位不置位

=1 时,在起始位、数据位或停止位接收期间检测到噪声

= 0 时,采样结果一致

FE:帧格式错误。如果在应该出现停止位的时刻,检测到0,则该位置位。顺次

读取寄存器 SCISRl 和 SCIDR 将清除 FE标志

= 1 时,在预期的停止位处检测到 0

= 0 时,检测到停止位

PF:奇偶错误标志。指示收到数据的奇偶性与校验位是否一致。奇偶校验允许

(PE=1)时,该标志才有意义。所要求的奇偶性由 SC0CR1 中的 PT位决定

= 1 时,奇偶校验错误

= 0 时,奇偶校验正确


SCISR2寄存器


AMAP:另类地图该位控制寄存器共享相同的地址空间进行访问。在复位状况的SCI的行为与以前的版本。 AMAP= 1,允许访问另一套控制和状态寄存器和隐藏的波特率和SCI控制寄存器

TXPOL:发送极性该位控制传输数据的极性。 NRZ的格式,一个是代表一个标记和一个零代表为正极性空间,相反的极性相反。在IrDA格式,零代表在中间位时间由短而高的脉冲其余为正常的闲置低,在中间的一个为闲置高有点剩余时间短的低脉冲极性,是代表一个零极性反相。

= 1 时,极性相反

= 0 时,正常模式

RXPOL :接受极性

= 1 时,极性相反

= 0 时,正常模式

BRK13:中止符长度控制位

= 1 时,中止符长度为 13 或 14 位

= 0 时,中止符长度为 10 或 11 位

TXDIR:单线模式下发送管脚数据方向控制位

= 1 时,单线模式下 TxD 脚用于输出

= 0 时,单线模式下 TxD 脚用于输入

RAF:接收器活动标志位。反映接收器是否处于活动状态。在搜索起始位的RT1

期间该位置 1,当接收器器检测到空闲状态或者出现一个伪起始位(通常由于噪

声或波特率匹配错误引起)时,该位清0。该位由接收器前端控制


以下为SCI中断接收的完整代码:

#include            

#include "derivative.h"      


#define LED PORTB_PB0         //定义连接发光二级管的PORTB_PB0口数据寄存

                              //器为LED,写'0'亮,写'1' 灭

#define LED_dir DDRB_DDRB0    //定义连接发光二级管的PORTB_PB0口方向寄存器

                              //为LED_dir,写'0'做输入口,写'1'做输出口

#define LED_ON 0              //LED点亮

#define LED_OFF 1             //LED熄灭

#define BUS_CLOCK    32000000     //总线频率

#define OSC_CLOCK    16000000     //晶振频率

#define BAUD 9600                   //串口波特率


unsigned char data_receive;   //定义SCI接收数据变量



void INIT_PLL(void)          //初始化锁相环

{   

   

   CLKSEL_PLLSEL=0;         //内部总线时钟来源于外部晶振

           

   PLLCTL_PLLON=0;  //关闭PLL


   SYNR=0x40 | 0x03;

   

   REFDV=0x80 | 0x01;

             

   POSTDIV=0x00;  //PLL为64MHz   


   PLLCTL_PLLON=1;  //打开PLL


   _asm(nop);         

   _asm(nop);       //执行2个机器周期

   while(CRGFLG_LOCK==0); //根据CRGFLG寄存器的LOCK位,确定PLL是否稳定 LOCK==1 稳定,==0 不稳定  

   CLKSEL_PLLSEL =1;     //选择PLL作为时钟源        

}



void INIT_SCI(void)     //初始化SCI

{


  SCI1BD = BUS_CLOCK/16/BAUD;  //设置SCI0波特率为9600

  SCI1CR1 = 0x00;              // LOOPS=0 正常模式

                               // SCISWAI=0:在等待模式下允许 SCI

                               // RSRC=0:当 LOOPS=1 时,接收器信号源选择位

                               // M=0:方式选择位 0:1 个起始位,8 个数据位,1 个停止位

                               // WAKE=0:唤醒选择位0:介质空闲唤醒

                               // ILT=0:空闲检测方式选择位0:快速检测

                               // PE=0:奇偶校验允许位0:禁止奇偶校验

                               // PT=0:奇/偶校验选择位(在PE=1时有效)

                               //设置SCI0为正常模式,八位数据位,无奇偶校验

  SCI1CR2 = 0x2c;              //允许发送数据,允许接收中断功能 

                               //TIE=0:发送中断允许位 0:禁止

                               //TCIE=0:发送结束中断允许位0:禁止

                               //RIE=1:接收中断允许位  1:允许

                               //ILIE=0:空闲中断允许位 0:禁止

                               //TE=1:发送允许位 1:允许 SCI 发送部分工作,TxD 引脚(PSl/PS3)用于发送

                               //RE=1:接收允许位 1:允许SCI接收

                               //RWU=0:接收器唤醒控制位 0:正常模式

                               //SBK=0:中止符发送允许位 0: 中止符产生器关闭

}




void SCI_send(unsigned char data)     //串口发送函数

{

  while(!SCI1SR1_TDRE);       //等待发送数据寄存器为空

  SCI1DRL = data;             //把数据放入SCI数据存储器

}


unsigned char SCI_receive(void)         //串口接收函数

{

  while(!SCI1SR1_RDRF);          //等待发送数据寄存器满

  return(SCI1DRL);               //返回接受的数据

}



#pragma CODE_SEG __NEAR_SEG NON_BANKED   //中断函数置于非分页区内

void interrupt VectorNumber_Vsci1 receivedata(void)     //串口中断接收函数

{

    data_receive = SCI_receive();   //将SCI接收的数据传送给data_receive变量

    if(data_receive == 'O')         //如果接收的数据为'O'时,LED点亮

    {                 

      LED = LED_ON;                 

    }

    if(data_receive == 'C')         //如果接收的数据为'C'时,LED熄灭

    {

      LED = LED_OFF;                

    }

}


#pragma CODE_SEG DEFAULT   //后续代码置于默认区域内  



void main(void) 

{

  DisableInterrupts;     //禁止打开所有中断

  INIT_PLL();            //初始化PLL模块,设置busclock=32Mhz

  INIT_SCI();            //初始化SCI模块

  LED_dir = 1;           //LED接口PB0设置为输出口

  EnableInterrupts;      //允许打开所有中断  

  LED = LED_ON;          //初始化LED初始状态为亮



  for(;;) 

  {} 

}


通过USB转串口模块,用电脑的串口调试助手发送数据给单片机,具体的接线实物图如下(USE转串口的TXD接S2,RXD接S3)
在这里插入图片描述
发送大写字母“O”时,指示灯变亮;
发送大写字母“C”时,指示灯熄灭;
发送其他任意字符,指示灯无变化。
在这里插入图片描述

推荐阅读

史海拾趣

AXSEM公司的发展小趣事

由于AXSEM公司在电子行业的具体发展故事细节可能涉及到公司内部资料,并且不易公开获取,因此难以提供五个具体的故事。不过,可以依据公开信息,尝试概述AXSEM公司的发展概况和可能的发展故事线索。

故事一:创立与早期发展
AXSEM公司成立于2000年,自创立之初,就专注于无线射频技术的研发与创新。在创始人及团队的共同努力下,公司成功开发了多个高容量通信射频集成电路,如SigFox、EnOcean等,这些技术在当时的物联网和无线通信领域具有前瞻性。公司凭借其技术优势,逐步在市场中树立了良好的口碑,为后续的发展奠定了坚实的基础。

故事二:技术突破与市场拓展
随着无线通信技术的快速发展,AXSEM公司不断突破技术瓶颈,推出了一系列具有创新性的产品。这些产品不仅支持物联网、自动抄表、家庭自动化等领域的应用,还广泛应用于传感器网络和卫星通信市场。公司凭借这些产品,成功拓展了市场份额,实现了业务的快速增长。

故事三:战略合作与资源整合
为了进一步提升技术实力和市场竞争力,AXSEM公司积极寻求与其他企业的战略合作。通过与其他知名企业的合作,公司成功整合了资源,优化了产品线,提高了生产效率。同时,这些合作也为公司带来了更多的市场机会,推动了公司的持续发展。

故事四:国际化发展与品牌提升
随着业务的不断拓展,AXSEM公司开始将目光投向国际市场。公司积极参与国际展览和交流活动,与全球客户建立了广泛的联系。通过不断提升产品质量和服务水平,公司的品牌知名度和美誉度逐渐提升,为全球客户提供了更加优质的产品和服务。

故事五:未来展望与创新驱动
面对未来电子行业的快速发展和变革,AXSEM公司将继续坚持创新驱动的发展战略。公司将加大研发投入,不断推出具有创新性和竞争力的新产品。同时,公司还将积极拓展新的应用领域和市场,为全球客户提供更加全面和高效的解决方案。

请注意,以上仅为基于公开信息的AXSEM公司发展故事的概述,并未涉及具体的事实细节。如需了解更多关于AXSEM公司的故事,建议查阅公司官方网站、行业报告或相关新闻报道。

DMS Electronic Components, Inc公司的发展小趣事

DMS在追求经济效益的同时,也积极履行社会责任。公司注重环境保护和资源节约,采用环保材料和工艺进行生产。同时,DMS还积极参与公益事业和社会活动,为社会做出了积极贡献。这些举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了基础。

请注意,以上故事是基于对电子行业和DMS公司业务范围的推测和构想,并不代表DMS公司真实的发展历程。如需了解更多关于DMS公司的具体信息,建议查阅公司官方网站或相关新闻报道。

ASM公司的发展小趣事

在集成电路商业化发展的黄金时期,ASM公司凭借其在硅材料领域的深厚积累,不断推出创新产品,满足市场日益增长的需求。公司通过杂志、展会等营销工具,积极推广其产品和服务,逐渐在行业内树立了良好的口碑。同时,ASM公司还不断拓展其业务领域,从最初的半导体材料供应逐渐扩展到更广泛的电子材料和设备领域。

Broyce Control公司的发展小趣事

进入21世纪,Broyce Control已经成为电气和电子产品设计、制造和供应领域的佼佼者。公司不仅在技术上持续创新,还注重与行业伙伴的合作与交流。通过参与国际标准的制定和推广,Broyce Control逐渐在行业内树立了领导地位。同时,公司还积极承担社会责任,推动可持续发展和环保理念的实践,为行业的健康发展做出了积极贡献。

Electronic Concepts Inc公司的发展小趣事

随着公司规模的不断扩大,ECI越来越重视团队建设。公司高层认识到,一个团结、高效的团队是企业持续发展的关键。在人力资源部经理刘女士的策划下,ECI开展了一系列团队建设活动,如拓展训练、员工分享会等。这些活动不仅增强了员工的凝聚力,也提升了员工的工作效率和创新能力。

Gould Ami公司的发展小趣事
水泵启动或停止后,水位会发生变化,传感器再次检测水位并反馈给控制电路,形成闭环控制,确保水位稳定在设定范围内。

问答坊 | AI 解惑

使用VxWorks时出现了问题,请教各位,给点儿建议!cpu是MPC862

自己编了个小程序,在Tornador里结合VxWorks一起. 程序很简单,就是读存储器! xd0 = *(unsigned int *)(SDRAM_ADR); xd1 = *(unsigned int *)(BOOTFLASH_ADR); xd2 = *(unsigned short int *)(FLASH_ADR); 我的存储器有三种,一个是SDRAM,32位;一 ...…

查看全部问答>

提供bc++45下载,想下的同学抓紧了~

最近开始学习\"劭贝贝\"的,里面的例子需要bc45,费了好大劲终于找到了.现提供连接如下:           borland c++ v4.5 Part3 http://www.tomore.com/3/23811.html           borland ...…

查看全部问答>

热地和冷地,你听过吗?

热地:开关电源无需使用变压器,其开关电路的“地”和市电电网有关,既所谓的“热地”,它是带电的 冷地:由于开关电源的高频变压器将输入、输出端隔离;又由于其反馈电路常用光电耦合、既能传送反馈信号又将双方的“地”隔离;所以输出端的地称之 ...…

查看全部问答>

【晒经典】集成运算放大电路篇

本帖最后由 dontium 于 2015-1-23 11:43 编辑 本帖主要回顾集成运放在电路中的使用,即集成运算放大电路,前两贴作为此贴的基础,我采用循序渐进的阐述方法   1.F007放大电路   F007是通用型集成运放,它由正负15V两路电源供电。从+ ...…

查看全部问答>

飞思卡尔单片机与rf905的通信spi通信问题

我是一个新人,对飞思卡尔单片机使用的不是很熟,最近在使用飞思卡尔128单片机和nrf905之间做一个无线传输的小协议,选择飞思卡尔为主机模式,并且作为接收终端,用于接收我的发送数据。我的发送端是用51做到已经好使了,没有问题了(发送端暂且不 ...…

查看全部问答>

请求 继续团购 MSP430 LaunchPad MSP-EXP430G2 25元不用包邮啊

请求 继续团购 MSP430 LaunchPad MSP-EXP430G2  25元不用包邮啊 30元 也可以试试 [ 本帖最后由 ppiicc 于 2012-5-3 22:53 编辑 ]…

查看全部问答>

常用晶振封装尺寸

画430PCB的时候,发现以前没做过32768Hz的手表晶体的封装,然后再网上找到这样一个有很多晶振封装的网页,转成了PDF跟大家分享下。 …

查看全部问答>

protel99se软件

小弟想学习线路板设计,谁有protel99se 的软件,帮帮忙给上传一份…

查看全部问答>

晒设计方案+STM32F429i开发板之未完成部分

     这个算是个遗憾帖吧。     本来还准备了两个实验,但鉴于时间问题,不能在活动结束前完成了。不过等做完我会来让大家看看的。      其中一个是GPS的实验,模块已经买回来了,只 ...…

查看全部问答>

寻求AD13中如何在同个内电POWER层中划分多个电源网络?

新手第一次画4层PCB板,目前已初步弄懂了plane和layer的区别,但看到一些高手绘制的多层板中,可以在同一个power内电层上划分不同的电源网络,比如在power内电层上,划分+3.3v,+5v,+12v等电源。但在实际练习中,新增一个power层,导入PCB封装后,双 ...…

查看全部问答>