TMS320F28335的SCI通信-FIFO中断通信实验
这两天在调28335的SCI通信,现在把实验过程跟大家分享:1.实验过程:通过串口调试助手1向DSP的SCIA接口发送一段代码,DSP接收到数据之后通过SCIB接口发送到串口软件2.同样串口软件通过SCIB向DSP发送数据,DSP通过SCIA发送到串口软件1.
2.实验说明:本例中使用了接收FIFO中断,但是并没有使用发送FIFO中断,而是使用判断标志位的方法发送数据。
3.实验代码:
#include "DSP28x_Project.h" // Device Headerfile and Examples Include File
#include "string.h"
// Prototype statements for functions found within this file.
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);
void scib_xmit(int a);
void scib_msg(char *msg);
void scia_xmit(int a);
void scia_msg(char *msg);
char m[12]={'1','2','3','4','5','6','7','8','a','s','d','f'};
void main(void)
{
InitSysCtrl();
InitSciGpio();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.SCIRXINTA = &sciaRxFifoIsr;
PieVectTable.SCITXINTA = &sciaTxFifoIsr;
PieVectTable.SCIRXINTB = &scibRxFifoIsr;
PieVectTable.SCITXINTB = &scibTxFifoIsr;
EDIS; // This is needed to disable write to EALLOW protected registers
scia_fifo_init(); // Init SCI-A
scib_fifo_init(); // Init SCI-B
scib_msg(m);
scia_msg(m);//先发送数据判断串口是否工作正常
// Enable interrupts required for this example
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block
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; // Enable CPU INT
EINT;
while(1)
{
}
}
void error(void)
{
asm(" ESTOP0"); // Test failed!! Stop!
for (;;);
}
interrupt void sciaTxFifoIsr(void)
{
Uint16 i;
for(i=0;i<12;i++)
{
SciaRegs.SCITXBUF=m;
}
// ScibRegs.SCIFFTX.bit.TXFFINTCLR=1;//清楚发送FIFO中断标志位。在此处如果清零会导致发送FIFO中断一直产生,因此要关闭才行
PieCtrlRegs.PIEACK.bit.ACK9=1;
}
interrupt void sciaRxFifoIsr(void)
{
Uint16 i;
for(i=0;i<12;i++)
{
m=SciaRegs.SCIRXBUF.all;
}
scib_msg(m);
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;
// ScibRegs.SCIFFTX.bit.TXFFINTCLR=1;
PieCtrlRegs.PIEACK.bit.ACK9=1;
}
void scia_fifo_init()
{
SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback
// No parity,8 char bits,
// async mode, idle-line protocol
SciaRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK,
// Disable RX ERR, SLEEP, TXWAKE
// ScibRegs.SCICTL2.bit.TXINTENA =1;
// ScibRegs.SCICTL2.bit.RXBKINTENA =1;
SciaRegs.SCIHBAUD =0x0000;
SciaRegs.SCILBAUD =0x0079;
SciaRegs.SCIFFTX.bit.SCIFFENA=1;//使能FIFO
SciaRegs.SCIFFTX.bit.SCIRST=1;//继续执行功能
SciaRegs.SCIFFTX.bit.TXFFIENA=0;//不使能发送FIFO中断
SciaRegs.SCIFFTX.bit.TXFFIL=0x0C;//12级FIFO使能
SciaRegs.SCIFFTX.bit.TXFFINTCLR=1;
SciaRegs.SCIFFTX.bit.TXFIFOXRESET=0;
SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;
SciaRegs.SCIFFRX.bit.RXFIFORESET=0;
SciaRegs.SCIFFRX.bit.RXFFIENA=1;
SciaRegs.SCIFFRX.bit.RXFFIL=0x0C;
SciaRegs.SCIFFCT.all=0x00;
SciaRegs.SCICTL1.bit.SWRESET=1;//Relinquish SCI from Reset
SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;
SciaRegs.SCIFFRX.bit.RXFIFORESET=1;
}
interrupt void scibTxFifoIsr(void)
{
Uint16 i;
for(i=0;i<12;i++)
{
ScibRegs.SCITXBUF=m;
}
// ScibRegs.SCIFFTX.bit.TXFFINTCLR=1;//清除发送FIFO中断标志位。在此处如果清零会导致发送FIFO中断一直产生,因此要关闭才行
PieCtrlRegs.PIEACK.bit.ACK9=1;
}
interrupt void scibRxFifoIsr(void)
{
Uint16 i;
for(i=0;i<12;i++)
{
m=ScibRegs.SCIRXBUF.all;
}
scia_msg(m);
ScibRegs.SCIFFRX.bit.RXFFINTCLR=1;
// ScibRegs.SCIFFTX.bit.TXFFINTCLR=1;
PieCtrlRegs.PIEACK.bit.ACK9=1;
}
void scib_fifo_init()
{
ScibRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback
// No parity,8 char bits,
// async mode, idle-line protocol
ScibRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK,
// Disable RX ERR, SLEEP, TXWAKE
// ScibRegs.SCICTL2.bit.TXINTENA =1;
// ScibRegs.SCICTL2.bit.RXBKINTENA =1;
ScibRegs.SCIHBAUD =0x0000;
ScibRegs.SCILBAUD =0x0079;
ScibRegs.SCIFFTX.bit.SCIFFENA=1;//使能FIFO
ScibRegs.SCIFFTX.bit.SCIRST=1;//继续执行功能
ScibRegs.SCIFFTX.bit.TXFFIENA=0;//不使能发送FIFO中断
ScibRegs.SCIFFTX.bit.TXFFIL=0x0C;//12级FIFO使能
ScibRegs.SCIFFTX.bit.TXFFINTCLR=1;
ScibRegs.SCIFFTX.bit.TXFIFOXRESET=0;
// ScibRegs.SCIFFTX.all=0xC02C;
ScibRegs.SCIFFRX.bit.RXFFOVRCLR=1;
ScibRegs.SCIFFRX.bit.RXFFINTCLR=1;
ScibRegs.SCIFFRX.bit.RXFIFORESET=0;
ScibRegs.SCIFFRX.bit.RXFFIENA=1;
ScibRegs.SCIFFRX.bit.RXFFIL=0x0C;
ScibRegs.SCIFFCT.all=0x00;
ScibRegs.SCICTL1.bit.SWRESET=1;//Relinquish SCI from Reset
ScibRegs.SCIFFTX.bit.TXFIFOXRESET=1;
ScibRegs.SCIFFRX.bit.RXFIFORESET=1;
}
// Transmit a character from the SCI
void scib_xmit(int a)
{
while (ScibRegs.SCICTL2.bit.TXRDY == 0) {}
ScibRegs.SCITXBUF=a;
}
void scib_msg(char * msg)
{
Uint16 len;
Uint16 i;
len=(strlen(msg)-1);
for(i=0;i<len;i++)
{
scib_xmit(msg);
}
// return 0;
}
void scia_xmit(int a)//单个字符发送代码
{
while (SciaRegs.SCICTL2.bit.TXRDY == 0) {}
SciaRegs.SCITXBUF=a;
}
void scia_msg(char * msg)//发送字符串代码
{
Uint16 len;
Uint16 i;
len=(strlen(msg)-1);
for(i=0;i<len;i++)
{
scia_xmit(msg);
}
// return 0;
}
//===========================================================================
// No more.
//===========================================================================
4.实验结果如下所示:
5.说明:因为使用了FIFO中断,因此只有FIFO接收到12个数据之后才会进入中断读取数据,因此一次接收的数据不是很完全。使用FIFO的好处就是避免程序频繁进入中断。为了避免出现乱码,要根据要发送的字节来选择合适的波特率。串口1软件就是我自己写的软件(就是图中大的串口显示的),串口2就是浮在串口1软件上面的那个。
6.下面一段代码是用发送FIFO中断发送数据的,给大家参考。
#include "DSP28x_Project.h" // Device Headerfile and Examples Include File
// Prototype statements for functions found within this file.
interrupt void scibTxFifoIsr(void);
interrupt void scibRxFifoIsr(void);
void scib_fifo_init(void);
void error(void);
char m[12]="12345678abcd";
void main(void)
{
InitSysCtrl();
InitSciGpio();
DINT;
InitPieCtrl();
// Disable CPU interrupts and clear all CPU interrupt flags:
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.SCIRXINTB = &scibRxFifoIsr;
PieVectTable.SCITXINTB = &scibTxFifoIsr;
EDIS; // This is needed to disable write to EALLOW protected registers
scib_fifo_init(); // Init SCI-B
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block
PieCtrlRegs.PIEIER9.bit.INTx3=1; // PIE Group 9, INT3
PieCtrlRegs.PIEIER9.bit.INTx4=1; // PIE Group 9, INT4
IER = 0x100; // Enable CPU INT
EINT;
for(;;);
}
void error(void)
{
asm(" ESTOP0"); // Test failed!! Stop!
for (;;);
}
interrupt void scibTxFifoIsr(void)
{
Uint16 i;
for(i=0;i<12;i++)
{
ScibRegs.SCITXBUF=m;
}
// ScibRegs.SCIFFTX.bit.TXFFINTCLR=1;//清楚发送FIFO中断标志位。在此处如果清零会导致发送FIFO中断一直产生,因此要关闭才行
PieCtrlRegs.PIEACK.bit.ACK9=1;
}
interrupt void scibRxFifoIsr(void)
{
Uint16 i;
for(i=0;i<12;i++)
{
m=ScibRegs.SCIRXBUF.all;
}
ScibRegs.SCIFFRX.bit.RXFFINTCLR=1;
ScibRegs.SCIFFTX.bit.TXFFINTCLR=1;
PieCtrlRegs.PIEACK.bit.ACK9=1;
}
void scib_fifo_init()
{
ScibRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback
// No parity,8 char bits,
// async mode, idle-line protocol
ScibRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK,
// Disable RX ERR, SLEEP, TXWAKE
// ScibRegs.SCICTL2.bit.TXINTENA =1;
// ScibRegs.SCICTL2.bit.RXBKINTENA =1;
ScibRegs.SCIHBAUD =0x0001;
ScibRegs.SCILBAUD =0x00E7;
ScibRegs.SCIFFTX.bit.SCIFFENA=1;//使能FIFO
ScibRegs.SCIFFTX.bit.SCIRST=1;//继续执行功能
ScibRegs.SCIFFTX.bit.TXFFIENA=1;//使能发送FIFO中断
ScibRegs.SCIFFTX.bit.TXFFIL=0x0C;//12级FIFO使能
ScibRegs.SCIFFTX.bit.TXFFINTCLR=1;
ScibRegs.SCIFFTX.bit.TXFIFOXRESET=0;
ScibRegs.SCIFFRX.bit.RXFFOVRCLR=1;
ScibRegs.SCIFFRX.bit.RXFFINTCLR=1;
ScibRegs.SCIFFRX.bit.RXFIFORESET=0;
ScibRegs.SCIFFRX.bit.RXFFIENA=1;
ScibRegs.SCIFFRX.bit.RXFFIL=0x0C;
ScibRegs.SCIFFCT.all=0x00;
ScibRegs.SCICTL1.bit.SWRESET=1;//Relinquish SCI from Reset
ScibRegs.SCIFFTX.bit.TXFIFOXRESET=1;
ScibRegs.SCIFFRX.bit.RXFIFORESET=1;
}
//===========================================================================
// No more.
//===========================================================================
之前上网查资料的时候,看到有人说在不使用FIFO的情况下需要先发送一个数据才能进入中断。可以使用 ScibRegs.SCIFFTX.bit.TXFFINTCLR=1;来控制发送FIFO中断的进入。当想发送数据的时候就将中断标志清零,进入中断程序之后再进行数据加载发送。还可以添加标志位来确定在中断程序中发送那些数据。
大家如果觉得代码有问题,希望大家留言。
此帖出自TI C2000论坛
TMS320F28335的SCI通信-FIFO中断通信实验相关推荐
- DSP28335的SCI的FIFO中断使用心得
自学了一段时间的DSP28335的串口设置,写下来帮助更多的新手,遇到了很多问题也记录一些解决办法. 以下全都是我个人的理解,可能说的不对,大家讨论. 1.关于为什么必须用FIFO 一般的DSP系统, ...
- TI DSP 28335 SCI FIFO中断 串口232通信
文章目录 前言 1 SCIA FIFO 串口通信配置步骤 1.1 使能SCIA外设时钟 1.2 初始化SCIA对应GPIO 1.3 SCI工作方式 1.3.1 数据格式 1.3.2 波特率 1.3.3 ...
- 【嵌入式基础】串口中断通信VS串口DMA通信
目录 目录 前言 一.串口通信 1. 通信方式 2.通信速率 3.串口通信的三种工作方式 二.串口中断通信 1.串口中断特点 2.CubeMX配置初始化串口中断相关外设 3.串口中断程序分析 4.实验 ...
- android spi串口调试,PIC入门3,SPI通信和串口调试实验
原标题:PIC入门3,SPI通信和串口调试实验 MSSP模块工作于SPI主控方式,这个可以直接在实验板上执行. 程序: //适合3EPIC实验板,配置PIC的MSSP模块工作于SPI主控方式下, // ...
- STM32之USART-串口通信(含串口实验详细解析)
STM32之串口通信 - USART(含串口实验详细解析) 开发环境:Window 10 开发工具:Keil uVision5 MDK 硬件:STM32F103 资料参考: [正点原子]STM32F1 ...
- 15_串口中断通信寄存器即库函数配置编写实例
串口中断通信寄存器即库函数配置编写实例 目录 串口中断通信寄存器即库函数配置编写实例 常用的串口相关寄存器: 波特率计算方法: USART_InitTypeDef结构体详解: 串口配置一般步骤: 调试 ...
- STM32CubeMX实现串口DMA中断通信
文章目录 一. 环境 二. 使用STM32CubeMX 三. USART DMA中断通信 1. UART函数库介绍 2. 编写代码 3. 最终效果 四. 软件调试 五. 总结 一. 环境 硬件:stm ...
- 学习通信原理之——从实验中理解频谱/功率谱/功率谱密度(MATLAB演示)
我的个人博客文章链接如下:学习通信原理之--从实验中理解频谱/功率谱/功率谱密度(MATLAB演示) 前言 最近在复习通信原理,每次到了功率谱这一块就感到困惑,每次都要去查,我觉得不能再这样循环下去了 ...
- STM32CubeMX实现串口中断通信
文章目录 一. 环境 二. 使用STM32CubeMX 三. USART中断通信 1. UART函数库介绍 2. 编写代码 3. 最终效果 四. 软件调试 五. 总结 一. 环境 硬件:stm32f1 ...
最新文章
- 轻量级web api_10个很棒的JavaScript库,提升Web开发效率
- 前沿资讯|Spring Native 0.11.2、Spring Authorization Server 0.2.2 发布
- ES6转ES5:Gulp+Babel
- eclipse 提交git失败_简单10步教你使用eclipse整合gitee码云实现共享开发
- placeholder的兼容处理(jQuery下)
- 镭威视监控怎么复位_三大原因导致海康威视、大华股份近期连续暴跌
- 版权监控中心怎么关闭_防火门监控系统让消防通道疏散更安全
- java 缓存清理echo_“kill -9”一时爽,秋后算账泪两行
- oracle监听服务无法启动不了,关于ORACLE监听服务无法启动的问题
- 解决SqlServer添加维护计划时出现“代理XP组件已作为此服务器安全配置的一部分被关闭。系统管理员可以使用……”
- Java中的双冒号::是什么玩意?有这个语法?
- 转载:谈谈BM25评分
- QUIC协议是如何做到0RTT加密传输的(addons)
- python实时语音转写_语音识别 - 实时语音转写 - 《科大讯飞REST_API开发指南》 - 书栈网 · BookStack...
- Origin作图点太密集处理方法
- 自己动手写ORB特征
- unturend服务器修改背包,未转变者如何修改背包容量 | 手游网游页游攻略大全
- 正则表达式里“-“中划线的使用注意
- 牛牛的宝可梦Go(dp+floyd)
- 微信小程序 video 视频播放卡顿
热门文章
- git 忽略文件 .gitignore 以及规则
- Linux学习笔记--文件夹结构
- 使用bash判断PATH中是否存在某个路径
- 创建型模式(一):FactoryMethod ( 工厂方法 )
- [试卷]古诗文背诵(七年级上学期)
- 在C#中利用SharpZipLib进行文件的压缩和解压缩
- rufus中gpt和mrb磁盘_UEFI/BIOS/MBR/GPT启动过程详解与常见系统启动问题
- 汉堡王什么汉堡好吃_315 曝光用过期面包做汉堡:汉堡王到底怎么了?
- python 钉钉消息推送_python3实现钉钉消息推送的方法示例
- 跑monkey需要安装什么_坤秀为您解析无漆木门安装需要注意什么?