完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>
前 言
随着DSP芯片功能的增强,已不再进行单纯的数字信号处理任务,而是作为一种MCU被广泛使用,控制板上各种资源,同时完成采集、计算、控制、通讯等任务。特别是当使用了TCP/IP或其它复杂通讯协议时,没有一个实时多任务操作系统是很难进行任务调度的。μC/OS-II作为一种源码公开的占先式实时多任务操作系统,总是执行处于就绪状态的优先级最高的任务,并支持Semaphore(信号量)、Mailbox(邮箱)、Message Queue(消息队列)等多种常用的进程间 通信机制,是大多数高可靠嵌入式设备的首选。 2 开发环境简介 APCI5096是北京康拓工业电脑公司自行开发的一款DSP目标板,主要用于对模拟信号量的采样处理。该目标板以TMS320VC32为CPU,同时具有完备的输入/输出功能,可以实现30通道、16位、300KSPS的模拟输入。调试用编译器为 ti公司的Code Composer ‘C3x-‘C4x,版本是4.10版。 3 移植过程 3.1 μC/OS-II系统结构 图1说明了μC/OS-II的软硬件体系结构。应用程序软件处于整个系统的顶层,只和μC/OS-II与处理器无关的代码以及μC/OS-II与应用相关的代码关联。这样保证了应用软件的可重用性。 μC/OS-II与处理器无关的代码提供了μC/OS-II的系统服务。利用这些API函数,应用程序可以进行内存管理、任务间的通信以及创建、删除任务等。μC/OS-II与应用相关的代码提供了对μC/OS-II本身的裁减,并可根据实际需要进行任务数、任务栈的大小等设置。 大部分的μC/OS-II代码是使用ANSI C语言书写的,因此μC/OS-II的可移植性较好。尽管如此,仍然需要使用C和汇编语言写一些处理器相关的代码。移植工作需要改写的是与处理器相关的代码,包括三个文件:OS_ CPU.H、OS_ CPU_ CC、OS_ CPU_ AASM。重点是任务堆栈的初始化、任务切换时栈指针的调整。 3.2 OS_ CPU.H 在不同的处理器中有不同的字长,所以必须重新定义一系列数据类型以确保移植的正确性。在OS_ CPUH文件中应完成:数据类型的重新定义、堆栈数据类型的定义、堆栈增长方向的定义、临界区开/关中断的方法、任务切换函数OS_TASK_SW的宏定义。 (1)数据类型的声明:在VC33中所有的整型数据(char、short、int、long)为相同的类型,用32位表示。浮点型数据(float、double)为相同类型,在VC33中用32位单精度浮点数表示。数据类型的重定义: typedef unsigned char BOOLEAN; typedef unsigned char INT8U; typedef signed char INT8S; typedef float FP32; typedef double FP64; (2)VC33栈的数据宽度为32位,采用上面重定义过的数据类型进行定义,确保栈数据类型的一致性。栈的数据类型声明: typedef INT32U OS_ STK; (3)μC/OS-II访问代码的临界区时需要先禁止中断,并且在访问完毕后重新允许中断。μC/OS-II利用两个宏来禁止和允许中断,通过状态寄存器的中断使能位开关中断。 cregister unsigned int ST; /*声明CPU内部寄存器*/ #define OS_ ENTER_ CRITICAL() asm(“ANDN 2000H, ST "); /*清中断使能位*/ #define OS_ EXIT_ CRITICAL() asm(“OR 2000H, ST "); /*置中断使能位*/ 3.3 OS_ CPU_ C.C 在OS_ CPU_ C.C文件中主要完成的是OSTaskStkInit()函数,其余五个函数可以不进行处理。OSTaskStkInit()函数完成任务栈的初始化,使得任务栈的结构看起来如同在任务执行过程中发生过一次中断并将所有寄存器保存到堆栈一样。不同的编译器在函数调用时会有不同的入栈方法,如:参数和返回地址入栈顺序、参数之间入栈的顺序、参数利用寄存器还是堆栈保存等。在具体实现时还需要根据编译器的要求进行调整。 CCS函数调用时堆栈规则为:先将参数从左往右入栈、然后是函数返回地址入栈。依照此规则设计任务栈初始结构如图2。VC33共有28个寄存器,程序中应将寄存器全部入栈,在OSTaskStkInit中实现: { OS_ STK *stk; /*定义栈的数据结构*/ opt=opt; stk=(OS_ STK *)ptos; /*装入栈顶指针*/ *stk=(OS_ STK)pdata; /*参数入栈*/ *++stk=(OS_ STK)task; /*任务返回地址*/ *++stk=(OS_ STK)task; /*中断返回地址*/ *++stk=(OS_ STK)0x2000; /*状态寄存器,开中断*/ 其余CPU寄存器全部入栈,并初始化为0 } 3.4 OS_ CPU_ A.ASM 在OS_ CPU_ AASM文件中要求用户编写四个简单的汇编语言函数:OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()、OSTickISR()。这四个函数具有完全相同的公共部分:寄存器入栈和寄存器出栈。只要按照上面设计好的栈结构进行就可以了。注意的是VC33的R0到R7是扩展精度寄存器,具有40位。在入栈和出栈时均需要用两句话完成,如下: 入栈: 出栈: PUSH R0 POPF R0 PUSHF R0 POP R1 而OSIntCtxSw函数具有特殊部分,该函数用于从中断返回时进行任务切换,由于在调用_ OSIntCtxSw函数前已经发生了中断,中断服务程序已经将CPU寄存器保存到堆栈中了,所以此处不再进行寄存器保存。同时还要进行栈指针的调整,去掉堆栈中一些不需要的内容,然后再将寄存器全部出栈。由于该函数是μC/OS-II中唯一的与编译器相关的函数,所以在移植后必须利用多次任务切换检查栈指针是否正确调整。 3.5 时钟中断源初始化 μC/OS-II还要求用户提供一个时钟资源,用于实现时间延时和确认超时。根据APCI5096的硬件设置,需要在三个文件中进行时钟资源的设置。 (1)OS_ CPU_ AASM: APCI5096中,已将VC33的定时器1用于测频通道,因此利用未被占用的定时器0产生定时中断。实现方法为在TINT0的中断向量入口处放一跳转指令,跳转到自己写的OSTickISR。 sect “TINT0_ vector" TINT0 br _ OSTickISR (2)CMD文件 将TINT0跳转到OSTickISR后,还应再指定TINT0的向量入口地址。APCI5096板上的VC33被设置为BootLoader方式,在该方式下TINT0的入口地址固定在0x809FC9。在CMD文件的SECTIONS段指定如下: TINT0_ vector: 0x809FC9 (3)MainC文件 μC/OS-II要求用户在OSStart()运行后,μC/OS-Ⅱ启动运行的第一个任务中初始化节拍中断。自己编写一个函数TimerInit(),并在第一个任务开始处调用该函数完成定时器0的初始化。函数中TIM0_ XXX代表的是定时器0的三个寄存器的地址,在完成对定时器0的设置后还要打开全局中断和时钟中断。 { *TIM0_PRD= 0x7530; /*设置周期为1KHZ*/ *TIM0_CNT=0; *TIM0_CTL=0x2C1; /*启动时钟*/ ST|=0x2000; /*打开中断*/ IE|=0x100; /*打开时钟中断*/ } 4 测试、编写驱动和应用程序 做完以上工作以后,就要测试移植是否成功。最初测试时,可以先运行操作系统本身,调度一些简单的任务和时钟节拍中断任务。主要测试系统本身的正确性,如果调试成功就可以在上面继续开发驱动程序和添加应用程序。 参考文献 1 JEAN J.LABROSSE著,邵贝贝译.μC/OS-II-源码公开的实时嵌入式操作系统.北京:中国电力出版社,2001. 2 Texas Instruments.TMS320C3x User's Guide. http://www.ti.com.cn/support/ tech.doc.asp,1997. 3 Texas Instruments.TMS320C3x Assembly Language Tools User's Guide. http:// www.ti.com.cn/support/techdoc.asp,1997. 4 Texas Instruments.TMS320C3x Optimizing C Compiler User's Guide. http:// www.ti.com.cn/support/techdoc.asp,1997. 异步收发器TL16C554及其在惯性导航系统中的应用 范磊 缪玲娟 郭振西 (北京理工大学,北京 100081) 摘 要 介绍了四通道异步收发器TL16C554芯片的内部结构、主要特点和工作原理,及其在惯导系统中应用的硬件接口 电路与软件实现的基本思想。 关键词 异步收发器(UART),TL16C554, 单片机 UART TL16C554 and Its Application in Inertial Navigation System Fan lei Miao Lingjuan Guo Zhenxi (Beijing Insititute of Technology,Beijing 100081) Abastract The paper describes the internal structure,main characteristic and work principle of the four-channel universal asynchronous receiver and transmitter TL16C554The basic idea of software realization and the hardware interface circuit applied in the intertial navigation system are also introduced Keywords Universal asynchronous receiver and transmitter(UART), TL16C554,Single chip processor 1 引 言 随着惯导技术的发展,惯导系统需要接收GPS、北斗双星、高程计等较多的RS-232、RS-422、RS-485串口信号。这样,惯导系统原有的串口通道不足以接收如此多的串口信号,因而需要进行串口扩展。Ti公司生产的异步收发器TL16C554芯片是进行串口扩展的较好的选择,它有四个通道,可以与四路串行信号通信,解决了原来的惯导系统串行信号接口短缺的问题,其每个通道都带有两个16字节的FIFO(First In First Out 先进先出)缓冲器,其中一个用于接收数据,另外一个用于准备发送的数据。当工作在FIFO模式下时,不必每接收或发送一帧数据就产生一次中断,因而可以减少中断发生的次数,提高接收发送串行信号的效率与可靠性。 2 主要特点 TL16C554的主要特点如下: 由四个带有逻辑控制的TL16C550异步通信单元组成; 最高可达1M的波特率,具有可编程的波特率发生器,便于灵活选择数据收发频率; 具有16字节的收发FIFO缓冲器; 具有可独立控制的发送、接收、线路状态和MODEM状态中断; 具有全双工的接收发送线路,可独立进行接收发送控制; 全面的线路状态报告功能; 充分分级的中断系统控制; 三态TTL电平输出。 3 内部结构及工作原理 四通道异步收发器集成芯片TL16C554有64脚TQFP和68脚PLCC两种封装形式。其中68脚PLCC封装形式支持68(Motorola)模式。因此,能够很容易的与Motorola微处理器互联, TL16C554的内部结构如图1,其引脚说明见表1。 3.1 系统I/O总线 TL16C554的数据线(D0-D7)可直接与CPU的数据总线的低八位相连,它们是UART的数据输入和输出通道,其读写操作由数据输入和输出选通线来区分,通过这些选通线可实现UART与CPU之间的双向通信,TL16C554还可自由选择16模式(Intel总线)或68模式(Motorola总线),它有四个串行接口,各有其独立的收发功能。 3.2 时钟 TL16C554的参考时钟既可以由外部提供,也可以通过一个晶振在内部产生。 3.3读/控制逻辑 UART与CPU之间通过一组信号线实现通信控制,这组信号线包括复位控制RESET、芯片允许、寄存器允许中断请求INT(A-D)、读出数据有效和写入数据有效等。 3.4 MODEM逻辑控制 MODEM控制逻辑主要用于完成UART与RS-232C之间的接口通信,这些信号通过EIA驱动器驱动后均符合RS-232C标准,MODEM控制逻辑信号包括以下八种: RX(A-D)串行输入,相当于接收数据RxD; TX(A-D)串行输出,相当于发送数据TxD; (A-D)数据设备就绪输入; (A-D)数据终端就绪输出; (A-D)请求发送输入; (A-D)清除发送输入; (A-D)载波信号检测输入; (A-D)振铃指示输入。 3.5 主要寄存器 TL16C554中的主要寄存器有波特率除数寄存器、线路控制寄存器(LCR)、线路状态寄存器(LSR)、中断允许寄存器(IER)、中断标识寄存器(IIR)、MODEM控制寄存器(MCR)、MODEM状态寄存器(MSR)、发送保持寄存器(THR)和接收缓冲寄存器(RHR)等。 4 TL16C554与单片机的接口 在惯导系统中,80C196单片机通过异步收发器TL16C554用来频繁地接收GPS、双星、高程计等串行信号,此外,还要完成其他诸如温控、与上位机通信等任务。因此,如果采用查询方式接收串行信号,无疑会浪费大量的CPU时间,加重CPU的负担,显然是不可行的。而中断方式则不占用CPU时间,加之使用16字节FIFO缓冲器,可减少中断次数,提高数据接收的实时性与可靠性,因此,在此系统中选用了中断方式。 图2给出了TL16C554与单片机80C196的接口电路,可以同时接收四路RS-232或RS-485串行信号,四路串行信号经过电平转换后进入TL16C554,TL16C554的每一路串口收发数据时,会触发中断信号。四路串口信号中的每一个中断信号都将通过EXINT引起单片机的外部中断,单片机通过中断服务程序收发数据。当中断服务程序接收到一次中断后,它仅仅知道的是TL16C554产生了中断,而不知道是哪个串口产生了中断,为了确定中断口,必须检查P0.0~P0.3,同时对不同的中断口进行不同的中断处理。需要特别注意的是,由于EXINT中断请求信号为脉冲上升沿触发,而非高电平触发。所以在中断服务程序开始,必须置P1.0~P1.3为低,在中断服务期间屏蔽其他中断,在中断服务结束后,置P1.0~P1.3高,开放其他中断,这样在处理一路串行信号中断服务期间,可以防止其他路串行信号中断请求服务的遗漏。对TL16C554的内部寄存器的寻址则通过地址线AD12-AD14片选完成。软件流程图3如下: 实验表明,上述软硬件设计可以实现四路串行信号的可靠及时异步收发服务,可以满足惯导系统的要求。 参考文献 1 TI TL16C554 Data Sheet. 2 刘乐善,叶济忠,叶永坚.微型计算机接口技术原理及应用.华中理工大学出版社. 3 孙涵芳.Intel 16位单片机.北京航空航天大学出版社. MCU串行异步通信的几种实现方法与编程实例 蒋建武 王怀宜 章建民 (苏州大学计算机科学与技术学院,苏州 215006) 摘 要 以Motorola M68HC08系列MCU为实现载体,提出了利用一片MCU实现多个串行通信口的方法,即利用MCU本身的SCI模块实现串行异步通信、利用I/O口进行模拟串行异步通信、利用定时器模块的输入捕捉和输出比较功能进行模拟串行异步通信;分析比较了这几种实现方式的特点,给出了具体实现的子例程及应用方法。 关键词 串行异步通信,M68HC08系列MCU,输入捕捉,输出比较 Implementation and Programming Example of Serial Asynchronous Communication For MCU Jiang Jianwu Wang Yihuai Zhang Jianmin (College of Computer Science and Technology of Soochow University, Suzhou 215006) Abstract In this paper, implementations of several serial asynchronous communication interfaces on a chip of MCU have been mentioned based on Motorola M68HC08 MCUs. They are SCI interface module, I/O interface module, and timer interface module. At the same time ,the Characteristics of these three implementations are been analyzed and compared each other. The programming examples and application method are been given. Keywords Serial Asynchronous Communication, M68HC08 MCUs, Input Capture,Output Compare 1 引 言 在嵌入式MCU的应用系统中,不可避免地要和各种设备进行通信,特别是串行异步通信使用较多。因而串行异步通信作为MCU的基本功能之一就显得尤为重要。然而,大部分的MCU芯片,只提供了一个SCI模块,这对于要求同时和两个或两个以上设备进行通信时就不能满足了。本文将以一种具体的MCU为基础,探讨这一问题的基本解决方案。Motorola公司作为全球市场占有率第一的MCU生产厂商,将成熟的Flash存储器技术及锁相环技术等引入了微控制器,推出了新一代8位微控制器M68HC08系列,具有速度快、功能强、功耗小及价格低等优点。该系列于2000年初开始在我国陆续进入市场,目前已有60多个品种上市,主要有AZ、MR、GP、JL、JK等子系列,适用于不同的嵌入式应用领域,2002年又推出了一款廉价的面向小型应用的Q系列。由于Motorola公司的新系列MCU溶入了许多最新发展的MCU制造技术,且品种齐全,新型号还将不断推出,必将在我国获得广泛应用[1]-[3]。本文基于M68HC08系列MCU,讨论利用一片MCU实现多串行通信口的方法。它们是:(1)利用MCU本身提供的可编程SCI模块。M68HC08系列的各个MCU具体型号,绝大多数提供一个SCI模块,部分提供两个SCI模块。(2)利用基本输入输出口采用扫描方式进行模拟串行异步通信。(3)利用定时器模块的输入捕捉和输出比较功能采用中断方式进行模拟串行异步通信。分析比较了这几种实现方式的特点,并给出了实现方式的完整子程序,具有明确的入口、出口,可供读者直接使用。 2 串行异步通信工作方式的基本原理 在异步传输中,每一个字节的8位数据编码为一脉冲序列,在其前后分别加上起始脉冲和结束脉冲即构成了传送一字节数据的完整脉冲序列。传送前,线路空闲保持高电平状态;传输时,首先由一个起始脉冲开始(通常为低电平),脉冲长度为传送一位数据的时间,然后数据脉冲序列紧跟其后,数据脉冲序列传送结束后再发送一位或几位结束脉冲(通常为高电平);传送结束后,线路再次空闲又保持高电平状态,当有下一位低电平脉冲到来即表明下一数据传输的开始。如果传输中使用奇偶校验,则在数据脉冲后面再加上一位的奇偶校验位,然后再发送结束位[4]。见图1所示。 3 串行异步通信方法1——SCI模块方式 在M68HC08系列芯片中基本串行通信功能是通过SCI模块实现的。系统提供了7个相关的寄存器:3个控制寄存器(SCC1,SCC2,SCC3),2个状态寄存器(SCS1,SCS2),1个数据寄存器(SCDR),1个波特率寄存器(SCBR)。以上各寄存器的具体定义在各种介绍M68HC08系列单片机的书中均有介绍。下面将以在19200bps波特率下发送和接受一位数据为例,介绍一下如何利用SCI模块来实现串行异步通信[5]。 (1) 口地址定义 SCC1 EQU 0013 ;SCI控制寄存器1 SCC2 EQU 0014 ;SCI控制寄存器2 SCBR EQU 0019 ;SCI波特率寄存器 SCS1 EQU 0016 ;SCI状态寄存器1 SCDR EQU 0018 ;SCI数据寄存器 (2) 串行口初始化 1)定义波特率,设准备定义为19200: LDA #%00000101 ;例如:fBUS=2.4576MHz, ;取PD=1(即SCP1、SCP0=00) STA SCBR ;BD=2(即SCR2、SCR1、SCR0=001), ;则波特率=2457600 /(64*1*2) = 19200 2)写控制字到SCI控制寄存器1(SCC1),设置数据长度、输出格式、选择唤醒方法、是否校验等: LDA #%01000000 ;D6(ENSCI)=1,允许SCI。 STA SCC1 ;即正常码输出、8位数据、无校验等。 3)写控制字到SCI控制寄存器3(SCC3),设置中断接收还是查询接收、设值允许发送接收等: LDA #%00001100;D3(TE)=1,允许发送器;D2(RE)=1,允许接收器。 STA SCC2 ;其它位为0,查询方式收发 (3) 发送和接收一位数据 以下将用查询方式接收和发送一位数据: 1)要发送一个数据,首先通过状态寄存器SCS1的D7(SCTE)判断是否可以向数据寄存器SCI送数,SCTE=1可以送数,下面程序将A中的数发送出去: BRCLR 7,SCS1,* ;SCTE=0?,为0则等待 STA SCDR ;SCTE=1,可以发送数据,即将数送入SCDR即可。 2) 要以查询方式接收一个数据,首先通过状态寄存器SCS1的D5(SCRF)判断有没有数据可收,SCRF=1有数据可收,下面程序等待串行口一个数,接收后放入A中: BRCLR 5,SCS1,* ;SCRF=0?,为0则等待 LDA SCDR ;SCRF=1,可以接收数据,数送入A中。 4 串行异步通信方法2——I/O模拟方式 用I/O口采用扫描方式来实现串行异步通信的基本原理是:根据传输的波特率以及MCU总线频率计算出传送一位数据所需的时间,将从I/O口发送或接收的每一位数据都限定在这个时间之内,不足部分用延时补齐,这样就可以一位一位的把所有要传送的数据发送出去或接收回来。在此过程中精确地计算出一位数据传送的时间尤为重要,它是成功实现此工作方式的前提。同时,对于接收和发送过程中各条指令执行时间的计算也必须非常准确,因为它牵涉到所有指令执行完成后,还要延时多长时间才能满足达到一位数据的传送时间。以上二者任一计算的失误都会在实现过程中发生累加效应,即传输一位时由于误差多计或少计了一两个周期,将会导致传输大量数据后产生十几、几十甚至更大的误差。这些误差对于一些低速的设备或许不会感觉到有错误。但一旦对于波特率要求稍高,这种误差就会有明显得感觉。尤其是一些高速设备,本身传送一位的时间也就只有20个周期左右,只要误差10个周期左右,传输时就会发生移位,导致整体的传输错误。 以下将以2.4756MHz为总线频率(fBUS)且波特率为38400bps的条件下发送和接收一位数据为例来具体介绍利用I/O口采用扫描方式模拟串行异步通信的工作方法。传送中使用一位起始位、八位数据位、一位结束位且无奇偶校验的传输方式。 (1) 传送一位数据所用的时间(以周期c为单位) T =fBUS/B=2457600/38400=64(c) (2) 接收一字节数据 为了使接收的数据准确,所以要保证接收数据时信号稳定,因而不是在数据传送的开始而是在传送的中间位置取得数据。当接收到起始位的低电平后,过1.5传送位后接收第一个数据送入Buf1.7;然后循环8次,每过一位发送位接收一个数据,Buf1逻辑右移一位,再将接收的数据送入Buf1.7(最后一次除外);循环接收的八位数据中前七位为数据位,它们与此前接收的一位数据构成要接收的一字节数据,最后一位为结束位,如果结束位为1接收正确;否则,接收错误。一字节数据成功接收后,接收的数据存放在Buf1中。 以38400bps波特率接收一位数据子程序: Receive1Byte: ;开一个字节的堆栈空间作为循环变量 PSHA LDA #!8 ;置循环变量的初值(4c) STA 1,SP ;延时1.5发送位 ;使用38400波特率(1.5发送位=96c) ;13*5+29=94,其它15 LDA #!13 ;(2c) JSR Delay ;(4c) NOP NOP ;延时 Receive1Byte1: LSR Buf1 ;右移一位(4c) ;判断接收到的数据位=0转MTxD_0(5c) BRCLR MTxD,MSerialPort,MTxD_0 ;接收到的数据位=1(4c) BSET 7,Buf1 JMP MTxD_EXIT ; (3c) MTxD_0: ;接收到的数据位=0(4c) BCLR 7,Buf1 NOP ;加3个NOP指令是为了 NOP ;与上面JMP指令 NOP ;具有相同的周期 MTxD_EXIT: ;延时1发送位 ;使用38400波特率(1发送位=64c) ;6*5+34=64,其它21 LDA #!6 ;(2c) JSR Delay ;(4c) LDA 1,SP ;(2c) DECA ;(1c) STA 1.SP CMP #!0 ;判断8个数据位是否接受完成(5c) ;未完成继续接收 BNE Receive1Byte1 ;判断结束位 为0退出,为1置标志位(5c) BRCLR MTxD,MserialPort,Rece1_exit ;将接收成功标志位置1(4c) BSET 1,Flag Rece1_exit: PULA ;将所开的一字节堆栈空间退栈 RTS ;(4c) 在每次调用以上接收程序前要不断地扫描MserialPort. MTxD,当其为0时,则表示有数据发送过来,此时,可以调用以上接收程序来完成接收一位数据。以下为用扫描方式调用Receive1Byte接收1字节数据的程序片段。 LDX # 00 ;(2c) ReceiveNByte1: AIX #!1 ;(1c) CPHX # 40FC BHI ReceiveNByte_Exit;(3c) BRSET MTxD,MserialPort,ReceiveNByte1;(5c) PSHH ;(2c) PSHX ;(2c) JSR Receive1Byte ;(4c) PULX ;(2c) PULH ;(2c) BRA ReceiveNByte1 ;(4c) ReceiveNByte_Exit: 以上程序中为了防止运行程序时处于死等状态,因而当过一段时间收不到数据后即认为无数据发送过来,跳出接收程序。 (3) 发送一字节数据 在调用之前将要发送的数据放入寄存器A中。每一字节数据发送前,先将信号线上送高电平,然后送一位低电平作起始位;接着用循环右移的方法将八位数据依次送入信号线上;最后发送一位结束位。每一位数据发送的时间从将数据信号送入信号线开始计时。 以38400bps波特率发送一位数据子程序: Send1Byte: ;发送口定义为输出(4c) BSET MRxD,MDDR_MSerialPort ;1)清掉原来线上的数据 ;发送口高电平(4c) BSET MRxD,MSerialPort PSHA ;( 2c) ;使用38400波特率(2发送位=128c) ;延时2发送位 ;19*5+7=102,其它24 LDA #!19 ;(2c) JSR Delay ;(4c) NOP NOP PULA ;(2c) LDX # 09 ;(2c) ;2)发送起始低电平信号 ;低电平(起始位)( 4c) BCLR MRxD,MSerialPort Send1Byte0: PSHA ;(2c) ;使用38400波特率(1发送位=64c) ;/延时1发送位 ;6*5+7=37,其它25 LDA #!6 ;(2c) JSR Delay ;(4c) NOP NOP PULA ;(2c) ;HX为0时1Byte数据发送结束 DECX ;(1c) BEQ Send1Byte1 ;(3c) ;3)发送八位数据信号 ;发送下一位 RORA ;最低位--C(1c) BCC Send0 ;发送位为0(3c ) ;发送bit=1(4c) BSET MRxD,MSerialPort BRA Send1Byte0 ;(3c) Send0: ;发送bit=0(4c) BCLR MRxD,MSerialPort BRA Send1Byte0 ;(3c) ;4)发送一位结束高电平信号,此位耗时0.5发送位,为 ;调用该子程序接收一位数据的继续接收连续数据的后 ;续操作留足时间。 Send1Byte1: ;发送口高电平(4c) BSET MRxD,MSerialPo |
|
相关推荐 |
|
你正在撰写讨论
如果你是对讨论或其他讨论精选点评或询问,请使用“评论”功能。
852 浏览0 评论
1128 浏览1 评论
如何配置Linux操作系统设备树让我的开发板可以将板子上的GPIO接口用作 I2S输出??
2018 浏览1 评论
1556 浏览0 评论
2100 浏览0 评论
小黑屋|手机版|Archiver|德赢Vwin官网(湘ICP备2023018690号)
GMT+8, 2024-8-23 05:17, Processed in 0.381258 second(s), Total 35, Slave 29 queries .
Powered by德赢Vwin官网 网
© 2015bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号