14300|8

10

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

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     {
            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     {
            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中断的进入。当想发送数据的时候就将中断标志清零,进入中断程序之后再进行数据加载发送。还可以添加标志位来确定在中断程序中发送那些数据。

大家如果觉得代码有问题,希望大家留言。

最新回复

您好,我用串口调试助手给DSP板子发数据(每次发送73个数据,但我只想要前31个数据),用SCIC进行通信,但在CCS6中用SCI的FIFO 中断来接收数据,为什么总是接收不到正确的数据,很不稳定,有时能接收正确的数据但只有16个,我定的接收数组是31个元素的,请问如何解决,才能正确的接收31个数据呢,请您指教,谢谢   详情 回复 发表于 2018-7-23 10:23

赞赏

1

查看全部赞赏

 
点赞 关注

回复
举报

1万

帖子

25

TA的资源

裸片初长成(高级)

沙发
 
我也曾使用FIFO中断处理过串口数据,用的深度是4,每四个字节中断一次。

在发送方,均以4的倍数发送。
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
dontium 发表于 2016-8-14 21:43
我也曾使用FIFO中断处理过串口数据,用的深度是4,每四个字节中断一次。

在发送方,均以4的倍数发送。

在实际用的时候肯定要以倍数发送。不然可能不能及时进入中断吧
 
 
 

回复

37

帖子

0

TA的资源

一粒金砂(中级)

4
 
为什么我打开串口软件的时候只能看到一个串口呢???
 
 
 

回复

37

帖子

0

TA的资源

一粒金砂(中级)

5
 
请问一下SCIA串口怎么接线和PC端相连??谢谢

点评

[attachimg]267260[/attachimg] 你用的假设是28,29两个引脚,这要把这两个引脚通过MAX3232转换成232串口输出,再用串口转USB线连接到电脑上就可以了吧。电脑上只看到一个串口是因为你只连接了一个USB转串口线到电脑  详情 回复 发表于 2016-11-16 09:49
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

6
 
wangcen 发表于 2016-11-10 14:37
请问一下SCIA串口怎么接线和PC端相连??谢谢


你用的假设是28,29两个引脚,这要把这两个引脚通过MAX3232转换成232串口输出,再用串口转USB线连接到电脑上就可以了吧。电脑上只看到一个串口是因为你只连接了一个USB转串口线到电脑上吧。打开设备管理器看一下具体连接的是哪个串口。
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(中级)

7
 
博主做过FIFO模式下的eeprom吗?28335深度16级,这样每次发16个,速度会不会降低呢?有没有什么办法一次性发自己想要的次数,而不是16个呢?
 
 
 

回复

37

帖子

0

TA的资源

一粒金砂(中级)

8
 
我使用的SCI普通模式,在运行的时候给单片机发送一个数据,通过RXRDY的跳变判断接收到新数据再返回采集数据,但是在运行过程中发现用串口助手给板子发送数据,RXRDY这一位始终没有发送跳变置位啊,为什么呢?
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

9
 
您好,我用串口调试助手给DSP板子发数据(每次发送73个数据,但我只想要前31个数据),用SCIC进行通信,但在CCS6中用SCI的FIFO 中断来接收数据,为什么总是接收不到正确的数据,很不稳定,有时能接收正确的数据但只有16个,我定的接收数组是31个元素的,请问如何解决,才能正确的接收31个数据呢,请您指教,谢谢
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表