TMS320F2812的hello使用SCI-FIFO与PC通信的例程

您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
第6章_TMS320F2812串行通信接口(SCI).ppt 32页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
第6章_TMS320F2812串行通信接口(SCI),串行通信接口,串行接口,串行通信,串行通信协议,异步串行通信,串行接口和并行接口,同步串行接口,同步串行通信,串行口通信
你可能关注的文档:
··········
··········
第6章 TMS320F2812串行通信接口(SCI) 学习重点 F2812串口通信SCI特点及结构。 SCI模块寄存器各位的含义及配置。 基于C语言的SCI程序设计实例。 学习内容 SCI概述 SCI 模块发送和接收数据的工作原理 SCI 数据格式 SCI 通信波特率 SCI 发送和接收数据的机制 多处理器通信 SCI 的例程 1、SCI概述 SCI(Serial Communication
Interface),即串行通信接口,是一个双线的异步串口,即具有接收和发送两根信号线的异步串口,一般可以看作是 UART(通用异步接收/发送装置)。 F2812
模块支持 DSP 与采用 NRZ(non-return-to-zero 不归零)标准格式的异步外围设备之间进行数字通信。 2812 内部具有两个相同的 SCI 模块,SCIA
和 SCIB,每一个 SCI 模块都各有一个接收器和发送器。SCI 的接收器和发送器各具有一个 16 级深度的 FIFO(First in fist out
先入先出)队列,它们还都有自己独立的使能位和中断位,可以在半双工通信中进行独立的操作,或者在全双工通信中同时进行操作。
串行通信的三种方式
根据信息的传送方向,串行通信可以分为单工、半双工和全双工三种,其各自的定义如下图所示。
SCI的CPU接口 SCI 模块具有两个引脚,SCITXDA 和 SCIRXDA,分别实现发送数据和接收数据的功能,分别对应于 GPIOF 模块的第 4 和第 5 位,在编程初始化的时候,需要将 GPIOFMUX 寄存器的第 4 和第 5 位置为 1,才能使得这两个引脚具有发送和接收的功能,否则就是普通的 I/O 引脚。 CPU 的系统时钟 SYSCLKOUT经过低速预定标器之后输出低速时钟 LSPCLK 供给 SCI。要保证 SCI 的正常运行,系统控制模块下必须使能 SCI 的时钟,也就是在系统初始化函数中需要将外设时钟控制寄存器 PCLKCR 的 SCIAENCLK 位置 1。 SCI 可以产生两个中断,SCIRXINTA 和 SCITXINTA,即发送中断和接收 中断。
SCI 模块的其他特点
2、SCI 模块发送和接收数据的工作原理
SCI 发送数据的过程:在 FIFO 功能使能的情况下,首先发送数据缓冲寄存器 SCITXBUF 从 TX
FIFO 中获取由 CPU 加载的需要发送的数据,然后 SCITXBUF 将数据传输给发送移位寄 存器 TXSHF,如果 SCI 的发送功能使能,TXSHF 则将接收到的数据逐位的移到 SCITXD 引脚上。 SCI 接收数据的过程:首先接收移位寄存器 RXSHF 逐位接收来自 SCIRXD 引脚的数据,如果 SCI 的接收功能使能,RXSHF 将这些数据传输给接收缓冲寄存器 SCIRXBUF, CPU 就能从 SCIRXBUF 读取外部发送来的数据。如果 FIFO 功能使能的话,SCIRXBUF 会将数据加载到 RX FIFO 的队列中,CPU 再从 FIFO 的队列读取数据。 3、SCI 数据格式
在 SCI 中传输的数据格式可以通过 SCI 的通信控制寄存器 SCICCR 来进行设置,规定通信过程中所使用的数据格式。SCI 使用的是 NRZ 的数据格式,如下表所示: 在空闲线模式下,SCI 发送或者接收一帧的数据格式如下图4 所示,其中 LSB 是数据的最低位,MSB 是数据的最高位。 使 用 SCICCR 进行数据格式编程如下表所示:
4、SCI 通信波特率
SCI通信波特率就是指每秒所能发送的位数。2812 的每个 SCI 都具有 两个 8 位的波特率寄存器,SCIHBAUD 和 SCILBAUD,通过编程,可以实现达到 64K 不同的速率。波特率的 计算公式如下所示: 波特率计算方法举例 例如外部晶振为 30M,经过 PLL 之后 SYSCLKOUT 为 150MHz,然后,当低速预定标器 LOSPCP 的值为 2 的时候,SYSCLKOUT 经过低速预定标器之后产生低速外设时钟 LSPCLK 为 37.5MHz, 也就是说 SCI 的时钟为 37.5MHz。 如果预设置SCI 的波特率为 19200,则将 LSPCLK 和波特率的数值代入式 1,便可得到:BRR=243.14,由于寄存器都是正整数,所以省略掉小数后可以得到 BRR=243。将 243 转成 16 进制是 0xF3,因此 SCIHBAUD 的值为 0,SCIHBAUD 的值为 0XF3。由于省略了小数,将会产生 0.06%的误差。 当 LSPCLK 为 37.5M 时,对于 SCI 常见的波特率,其寄存器的值如下表所示: 5、SCI 发送和接收数据的机制 通常
正在加载中,请稍后...&&&&TMS320F2812原理与开发——DSP应用丛书
自营订单满49元(含)免运费
不足金额订单收取运费5元起
邀请好友参加吧
开 本:纸 张:胶版纸包 装:平装是否套装:否国际标准书号ISBN:7丛书名:DSP应用丛书所属分类:&&&
下载免费当当读书APP
品味海量优质电子书,尊享优雅的阅读体验,只差手机下载一个当当读书APP
本商品暂无详情。
当当价:为商品的销售价,具体的成交价可能因会员使用优惠券、积分等发生变化,最终以订单结算页价格为准。
划线价:划线价格可能是图书封底定价、商品吊牌价、品牌专柜价或由品牌供应商提供的正品零售价(如厂商指导价、建议零售价等)或该商品曾经展示过的销售价等,由于地区、时间的差异化和市场行情波动,商品吊牌价、品牌专柜价等可能会与您购物时展示的不一致,该价格仅供您参考。
折扣:折扣指在划线价(图书定价、商品吊牌价、品牌专柜价、厂商指导价等)某一价格基础上计算出的优惠比例或优惠金额。如有疑问,您可在购买前联系客服咨询。
异常问题:如您发现活动商品销售价或促销信息有异常,请立即联系我们补正,以便您能顺利购物。
当当购物客户端手机端1元秒
当当读书客户端万本电子书免费读&>&TMS320F2812各模块开发例程,适合新手学习
TMS320F2812各模块开发例程,适合新手学习
上传大小:15.37MB
TMS320F2812各模块开发例程,包括有AD,IO,EV,SCI,SPI,PWM等非常全面,适合新手学习
综合评分:5
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var parentWrap = $(this).parents(".respond_box"),
q = parentWrap.find(".form1").serializeArray(),
resStr = $.trim(parentWrap.find(".res_area_r").val());
console.log(q);
//var res_area_r = $.trim($(".res_area_r").val());
if (resStr == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
//var mess = $(".res_area_r").val();
var mess = resS
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, data.com_username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click", '.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
var parentWrap = $(v).parents(".respond_box");
parentWrap.find(".res_area_r").val($.trim(parentWrap.find(".res_area").val()));
评论共有2条
非常全面,详细
资料很全,适合初学
menglingyao
综合评分:
积分/C币:5
综合评分:
积分/C币:2
综合评分:
积分/C币:15
VIP会员动态
CSDN下载频道资源及相关规则调整公告V11.10
下载频道用户反馈专区
下载频道积分规则调整V1710.18
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
资源所需积分/C币
当前拥有积分
当前拥有C币
输入下载码
为了良好体验,不建议使用迅雷下载
TMS320F2812各模块开发例程,适合新手学习
会员到期时间:
剩余下载个数:
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
无法举报自己的资源
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可返还被扣除的积分
被举报人:
请选择类型
资源无法下载 ( 404页面、下载失败、资源本身问题)
资源无法使用 (文件损坏、内容缺失、题文不符)
侵犯版权资源 (侵犯公司或个人版权)
虚假资源 (恶意欺诈、刷分资源)
含色情、危害国家安全内容
含广告、木马病毒资源
*投诉人姓名:
*投诉人联系方式:
*版权证明:
*详细原因:
TMS320F2812各模块开发例程,适合新手学习基于 TMS320F2812 的数据采集及处理系统
> 基于 TMS320F2812 的数据采集及处理系统
基于 TMS320F2812 的数据采集及处理系统
数据采集及处理系统在众多领域均有广泛的应用,其主要功能是把外界模拟信号的电压参量经过a/d转换器,转换成数字量,并把转换结果存储以便分析处理。本文引用地址:
本系统采用ti 的dsp 芯片tms320f2812 作为信号采集和处理的核心,通过片上自带的12位adc进行采集。采集后的数据暂时存储在片内存储器中,通过串行异步通信接口sci
传输到微机,微机将以文件形式存储采样数据。数字处理部分主要是进行简单的窄带滤波。考虑到采样器件可能和微机有较远距离(但<
1200m),在sci和微机间采用了rs-422传输协议。
tms320f2812介绍
目前应用最多的是德州仪器公司的tms320系列和摩托罗拉公司的dsp56000和dsp96000系列。tms320f28系列芯片是ti最新推出的dsp芯片,特别适用于有大批量数据处理的测控场合,如数据采集,工业自动化控制,电力电子技术应用,智能化仪器仪表及电机,马达伺服控制系统等。其主要特点有:
采用高性能的静态cmos技术,能在一个周期内完成32*32位的乘法累加运算,或者两个16*16位的乘法累加运算;时钟频率最高可达150mhz即6.67ns的指令周期,外部采用低频时钟、通过片内锁相环倍频,低功耗设计,flash
编程电压为3.3伏特。
16通道的12位模数转换器(adc)含两路采样保持器,一个转换单元,可实现双通道同步采样,最小转换时间为80ns.片上含两个事件管理单元(eva,evb),设计用于pwm输出,转速测量、脉宽测量等。通讯接口,含2
个通用异步串口(sci);2个通用同步串口(spi),1个can总线接口(ecan),2个mcbsp串口(mcbsp),56个独立配置的通用多功能i/o(gpio)。
tms320f2812应用的大量外设接口简化了电路设计。同时,它提供了足够的处理能力,使一些复杂实时控制算法的应用成为可能。
片内外设adc
tms320f2812 的adc模块是一个12位分辨率的,具有流水线结构的模数转换器,(流水线adc也称作分级型adc)是这三种结构(现代模数转换器(adc)设计最常用的结构分为逐次逼近(sar)型adc、
- adc和流水线adc三种)中能超过100 msps最高采样速率(但精度最低)的adc,这种流水线结构的adc分辨率通常最高仅能达到14
bit。tms320f2812内置双采样保持电路,保持数据采集时窗口有独立的预定标控制。并且允许系统对同一通道转换多次,允许用户执行过采样算法,这较传统的单一转换结果增加了更多的解决方案,有利于提高采样的精度。有多个触发源可以启动adc
转换。快速的转换时间, adc 时钟可以配置为25mhz,最高采样带宽为12.5msps。用tms320f2812 搭建数据采集系统时,不必外接adc,避免了复杂的硬件设计。由于此adc可以直接对0-3v电压范围采样,也可以经过信号调理后对峰峰值不超过3v的双极性模拟信号进行采样。先把被测信号用示波器或其他方法判断其极性和幅值范围。若为单极性信号则断开偏置电路,双极性时连接到电路上调节电压范围到0-3v。为测试片上adc的线性,实验中主要是对几个电平信号进行采样,把adc
采集的结果在程序中计算其对应的模拟量,并且同时用数字万用表测量,计算adc 的线性和精度。实验数据如表1所示。
由上表所得adc的线性曲线如图1所示:
采集0-3v的信号时(d 为采集的数字量 adclo)计算公式为:
v=3(d-adclo)/(2power12-1)
采集峰峰值3v的双极性信号时,需要连接偏置电路。首先不加入信号直接测出偏置电压的数字量为dv,则实际的信号与采集的数字量的关系为:
v=3(d-dv)/(2power12-1)
数字信号处理
数字信号处理之所以发展得这样快,应用得这么广,是与它的突出优点分不开的。归纳起来,有以下四个方面的优点:
(1)精度高。模拟系统的精度主要取决于元器件的精度,一般模拟器件的精度达到10-3,己很不容易。而数字系统的精度主要取决于字长,16位的字长可达10-4以上。
(2)灵活性大。模拟信号装置一旦参数选定就不易改变,但是数字系统则不然,它的系数可调,甚至还可以具有可编程和自适应的能力。
(3)可靠性高。由于数字系统只有“0” 、“1”两个电平,其受温度、环境以及噪声等的影响比模拟系统小。
(4)时分复用。利用一套装置同时处理几个通道的信号。
与pc的通信
串行通信接口sci是采用双向通信的的异步串行通信接口,即通常所说的uart口。为减少串口通信时的cpu开销,tms320f2812的串口支持16级接收和发送fifo。sci模块采用标准非归0
数据格式,可以与cpu或其他通信数据格式兼容的异步外设进行数字通信。当不使用fifo时,sci接收器和发送器采用双级缓冲传送数据,sci接收器和发送器有自己独立的使能和中断位,可以在半双工通信中进行独立的操作,或者在全双工模式下同时操作。为了确保数据的完整性,sci模块对接收到的数据进行中断检测、极性、超限和祯错误检测。通过对16位的波特率控制寄存器进行编程,可配置不同的sci通信速率。tms320f2812支持自动波特率检测逻辑。发送和接收可采用中断和查询两种方式。
由于tms320f2812片内存储空间相对较小,难以做到长时间连续采集。本系统将采集的结果暂时存储在dsp 的片内数据区,再用微机的串口rs-232
实现与dsp 的电平匹配,同时实现全双工通信。为增大传输距离,在这中间又加两片max3490(两片max3490 之间电压很高,可以传输相当长的距离)。实验所需的电路原理如图2所示:
dsp 的编程工具有c 语言和汇编语言两种。一般实时性要求不是特别高的场合,采用c语言编程完全可以满足要求。对于高速实时应用,采用c语言和汇编语言混合编程的方法,能把c语言的优点和汇编语言的高效率有机结合起来。本文涉及的关键程序和相应的流程图如下:
sysctrlregs.hispcp.all=03;
adcregs.adctrl3.bit.adcbgrfdn = 0x3;
adcregs.adctrl3.bit.adcpwdn = 1;
// initadc();
//采样窗口大小设置寄存器
adcregs.adctrl1.bit.acq_ps=0
//内核时钟分频器
adcregs.adctrl3.bit.adcclkps=0x1;
//级联排序器工作方式
adcregs.adctrl1.bit.seq_casc=1;
adcregs.adcmaxconv.all=0x0001;
adcregs.adcchselseq1.all=0x0011;
adcregs.adctrl1.bit.cont_run=1;
//初始化串行通信模块sci寄存器
gpiomuxregs.gpfmux.all=0
gpiomuxregs.gpgmux.all=0
sra.sciccr.all=0x0007;
srb.sciccr.all=0x0007;
sra.scictl1.all=0x0003;
srb.scictl1.all=0x0003;
sra.scictl2.bit .rxbkintena=1;
srb.scictl2.bit .txintena=1;
窄带滤波:
for(k=0;k<=l-1;k++)
wf=(2*pi*k)/l;
for(i=0;i<n;i++)
re=re+h[i]*cos((float)i*wf);
im=im+h[i]*sin((float)i*wf);
d[k]=sqrt(pow(re,2)+pow(im,2)); /*求模(幅度)*/
//db[k]=20.0*log10(d); /*转换为对数表示形式*/
实际采集到的一个波形为:
本文论述了以32 位定点芯片tms320f2812 为核心的数据采集系统,充分利用它的片内外设adc,sci。利用其快速的转换时间,实时地把采集的数据传输到微机上。12
位的高速adc 保证了采样的快速准确和同步,初步实现了数据的采集和存储。数据采样率可以通过程序实时根据输入信号的频率进行改变。
分频器相关文章:
锁相环相关文章:
分享给小伙伴们:
我来说两句……
微信公众号二
微信公众号一TMS320F2812外设例程系列之SCI
单片机&嵌入式
单片机应用
嵌入式操作系统
学习工具&教程
学习和开发单片机的必备工具
(有问必答)
(带你轻松入门)
电子元件&电路模块
当前位置: >>
>> 浏览文章
TMS320F2812外设例程系列之SCI
//#####################################################################
//文件: &Example_281xSci_FFDLB_int.c
//说明: &该程序是SCI中断发送、接收的典型程序,
// & & & 采用内部连接的自循环模式,即自发、自接
//#####################################################################
//SCI-A 发送的数据流:
//00 01 02 03 04 05 06 07
//01 02 03 04 05 06 07 08
//02 03 04 05 06 07 08 09
//FE FF 00 01 02 03 04 05
//FF 00 01 02 03 04 05 06
//SCI-B 发送的数据流:
//FF FE FD FC FB FA F9 F8
//FE FD FC FB FA F9 F8 F7
//FD FC FB FA F9 F8 F7 F6
//01 00 FF FE FD FC FB FA
//00 FF FE FD FC FB FA F9
//检查变量:
// & & SCI-A & & & & & SCI-B
// & & ----------------------
// & & sdataA & & & & &sdataB & & & & & //发送的数据
// & & rdataA & & & & &rdataB & & & & & //接收的数据
// & & rdata_pointA & &rdata_pointB & //用来检查接收到的数据
//#####################################################################
#include &DSP281x_Device.h& & & & & & //F2812头文件
#include &DSP281x_Examples.h& &
#define CPU_FREQ 150E6
#define LSPCLK_FREQ CPU_FREQ/4
#define SCI_FREQ 100E3
#define SCI_PRD (LSPCLK_FREQ/(SCI_FREQ*8))-1
//功能函数原型
interrupt void sciaTxFifoIsr(void);
interrupt void sciaRxFifoIsr(void);
interrupt void scibTxFifoIsr(void);
interrupt void scibRxFifoIsr(void);
void scia_fifo_init(void);
void scib_fifo_init(void);
void error(void);
//全局变量
Uint16 sdataA[8]; & & //SCI-A发送的数据
Uint16 sdataB[8]; & & //SCI-B发送的数据
Uint16 rdataA[8]; & & //SCI-A接收的数据
Uint16 rdataB[8]; & & //SCI-B接收的数据
Uint16 rdata_pointA; & //用于检查接收到的数据
Uint16 rdata_pointB;
void main(void)
& & Uint16
& //步骤1.初始化系统控制
& //PLL, 看门狗,使能外设时钟
& & InitSysCtrl();
& //步骤2.初始化GPIO
& //InitGpio(); //在这里省略,只需配置以下与SCI有关的GPIO即可
& & EALLOW; & & & & & & //注意,需要EALLOE保护
& & GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4 = 1;
& & GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5 = 1;
& & GpioMuxRegs.GPGMUX.bit.SCITXDB_GPIOG4 = 1;
& & GpioMuxRegs.GPGMUX.bit.SCIRXDB_GPIOG5 = 1;
& & EDIS; & & & & & & & //与EALLOW对应使用
& //步骤3.清除所有的中断并初始化PIE中断向量表
& & DINT; & & & & & & & //禁止CPU中断
& & InitPieCtrl(); & & & //初始化PIE控制寄存器
& & IER = 0x0000; & & & //禁止 CPU 中断,并清除所有的 CPU 中断标志
& & IFR = 0x0000;
& & InitPieVectTable(); //初始化 PIE 中断向量表,将相应的中断向量指向中断服务程
& //序,当中断发生时跳转到相应的中断服务程序处
& & EALLOW; & & & & //寄存器需要 EALLOE 保护&
& & PieVectTable.RXAINT = &sciaRxFifoI
& & PieVectTable.TXAINT = &sciaTxFifoI
& & PieVectTable.RXBINT = &scibRxFifoI
& & PieVectTable.TXBINT = &scibTxFifoI
& & EDIS; & //与 EALLOW 对应使用
& //步骤4.初始化外设
& //InitPeripherals(); & & & //在本程序中可以省略
& & & & scia_fifo_init(); & & & //初始化SCI-A
& & & & scib_fifo_init(); & & & //初始化SCI-B
& //步骤5.用户程序段,使能中断
& //初始化要发送的数据
& & for(i = 0; i&8; i++)
& & & sdataA[i] =
& & for(i = 0; i&8; i++)
& & & sdataB[i] = 0xFF -
& & rdata_pointA = sdataA[0];
& & rdata_pointB = sdataB[0];
& //使能所需的中断
& & PieCtrlRegs.PIECRTL.bit.ENPIE = 1; & //使能 PIE 模块
& & PieCtrlRegs.PIEIER9.bit.INTx1=1; & & //PIE Group 9, INT1
& & PieCtrlRegs.PIEIER9.bit.INTx2=1; & & //PIE Group 9, INT2
& & PieCtrlRegs.PIEIER9.bit.INTx3=1; & & //PIE Group 9, INT3
& & PieCtrlRegs.PIEIER9.bit.INTx4=1; & & //PIE Group 9, INT4
& & IER = 0x100; & & & & & & & & & & //使能 CPU 中断
& //步骤6.空循环
& for(;;);
void error(void)
& & asm(& & & ESTOP0&); //Test failed!! Stop!
& & for (;;);
//SCIA 发送中断服务程序
interrupt void sciaTxFifoIsr(void)
& & Uint16
& & for(i=0; i& 8; i++)
& & SciaRegs.SCITXBUF=sdataA[i]; & & //发送数据
& & for(i=0; i& 8; i++) & & & & & & & & & //要发送的下一个数据
& & sdataA[i] = (sdataA[i]+1) & 0x00FF;
SciaRegs.SCIFFTX.bit.TXINTCLR=1; & & //清除 SCI 中断使能位
PieCtrlRegs.PIEACK.all|=0x100; & &&
//SCIA 接收中断服务程序
interrupt void sciaRxFifoIsr(void)
& & Uint16
for(i=0;i&8;i++)
& rdataA[i]=SciaRegs.SCIRXBUF. //读取数据
for(i=0;i&8;i++) & & & & & & & & & & & //检查接收到的数据
& if(rdataA[i] != ( (rdata_pointA+i) & 0x00FF) ) error();
rdata_pointA = (rdata_pointA+1) & 0x00FF;
SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1; & & //清除溢出标志位
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1; & & //清除中断标志位
PieCtrlRegs.PIEACK.all|=0x100; & & & &
//SCIA 初始化函数
void scia_fifo_init()
& & SciaRegs.SCICCR.all =0x0007;
& & //一个停止位,没有奇偶校验位,8位数据位,同步模式
& //使能发送、接收和内部时钟,禁止RX ERR、SLEEP、TXWAKE
& & SciaRegs.SCICTL1.all =0x0003; &
& & SciaRegs.SCICTL2.bit.TXINTENA =1;
& & SciaRegs.SCICTL2.bit.RXBKINTENA =1;
& & SciaRegs.SCIHBAUD = 0x0000;
& & SciaRegs.SCILBAUD = SCI_PRD;
& & SciaRegs.SCICCR.bit.LOOPBKENA =1; & //使能内部自循环
& & SciaRegs.SCIFFTX.all=0xC028;
& & SciaRegs.SCIFFRX.all=0x0028;
& & SciaRegs.SCIFFCT.all=0x00;
& & SciaRegs.SCICTL1.all =0x0023; & &
& & SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;
& & SciaRegs.SCIFFRX.bit.RXFIFORESET=1;
//SCIB 发送中断服务程序
interrupt void scibTxFifoIsr(void)
& & Uint16
& & for(i=0; i& 8; i++)
& & ScibRegs.SCITXBUF=sdataB[i]; & & //发送数据
& & for(i=0; i& 8; i++) & & & & & & & & & & //要发送的下一个数据
& & sdataB[i] = (sdataB[i]-1) & 0x00FF;
ScibRegs.SCIFFTX.bit.TXINTCLR=1; & & //清除 SCI 中断标志位&
PieCtrlRegs.PIEACK.all|=0x100; & & &
//SCIB 接收中断服务程序
interrupt void scibRxFifoIsr(void)
& & Uint16
for(i=0;i&8;i++)
& rdataB[i]=ScibRegs.SCIRXBUF. //读取数据
for(i=0;i&8;i++) & & & & & & & & & & & //检查接收到的数据
& if(rdataB[i] != ( (rdata_pointB-i) & 0x00FF) ) error();
rdata_pointB = (rdata_pointB-1) & 0x00FF;
ScibRegs.SCIFFRX.bit.RXFFOVRCLR=1; & & //清除溢出标志位
ScibRegs.SCIFFRX.bit.RXFFINTCLR=1; & //清除中断标志位
PieCtrlRegs.PIEACK.all|=0x100; &
//SCIB 初始化函数
void scib_fifo_init()
& & ScibRegs.SCICCR.all =0x0007;&
& & //一个停止位,没有奇偶校验位,8位数据位,同步模式,空闲线模式
& & ScibRegs.SCICTL1.all =0x0003;
& & //使能发送、接收和内部时钟,禁止RX ERR、SLEEP、TXWAKE
& & ScibRegs.SCICTL2.bit.TXINTENA =1;
& & ScibRegs.SCICTL2.bit.RXBKINTENA =1;
& & ScibRegs.SCIHBAUD & &=0x0000;
& & ScibRegs.SCILBAUD & &=SCI_PRD;
& & ScibRegs.SCICCR.bit.LOOPBKENA =1; & //使能内部自循环
& & ScibRegs.SCIFFTX.all=0xC028;
& & ScibRegs.SCIFFRX.all=0x0028;
& & ScibRegs.SCIFFCT.all=0x00;
& & ScibRegs.SCICTL1.all =0x0023; &&
& & ScibRegs.SCIFFTX.bit.TXFIFOXRESET=1;
& & ScibRegs.SCIFFRX.bit.RXFIFORESET=1;
&//#####################################################################
//文件: &Example_281xSci_FFDLB.c
//说明: &该程序是SCI内部自测试程序,程序首先发送数据0x00到0xFF,
// & & & 然后接收数据,并将接收到的数据与发送的数据进行比较
//测试变量: ErrorCount:接收数据中错位数据的个数
//#####################################################################
#include &DSP281x_Device.h&
#include &DSP281x_Examples.h&
//功能函数原型
void scia_loopback_init(void);
void scia_fifo_init(void);
void scia_xmit(int a);
void error(int);
interrupt void scia_rx_isr(void);
interrupt void scia_tx_isr(void);
//全局变量
Uint16 LoopC
Uint16 ErrorC&
void main(void)
& & Uint16 SendC
& & Uint16 ReceivedC
& & //步骤1.初始化系统控制(PLL,看门狗,使能外设时钟)
InitSysCtrl();
& //步骤2.初始化GPIO
& & //InitGpio(); //在本例中可以省略,只需配置与SCI相关的GPIO即可
& & EALLOW;
& & GpioMuxRegs.GPFMUX.all=0x0030; & //设置I/O口为SCI口&
& //步骤3.初始化中断向量表,禁止并清除所有的 CPU 中断
IER = 0x0000;
IFR = 0x0000;
& //初始化 PIE 控制寄存器到默认状态
& & //InitPieCtrl(); & & & //本例子中不用 PIE
& & InitPieVectTable(); &
& & EnableInterrupts(); & //使能 CPU 和 PIE 中断
& //步骤4.初始化所有的外设
& & //InitPeripherals(); //SCI测试时跳过此函数
& //步骤5.用户定义程序段、分配向量、使能中断
& & LoopCount = 0;
& & ErrorCount = 0;
& & scia_fifo_init(); & & //初始化SCI FIFO
& & scia_loopback_init(); & //初始化 SCI 为自循环模式
& & SendChar = 0; & & & & & //初始化发送变量
& //步骤6.发送数据并检测接收到的数据
& & & & scia_xmit(SendChar);
& & & & while(SciaRegs.SCIFFRX.bit.RXFIFST !=1) { }&
& //等待 XRDY =1 (空闲态),即等待数据发送
& & ReceivedChar = SciaRegs.SCIRXBUF. //检测接收到的数据
if(ReceivedChar != SendChar) error(1);
& & & & SendChar++; & & & & & //转移到下一个发送的数据,并重复该操作
& & & & SendChar &= 0x00FF; //限制发送数据为8位格式
& & LoopCount++;
void error(int ErrorFlag)
& & ErrorCount++;
& //asm(& & & ESTOP0&); &//Uncomment to stop the test here
& //for (;;);
//测试1, SCIA DLB, 8位数据格式, 波特率为0x000F, default, 1个停止位,没有奇偶校验位&
void scia_loopback_init()
& & //注意,如果SCIA的时钟没有打开,那么需要软件打开,用InitSysCtrl()函数
& & SciaRegs.SCICCR.all =0x0007; &
& //1个停止位、无奇偶校验位、8位数据格式、同步模式、空闲线模式
& & SciaRegs.SCICTL1.all =0x0003; &
& //使能发送、接收、和内部时钟,禁止RX EER、SLEEP、TXWAKE
& SciaRegs.SCICTL2.all =0x0003;&
& SciaRegs.SCICTL2.bit.TXINTENA =1;
SciaRegs.SCICTL2.bit.RXBKINTENA =1;
& & SciaRegs.SCIHBAUD=0x0000;
& & SciaRegs.SCILBAUD=0x000F;
SciaRegs.SCICCR.bit.LOOPBKENA =1; //使能自循环 &
SciaRegs.SCICTL1.all =0x0023; & &
//发送数据函数
void scia_xmit(int a)
& & SciaRegs.SCITXBUF=a;
//初始化SCI FIFO
void scia_fifo_init()
& & SciaRegs.SCIFFTX.all=0xE040;
& & SciaRegs.SCIFFRX.all=0x204f;
& & SciaRegs.SCIFFCT.all=0x0;
【】【】【】【】
上一篇:下一篇:
CopyRight @
单片机教程网 51hei.com , All Rights Reserved

我要回帖

更多关于 F2812可以同时控制 的文章

 

随机推荐