这两天在调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中断通信实验相关推荐

  1. DSP28335的SCI的FIFO中断使用心得

    自学了一段时间的DSP28335的串口设置,写下来帮助更多的新手,遇到了很多问题也记录一些解决办法. 以下全都是我个人的理解,可能说的不对,大家讨论. 1.关于为什么必须用FIFO 一般的DSP系统, ...

  2. 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 ...

  3. 【嵌入式基础】串口中断通信VS串口DMA通信

    目录 目录 前言 一.串口通信 1. 通信方式 2.通信速率 3.串口通信的三种工作方式 二.串口中断通信 1.串口中断特点 2.CubeMX配置初始化串口中断相关外设 3.串口中断程序分析 4.实验 ...

  4. android spi串口调试,PIC入门3,SPI通信和串口调试实验

    原标题:PIC入门3,SPI通信和串口调试实验 MSSP模块工作于SPI主控方式,这个可以直接在实验板上执行. 程序: //适合3EPIC实验板,配置PIC的MSSP模块工作于SPI主控方式下, // ...

  5. STM32之USART-串口通信(含串口实验详细解析)

    STM32之串口通信 - USART(含串口实验详细解析) 开发环境:Window 10 开发工具:Keil uVision5 MDK 硬件:STM32F103 资料参考: [正点原子]STM32F1 ...

  6. 15_串口中断通信寄存器即库函数配置编写实例

    串口中断通信寄存器即库函数配置编写实例 目录 串口中断通信寄存器即库函数配置编写实例 常用的串口相关寄存器: 波特率计算方法: USART_InitTypeDef结构体详解: 串口配置一般步骤: 调试 ...

  7. STM32CubeMX实现串口DMA中断通信

    文章目录 一. 环境 二. 使用STM32CubeMX 三. USART DMA中断通信 1. UART函数库介绍 2. 编写代码 3. 最终效果 四. 软件调试 五. 总结 一. 环境 硬件:stm ...

  8. 学习通信原理之——从实验中理解频谱/功率谱/功率谱密度(MATLAB演示)

    我的个人博客文章链接如下:学习通信原理之--从实验中理解频谱/功率谱/功率谱密度(MATLAB演示) 前言 最近在复习通信原理,每次到了功率谱这一块就感到困惑,每次都要去查,我觉得不能再这样循环下去了 ...

  9. STM32CubeMX实现串口中断通信

    文章目录 一. 环境 二. 使用STM32CubeMX 三. USART中断通信 1. UART函数库介绍 2. 编写代码 3. 最终效果 四. 软件调试 五. 总结 一. 环境 硬件:stm32f1 ...

最新文章

  1. 轻量级web api_10个很棒的JavaScript库,提升Web开发效率
  2. 前沿资讯|Spring Native 0.11.2、Spring Authorization Server 0.2.2 发布
  3. ES6转ES5:Gulp+Babel
  4. eclipse 提交git失败_简单10步教你使用eclipse整合gitee码云实现共享开发
  5. placeholder的兼容处理(jQuery下)
  6. 镭威视监控怎么复位_三大原因导致海康威视、大华股份近期连续暴跌
  7. 版权监控中心怎么关闭_防火门监控系统让消防通道疏散更安全
  8. java 缓存清理echo_“kill -9”一时爽,秋后算账泪两行
  9. oracle监听服务无法启动不了,关于ORACLE监听服务无法启动的问题
  10. 解决SqlServer添加维护计划时出现“代理XP组件已作为此服务器安全配置的一部分被关闭。系统管理员可以使用……”
  11. Java中的双冒号::是什么玩意?有这个语法?
  12. 转载:谈谈BM25评分
  13. QUIC协议是如何做到0RTT加密传输的(addons)
  14. python实时语音转写_语音识别 - 实时语音转写 - 《科大讯飞REST_API开发指南》 - 书栈网 · BookStack...
  15. Origin作图点太密集处理方法
  16. 自己动手写ORB特征
  17. unturend服务器修改背包,未转变者如何修改背包容量 | 手游网游页游攻略大全
  18. 正则表达式里“-“中划线的使用注意
  19. 牛牛的宝可梦Go(dp+floyd)
  20. 微信小程序 video 视频播放卡顿

热门文章

  1. git 忽略文件 .gitignore 以及规则
  2. Linux学习笔记--文件夹结构
  3. 使用bash判断PATH中是否存在某个路径
  4. 创建型模式(一):FactoryMethod ( 工厂方法 )
  5. [试卷]古诗文背诵(七年级上学期)
  6. 在C#中利用SharpZipLib进行文件的压缩和解压缩
  7. rufus中gpt和mrb磁盘_UEFI/BIOS/MBR/GPT启动过程详解与常见系统启动问题
  8. 汉堡王什么汉堡好吃_315 曝光用过期面包做汉堡:汉堡王到底怎么了?
  9. python 钉钉消息推送_python3实现钉钉消息推送的方法示例
  10. 跑monkey需要安装什么_坤秀为您解析无漆木门安装需要注意什么?