基于DSP2812的双缓冲串口程序设计

合集下载

dsp2812课程设计

dsp2812课程设计

dsp2812课程设计一、课程目标知识目标:1. 学生能理解DSP2812的基本结构和功能特点,掌握其内部寄存器配置方法。

2. 学生能运用C语言编写针对DSP2812的控制程序,实现基本输入输出操作。

3. 学生了解DSP2812在数字信号处理领域的应用,并能结合实际案例进行分析。

技能目标:1. 学生能够熟练操作DSP2812开发板,进行硬件连接和程序下载。

2. 学生能够运用所学知识解决实际问题,具备一定的编程调试能力。

3. 学生通过课程实践,培养团队协作和沟通表达的能力。

情感态度价值观目标:1. 学生通过学习DSP2812相关知识,增强对数字信号处理技术的兴趣和热情。

2. 学生在学习过程中,树立正确的价值观,认识到科技对社会发展的积极影响。

3. 学生培养勇于探索、善于思考的良好学习习惯,形成积极向上的学习态度。

分析课程性质、学生特点和教学要求,本课程旨在让学生深入了解DSP2812的相关知识,提高编程实践能力,培养团队协作和沟通表达技巧。

课程目标具体、可衡量,便于教师进行教学设计和评估,同时激发学生的学习兴趣,提高教学效果。

二、教学内容本课程教学内容主要包括以下三个方面:1. DSP2812基础知识:- 了解DSP2812的内部结构、功能模块和工作原理。

- 学习DSP2812的寄存器配置方法及其功能。

教学内容关联教材章节:第二章DSP2812硬件结构和寄存器配置。

2. 编程实践:- 学习使用C语言编写针对DSP2812的控制程序。

- 掌握基本输入输出操作,如GPIO、中断、定时器等。

教学内容关联教材章节:第三章编程实践与案例分析。

3. 应用拓展:- 分析DSP2812在数字信号处理领域的实际应用,如音频处理、图像处理等。

- 结合实际案例,探讨DSP2812在工程项目中的解决方案。

教学内容关联教材章节:第四章DSP2812应用拓展与案例分析。

教学大纲安排如下:1. 第1-2周:DSP2812基础知识学习,寄存器配置方法。

PC与多TMS320F2812DSP串行通信协议的设计(图文)(精)

PC与多TMS320F2812DSP串行通信协议的设计(图文)(精)

PC与多TMS320F2812 DSP串行通信协议的设计(图文)论文导读:F2812内部有两路专用的串行通信模块SCIA、SCIB,应实际工程需要,仅使用一路SCIB与PC进行串行通信。

PC的串行通信接口一般采用RS-232协议,该协议传输速率低,传输距离近,抗干扰能力弱,很难保障实际工程现场作业数据的精准性和较远距离传输的要求。

因此工程中采用了平衡差分接收的RS-485协议,使得抗干扰能力和传输距离等性能得到了很大的提升,满足了实际需要。

在今后的工程应用中将进一步完成PC与多DSP的串行传输,利用DSP进行数据采集和简单的数据处理,利用PC的高速完成数据的复杂处理,并将通信程序写成类库,提高程序的通用性。

关键词:PC,多DSP,串行通信,协议1. TMS320F2812 DSP处理器概述随着经济的进一步发展和科学技术的日新月异,高速信息处理和自动控制在各个生产领域的应用越来越显示出其举足轻重的地位。

而DSP处理器的诞生、发展以及优越的性能正是满足了市场的这种需求,同时它又进一步的促进了经济的发展和科技的进步。

DSP处理器是对数字信号进行高速实时处理的专用处理器,处理速度比普通的CPU快的多。

其中32位TMS320F2812 DSP的工作频率150MHz,堪比Intel 586处理器运算能力。

用户不仅可以应用汇编语言、高级语言编写系统程序,也能够采用C/C++语言开发高效的数学算法。

因此该类芯片在数字信号处理领域得到了相当广泛应用。

在工程应用中,其多下位机的串行数据交互愈显重要,备受关注。

2. F2812 SCI接口特点 F2812提供两个SCI接口,均采用双线制通信的异步通信串行接口。

为了减小串口通信时的开销,F2812的串口支持16级接收和发送FIFO,单独的发送器、接收器中断以及各自的单独启动位,可以进行半双工或者全双工操作,支持两种唤醒多处理器方式:空闲线唤醒和地址位唤醒。

3. F2812 SCI与PC的连接 F2812内部有两路专用的串行通信模块SCIA、SCIB,应实际工程需要,仅使用一路SCIB与PC进行串行通信。

dsp2812串口通信

dsp2812串口通信

DSP 2812串口通信SCI(Serial Communication Interface),即串行通信接口,是一个双线的异步串口,即具有接收和发送两根信号线的异步串口,一般可以看作是UART(通用异步接收/发送装置)。

2812的SCI模块支持CPU与采用NRZ(non-return-to-zero 不归零)标准格式的异步外围设备之间进行数字通信。

如果设计时我们的SCI使用的是RS232串行接口,那么,2812就能和其他使用RS232接口的设备进行通信。

例如2812内部的两个SCI之间,或者2812的SCI和其他DSP的SCI 之间均能实现通信。

2812内部具有两个相同的SCI模块,SCIA和SCIB,每一个SCI模块都各有一个接收器和发送器。

SCI的接收器和发送器各具有一个16级深度的FIFO(First in fist out 先入先出)队列,它们还都有自己独立的使能位和中断位,可以在半双工通信中进行独立的操作,或者在全双工通信中同时进行操作。

一. 2812-SCI模块SCI模块具有两个引脚,SCITXDA和SCIRXDA,分别实现发送数据和接收数据的功能,这两个引脚对应于GPIOF模块的第4和第5位,在编程初始化的时候,需要将GPIOFMUX寄存器的第4和第5位置为1,才能使得这两个引脚具有发送和接收的功能。

SCIA可以产生两个中断,SCIRXINTA和SCITXINTA,即发送中断和接收中断。

二. SCI模块的特点1 -- 具有4个错误检测标志:极性(parity)、溢出(overrun)、帧(framing)、中断(break)检测。

2 -- 多处理器模式下具有两种唤醒方式:空闲线方式和地址位方式。

通常使用的时候很少遇到多处理器模式,我们采用的是空闲线方式。

3 -- 通信工作于半双工或者全双工模式。

4 -- 具有双缓冲接收和发送功能,接收缓冲寄存器为SCIRXBUF,发送缓冲寄存器为SCITXBUF。

基于双缓冲队列的串口通信模块的研究与实现

基于双缓冲队列的串口通信模块的研究与实现

基于双缓冲队列的串口通信模块的研究与实现华中科技大学邱鹏卢社阶串口通信模块是单片机系统或者目前的嵌入式系统中常见的组成部分,被广泛的用于系统的调试和与外界的通信。

一般的MCU都内置了串口的硬件控制模块,用户只需要编写比较简单的控制程序就可以使用串口通信。

尽管如此,在实际使用中,考虑到效率和使用的方便性,有必要对串口通信软件进行仔细的设计,使得通过串口通信的其它软件模块能够比较简单和方便的使用,并且尽量不因为串口通信影响整个系统的性能。

下面我们通过讨论常见的串口软件使用的方法,并提出基于一种称之为双缓冲队列的串口缓冲区管理策略的串口软件模块的实现方法和其中要注意的问题。

1 常用的串口处理方法串口部分的底层软件可以认为是串口的驱动程序,对上层软件而言,它应该提供一种比较自然而简洁的使用方式。

以串口的发送为例,使用者可以直接调用一个函数输出一个字符串或者就像在通用平台上使用标准C中的printf函数一样。

对上的接口已经确定了,下面我们讨论实现的问题。

串口驱动的实现方法通常有两种:1.基于查询的办法。

发送过程中不断检测串口硬件的发送缓冲区是不是为空,如果是,发送一个字节。

如果还有数据没有发完,继续上述过程。

下面以三星的S3C44B0X MCU为例,给出了基于查询方法的串口发送的示意代码。

void Uart_SendStr (char *pt){char *p;p = pt;while(*p != ‘\0’){while (!(rUTRSTAT0 & 0x2)); //等待,直到串口缓冲区为空WrUTXH0(*p++); //发送一个字节}}2.基于中断的方法。

在上面的基于查询的方法中,有一个很明显的弊病,那就是在发送一个字符串的过程中,CPU不能去做其它的事情,必须等待全部字符发送完成后返回。

以上述MCU为例,其最高主频为66MHz,由于采用的是ARMv4体系结构,可以达到0.9指令每周期,而其串口最高波特率为115200 bps,这样就有大量的指令周期被浪费,而且在发送较长的字符串时会严重影响系统的实时性。

dsp课程设计2812

dsp课程设计2812

dsp课程设计2812一、教学目标本课程的教学目标是让学生掌握DSP2812的基本原理、编程方法和应用技巧。

具体包括以下三个方面:1.知识目标:学生需要了解DSP2812的结构、特性、指令集和编程环境。

能够熟练阅读DSP2812的 datasheet 和 reference manual,并掌握常用的数字信号处理算法。

2.技能目标:学生能够使用C语言进行DSP2812的程序设计,熟练使用CCS集成开发环境进行程序的编译、调试和烧写。

能够独立完成基于DSP2812的数字信号处理项目,具备一定的实际操作能力。

3.情感态度价值观目标:培养学生对DSP技术的兴趣和热情,使其认识到DSP技术在现代社会中的广泛应用和重要性。

培养学生独立思考、解决问题和团队协作的能力。

二、教学内容根据教学目标,本课程的教学内容主要包括以下几个部分:1.DSP2812概述:介绍DSP2812的结构、特性、指令集和编程环境。

2.C语言编程基础:讲解C语言在DSP2812上的应用,包括数据类型、运算符、语句等。

3.数字信号处理算法:介绍常用的数字信号处理算法,如FFT、滤波器设计等。

4.中断和定时器:讲解DSP2812的中断系统、定时器及其应用。

5.串口和并口通信:介绍DSP2812的串口和并口通信原理及其应用。

6.实验操作:安排多个实验项目,让学生动手实践,巩固理论知识。

三、教学方法为了实现教学目标,本课程将采用以下教学方法:1.讲授法:讲解基本概念、原理和算法。

2.讨论法:学生针对某一问题进行讨论,培养学生的独立思考能力。

3.案例分析法:分析实际项目案例,让学生了解DSP技术在工程中的应用。

4.实验法:安排多个实验项目,让学生动手实践,提高实际操作能力。

四、教学资源为了支持教学内容和教学方法的实施,本课程将准备以下教学资源:1.教材:选用《DSP2812原理与应用》作为主教材,辅助以相关参考书籍。

2.多媒体资料:制作PPT、实验指导书等教学资料,以便于学生学习和复习。

基于Modbus协议的DSP2812的Sci模块与触摸屏通信程序

基于Modbus协议的DSP2812的Sci模块与触摸屏通信程序

//--------------------------------------所需函数----------------------
Uint16 WORD_LO(Uint16 i);
Uint16 WORD_HI(Uint16 i);
void ConfigureModbus(void);
//ModbusModule 初始化
// Ver | dd mmm yyyy | Who | Description of changes
// =====|=============|======|===============================================
// 1.00| 2 Nov 2007 | WXJ | start version--03,16 两命令分别读写内部寄存器
Uint16 i; Uint16 crc=0xFFFF; if(len==0){
len=1; } while(len--) {
crc^=(*ptr); for(i=0; i<8; i++) {
if(crc&1)
CRC 校验
起始指针 字符长度
//CRC 校验函数 //参数:数组首地址,不包含 CRC 值的数组长度
PDF created with pdfFactory Pro trial version
{
crc>>=1;
crc^=0xA001;
}else{
crc>>=1;
}
}
ptr++;
}
return(crc);
//产生一个两字节的 CRC 校验代码
}
//---------------------------------------------

DSP2812-实验要求以及参考程序

实验一DSP数据存取实验实验要求:1、找到main函数入口地址4、观察从地址0x80000到0x80007的存储内容操作步骤:1、打开Setup CCStudio v3.3 ,系统配置为F2812 Device Simultor2、打开CCStudio v3.3,打开工程F2812\DSP281x_examples\Lab0201-Memory\Memory.pjt3、在main函数处设断点(F9),运行程序4、打开反汇编窗口(View>Disassembly),观察入口地址5、修改Memory.c中程序,完成存储区数据修改6、编译通过,加载.out 文件7、设置在变量定义处设置断点,点击运行(F5),单步运行(F11)8、打开观察窗(View>Watch Window)观察自己所设变量在单步运行时变化9、打开存储区窗口(View>Memory)观察地址为0x80000到0x80007的数据变化实验二指示灯与拨码开关实验实验要求:1、熟悉板上指示灯控制寄存器、开关控制寄存器2、指示灯点亮规则:只闭合拨码开关1:全灭;只闭合拨码开关2:全亮;只闭合拨码开关3: 顺序依次点亮;只闭合拨码开关4:反向顺序依次点亮;开关的其它状态:全灭;操作步骤:1、打开Setup CCStudio v3.3 ,系统配置为F2812 XDS510 Emulator_12、打开CCStudio v3.3,打开工程F2812\DSP281x_examples\Lab0201-Memory\led.pjt3、修改led.c,注意板上DIP开关控制寄存器地址为C0001h,板上指示灯控制寄存器地址为:C0000h。

这两个寄存器都是低四位有效。

4、观察实验现象实验三DSP定时器实验要求:1、利用定时器中断代替软件延时函数控制指示灯显示频率,要求1秒闪烁一次2、实物仿真时,通过CCS中的Clock功能统计延时函数的延时时间,与设定值进行比较操作步骤:1、打开Setup CCStudio v3.3 ,系统配置为F2812 XDS510 Emulator_12、打开CCStudio v3.3,打开工程F2812\DSP281x_examples\Lab0201-Memory\time.pjt3、修改time.c程序,写一个由定时器中断产生的以1s为单位的延时函数void delay(int time);4、在菜单中选择profile>Enable\View5、在延时函数前后各设置一个断点6、清零时钟计数器(双击清零),点击Run运行程序7、计算时间t=测得值/150000000(假如系统的时钟工作在150MHZ),与设定值进行比较实验四事件管理器实验实验要求1、利用事件管理器中的16路中的PWM1,输出一段连续变化的PWM波2、驱动扬声器蜂鸣器播放一段音乐声(声音频率文件参考Speaker.pjt)操作步骤1、打开Setup CCStudio v3.3 ,系统配置为F2812 XDS510 Emulator_12、打开CCStudio v3.3,打开工程F2812\DSP281x_examples\Lab0201-Memory\PWM.pjt和F2812\DSP281x_examples\Lab0201-Memory\Speaker.pjt3、在例程Speaker.c中是使用通用定时器TIME0来连续输出频率的方波,这里要求改为用EVA中的PWM1代替之。

Dsp2812串口设置及中断服务之C++程序

Dsp2812串口设置及中断服务之C++程序interrupt void ISRTxUart(void){if (Uart.SendWritePtr != Uart.SendReadPtr){SciaRegs.SCITXBUF = Uart.SendBuffer[Uart.SendReadPtr ++];Uart.SendReadPtr &= 0xff;}Uart.SendBusy = Uart.SendWritePtr != Uart.SendReadPtr;SciaRegs.SCIFFTX.bit.TXINTCLR = 1;PieCtrlRegs.PIEACK.bit.ACK9 = 1;}interrupt void ISRRxUart(void){Uart.ReceiveBuffer[Uart.ReceiveWritePtr ++] = SciaRegs.SCIRXBUF.all;Uart.ReceiveWritePtr &= 0xff;SciaRegs.SCIFFRX.bit.RXFFOVRCLR = 1;SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1;PieCtrlRegs.PIEACK.bit.ACK9 = 1;}void UartObj::Init(void){unsigned int i;for (i = 0; i < sizeof(ReceiveBuffer); i ++) {ReceiveBuffer[i] = 0;SendBuffer[i] = 0;}ReceiveWritePtr = 0;ReceiveReadPtr = 0;ReceivePosition = 0;ReceiveCount = 0;SendWritePtr = 0;SendReadPtr = 0;SendBusy = false;State = 0;EALLOW;GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4 = 1;GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5 = 1;EDIS;/* loopback 8 bit data */SciaRegs.SCICCR.all = 0x07; // 1 bit stop, disable parity, idle mode, 8 bits dataSciaRegs.SCICTL1.all = 0x03; // enable TXSciaRegs.SCICTL2.all = 0x03; //SciaRegs.SCIHBAUD = 0;SciaRegs.SCILBAUD = 0xf3;//SCI_PRD & 0xff;//0xF3;SciaRegs.SCICTL1.all = 0x23;// PieCtrlRegs.PIECRTL.bit.ENPIE = 1; // Enable the PIE block PieCtrlRegs.PIEIER9.bit.INTx1 = 1;PieCtrlRegs.PIEIER9.bit.INTx2 = 1;/*设置中断服务程序入口地址*/EALLOW; // This is needed to write to EALLOW protected registers PieVectTable.TXAINT = &ISRTxUart;PieVectTable.RXAINT = &ISRRxUart;EDIS; // This is needed to disable write to EALLOW protected registers /*开中断*/IER |= M_INT9;}//KEY7压键事件处理void KeyboardObj::Key17(void){System.BeepOn();Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端Lcd.Display("KEY7键单击事件!!");Uart.puts("KEY7键单击事件");}。

dsp芯片2812课程设计

dsp芯片2812课程设计一、课程目标知识目标:1. 理解DSP芯片2812的基本结构、工作原理及其功能特点;2. 学会使用2812的内部寄存器进行编程配置;3. 掌握基于2812的数字信号处理算法及其应用。

技能目标:1. 能够运用C语言或汇编语言编写针对2812的简单程序;2. 能够运用仿真工具对2812程序进行调试与优化;3. 能够分析并解决基于2812的实际数字信号处理问题。

情感态度价值观目标:1. 培养学生对数字信号处理领域的兴趣,激发其主动学习的热情;2. 培养学生的团队协作精神,使其在合作学习过程中学会倾听、交流、分享;3. 培养学生严谨的科学态度和良好的工程素养,使其在实际应用中关注技术对社会发展的贡献。

分析课程性质、学生特点和教学要求,本课程目标旨在使学生在掌握DSP芯片2812基础知识的基础上,具备实际编程与调试能力,同时注重培养学生的情感态度和价值观,使其成为具有创新精神和实践能力的数字信号处理领域人才。

通过本课程的学习,学生将能够达到以上所述的具体学习成果,为后续相关课程的学习和实际工程应用奠定基础。

二、教学内容1. DSP芯片2812基础知识:- 芯片结构、功能模块及其工作原理;- 内部寄存器组织与配置方法;- 中断系统、定时器及外设接口。

2. 编程与调试技巧:- C语言及汇编语言编程基础;- 仿真工具的使用与调试方法;- 程序优化技巧及性能分析。

3. 数字信号处理算法及应用:- 常见数字滤波器设计;- 快速傅里叶变换(FFT)算法;- 数字信号处理在实际应用中的案例分析。

教学大纲安排如下:第一周:DSP芯片2812基础知识学习;第二周:内部寄存器组织与配置方法;第三周:编程与调试技巧;第四周:数字信号处理算法及应用;第五周:综合案例分析与实践。

教学内容依据教材相关章节,结合课程目标进行选择和组织,保证科学性和系统性。

通过本章节学习,学生将全面了解DSP芯片2812的相关知识,为实际应用奠定基础。

基于DSP2812的双缓冲串口程序设计

S a g S I FR . = 6 7 ci Re s. C F X al 0x 0 0: 1
sh r { ca )
/shr /ca 为待发送 的数据
/ 将 数据送 入发 送数 据缓 冲 /
S a ci RegS .SCI BUF Ch TX =S ar:
禁 止 串 口自动 检测 波特 率 /
v i S I S n C a u s g e c a o d C A e d h r(n i n d h r
/ 清R F O F 志 ,使 能F F 接收 , XFV标 I0
发送 数据 时 ,可 以一 次性 连 续写 入 多个 数 接 收 F F 空 ,清 除R F IT IO X F N 中断 标 志 ,使 据 ( 多 1个 ) ,D P 自动 将 这 些 数据  ̄ R F IL 配 中 断 ,匹 配值 为 1 ,即 : 最 6 S会 X FV匹 6 发送 出去 ,无 需C U P 干预 ,还 可 以设 置 发 FF 中的数据大 于等于1时进 入发送 中断 IO 6 / 送 完 成后 进 中 断; 通过 F F接 收 数据 时 , IO 经 由设 置 S I F X 存 器 ,可 以实 现 接 收 CF R寄 若干 个字 节 的数 据 后 ( 多 1个 )进 入 中 最 6 断 ,在 中 断中 处理 这 些数 据 ,这 就减 少 了 高 了效率 。
切 实可行 的解 决方 案 。
/ 响应 同组 其他 中断 /
EN : } IT
存器 中的位 RF F T- 表 明 当前接 收F F X IS 4 O IO 中 有 多少 个 字 节 的数 据 ,位 R F I 4 0 X F L — 为
D P 收到 一 个 字节 的数 据 都 会 进入 用 户 设 定 的 发送 F F 中断 匹 配 级 别 , 当 S每 I0 中断 , 当接 收 的数据 量 较 大 时 ,会 占用较 R F F T — 的值 大于 或 等于 R F I4 0 X I S4 0 X F L — 的 值 时 ,产 生接 收 匹配 中断 。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于DSP2812的双缓冲串口程序设计作者:王刚林明辉来源:《电子世界》2011年第21期【摘要】以DSP2812为例,分析了常用串口程序的缺点,提出了一种工程上实用的串口通讯程序的设计方法。

利用DSP2812的FIFO和队列数据结构,对串行数据进行了两级双向缓冲,在中断中完成数据收发,高效可靠的实现了DSP的串行通讯。

【关键词】DSP2812;串行通讯;FIFO队列引言TMS320F2812是国内广大的工程技术人员非常熟悉一种DSP芯片,它速度快,功能强,广泛应用于电机控制,电力电子等领域。

如何高效可靠的实现DSP与上位PC机或其它从机间的串行通讯,是DSP系统开发的一个基本问题。

本文将以DSP2812为例,针对这一问题展开讨论,并给出一种切实可行的解决方案。

1.常用串口收发程序及其存在的问题常用的串口发送程序如下所示,以DSP2812的SCIA发送一字节数据为例:void SCIASendChar(unsigned char schar) { //schar为待发送的数据SciaRegs.SCITXBUF=schar; //将数据送入发送数据缓冲寄存器while(SciaRegs.SCICTL2.bit.TXRDY==0); //等待发送器缓冲寄存器就绪while(SciaRegs.SCICTL2.bit.TXEMPTY==0); //等待发送器数据为空}这是一种查询等待标志位的方式。

由于有while循环存在,CPU要等待一个字节的数据发送完成后才能继续进行其它工作,这造成了大量指令周期的浪费,会引起数据发送有延迟、通讯效率低、占用较多的CPU资源、其它模块的执行时间无法得到保证等一系列问题。

当系统要求的实时性较高时,是不允许采取这种方式的。

常用的串行中断接收程序如下所示,以DSP2812的SCIA接收中断为例:interrupt void SCIA_RXINT(void) {DINT;rxdata=SciaRegs.SCIRXBUF.bit.RXDT; //读取数据PieCtrl.PIEACK.all |= (1EINT; }DSP每收到一个字节的数据都会进入中断,当接收的数据量较大时,会占用较多的CPU 资源,效率低。

2.FIFO控制寄存器设置和使用队列数据结构的说明DSP2812含有一个16级深度的发送/接收FIFO。

使用FIFO可以减少收发数据的延迟和对CPU资源的占用,高效的实现串口数据收发。

FIFO是一个缓冲寄存器,通过FIFO发送数据时,可以一次性连续写入多个数据(最多16个),DSP会自动将这些数据发送出去,无需CPU干预,还可以设置发送完成后进中断;通过FIFO接收数据时,经由设置SCIFFRX寄存器,可以实现接收若干个字节的数据后(最多16个)进入中断,在中断中处理这些数据,这就减少了接受多个数据时,CPU进中断的次数,提高了效率。

使用FIFO时,有两个问题需要明确:(1)如何访问FIFO写发送FIFO通过SCITXBUF寄存器,读接收FIFO通过SCIRXBUF寄存器。

(2)FIFO中断FIFO模式有两个中断,一个用于FIFO发送,一个用于FIFO接收。

对于FIFO发送中断来说,当使能FIFO,且使能TXFIFO中断后,标准的TXINT将不再起作用,该中断仅作为SCI FIFO发送中断工作;对于串行接收中断而言,RXINT中断是SCI FIFO接收、接收错误和接收FIFO溢出的共同中断。

FIFO发送和接收中断都可以设置为匹配中断。

对FIFO发送来说,SCIFFTX寄存器中的位TXFFST4-0表明当前的发送FIFO中有多少个字节的数据,位TXFFIL4-0为用户设定的接收FIFO中断匹配级别,当TXFFST4-0的值小于或等于TXFFIL4-0的值时,产生发送匹配中断;对FIFO接收来说,SCIFFRX寄存器中的位RXFIFST4-0表明当前接收FIFO中有多少个字节的数据,位RXFFIL4-0为用户设定的发送FIFO中断匹配级别,当RXFIFST4-0的值大于或等于RXFFIL4-0的值时,产生接收匹配中断。

FIFO寄存器可以设置为:/*使能FIFO,发送FIFO空,禁用TXFIFO中断,清除TXFIFO中断标志,使能TXFFIVL 匹配中断,匹配值为0,即:当TXFIFO中数据为0时进入发送中断。

*/SciaRegs.SCIFFTX.all=0xe060;/*清RXFFOVF标志,使能FIFO接收,接收FIFO空,清除RXFFINT中断标志,使能RXFFIVL匹配中断,匹配值为16,即:FIFO中的数据大于等于16时进入发送中断*/SciaRegs.SCIFFRX.all=0x6070;/*禁止串口自动检测波特率*/SciaRegs.SCIFFCT.all=0;程序使用队列数据结构,可以更好的将串口程序模块化。

同时,利用队列对串行数据再做一级缓冲,不仅保证了数据的顺序,而且解除了使用FIFO最多一次写入16个字节的限制,最多能写入的数据个数取决于队列缓冲区的大小,而这是由用户定义的。

只要发送队列缓冲区中有待发送的数据,就采用中断间歇性的进行发送。

串行接收采用类似方式,接收到一定数量的数据后再通知上层程序,CPU不必频繁进入中断。

队列是一种先入先出的线性表,它只允许在表的一端写入数据,而在另一端读取数据。

它的操作一般有以下函数://获取队列中的数据,buf为指向队列的指针,rdata为指向读到的数据的指针QueueRead(unsigned char *rdata, void *buf);//向队列中写入数据,buf为指向队列的指针,wdata为要写入的数据QueueWrite(void *buf,unsigned char wdata);//获取队列中元素个数QueueNData(void *Buf)本文使用了两个队列来对串行数据进行缓冲,一个是DSP串行发送数据的队列TxQueue,另一个是DSP串行接收数据的队列RxQueue。

各有100级深度。

3.串行发送利用队列和FIFO的串口发送程序由两部分组成。

一部分是供主程序调用的应用型函数,另一部分为中断程序,它完成数据的发送。

以下是一个应用型函数的例子,DSP2812串行发送一个字节的数据:void SciaSendChar(unsigned char sChar) { //sChar为待发送的数据QueueWrite(TxQueue,sChar); //sChar入队,TxQueue为指向发送队列的指针if(SciaRegs.SCIFFTX.bit.TXFFIENA==0) //允许 TXFIFO 匹配中断SciaRegs.SCIFFTX.bit.TXFFIENA=1;}SciaSendChar(unsigned char sChar)函数由主函数调用,它将要发送的数据入队。

而后使能FIFO发送中断。

在上文的FIFO设置中,已设置当TXFIFO中数据为0时进入发送中断,由于串行通讯开始前TXFIFO中并无数据,所以一旦FIFO发送中断打开,就立即进入该中断程序。

串行发送中断程序的一种写法:interrupt void SCITXINTA_ISR(void) { // SCI-A中断服务程序unsigned char temp=0,i=0; //定义局部变量//ReadByte为从队列中读到的数据,pReadByte为指向ReadByte的指针unsigned char ReadByte,*pRead-Byte; pReadByte=&ReadByte;SciaRegs.SCIFFTX.bit.TXINTCLR=1; //清中断标志PieCtrl.PIEACK.bit.ACK9=1; EINT; //允许同组其他中断,允许嵌套temp=QueueNData(TxQueue); //获取发送队列中元素个数if((temp>0)&&(tempfor(i=0;iQueueRead(pReadByte,TxQueue);SciaRegs.SCITXBUF=ReadByte; }}else if(temp>16) { //若元素个数大于16,则在FIFO中写入16个元素for(i=0;iQueueRead(pReadByte,TxQueue);SciaRegs.SCITXBUF=ReadByte; }}else //以上两种情况都不是,说明发送队列中已无元素,发送完,关中断SciaRegs.SCIFFTX.bit.TXFFIENA=0; //禁用TXFIFO匹配中断return; }串行数据的发送是在中断中完成的,只要发送队列中还有数据,就会间歇性进入该中断,中断程序会判断当前发送队列还有多少个元素等待发送,若不足16个,则把数据全部写入FIFO,若大于16个,则写入16个,写入FIFO的数据,DSP会自动发送出去,无需CPU的干预。

当发送队列中无数据时,则判定为发送完,关闭中断,防止因FIFO空而反复进入该中断。

若CPU有其他的关键进程需要响应,则可以把该关键进程的中断优先级设置得高于串行发送中断,这样在发送数据时依然可以响应关键进程。

4.串行接收利用FIFO的串行接收程序同样由两部分组成,一部分是串行接收中断,另一部分是从串行接收队列中取数的程序。

串行接收中断的一种实现方法:interrupt void SCIRXINTA_ISR(void){ // SCI-A,FIFO接收中断服务程序unsigned char i=0; //循环变量unsigned char Rxdata,; //暂存接收到的数据SciaRegs.SCIFFRX.bit.RXFFINTCLR=1; //清中断标志PieCtrl.PIEACK.bit.ACK9=1; EINT; //响应同组其他中断,允许嵌套for(i=0;iQueueWrite(RxQueue, Rxdata); //存往串行接收数据队列RxQueue}}在上文的FIFO设置中,我们令FIFO中的数据大于等于16时进入串行接收中断,中断程序只需要取出数据并将之存往串行接收队列RxQueue即可。

在这里有一个隐含的约定,即,串行接收的数据数量必须大于等于16字节,否则由于串行接收匹配中断的执行条件不满足,将导致该中断不执行,无法处理FIFO接收的数据。

在主函数或其他中断程序(如定时中断)中再处理RxQueue中接收到的数据,这样处理起来非常灵活,实际应用中可根据需要编写程序。

下面给出在主函数中处理RxQueue的一个简单例子供参考。

if(QueueNData(RxQueue)>50) { //若RxQueue队列数据超过50个for(i=0;iQueueRead(pReadByte,TxQueue); //pReadByte=&ReadByte,ReadByte为从队列中取出的数据ReceivedData[i]=ReadByte; } } //存往ReceiveData数组总结本文提出了一种工程上实用的DSP串行通讯的方法。

相关文档
最新文档