F28335微控制器的串行通信接口(SCI)模块

F28335的SCI模块

标签: DSP


TMS320F28335内部有三个SCI模块,SCIA、SCIB、SCIC

外部只有两个输入输出引脚TXD、RXD:

  • SCIA对应GPIO28/29和GPIO35/36两组可选;
  • SCIB有四组管脚可以选择,分别是 O9/11,GPIO14/15,GPIO18/19,GPIO22/23;
  • SCIC对应的是GPIO62/63。

  • SCI模块主要寄存器

    SCICCR 通信控制寄存器
    SCICTL 控制寄存器 发送空标志位、接收和发送中断使能
    SCIRXST 接收状态寄存器 接收数据的错误标志位、就绪标志位、接收被间断、帧格式错误标志位
    SCIRXD sci异步接收引脚
    SCITXD sci异步发送引脚
    SCIHBAD/SCILBAUD 波特率发生器 由LSPCLK预分频时钟输入
    TXINT 发送中断信号
    RXINT 接收中断信号

    SCITXBUF 发送缓冲器,存放要发送的数据,字符从SCITXBUF装载到TXSHF中会将RXRDY置位,表明SCITXBUF可接收 新的字符
    TXRDY 发送器缓冲寄存器就绪标志位系统复位和软件复位可将此位置1.发送器(scitxbuf)为空时该位为1,写发送器该位变 低

    TXSHF 发送移位寄存器,从SCITXBUF中接收数据,并通过SCITXD引脚发送出去
    RXSHF 接收移位寄存器,从SCIRXD引 脚接收数据
    SCIRXBUF 接收缓冲器,供CPU读取,外部输入首先载入到RXSHF中,然后装载到SCIRXBUF和SCIRXXEMU寄存器中。
    SCIRXEMU 仿真缓冲寄存器

    接收到的数据从 RXSHF 传送到 SCIRXEMU 和 SCIRXBUF。传送完成以后 RXRDY (bit SCIRXST.6)置位,表明接收的数据已被读取。两个寄存器的数值完全一样,它们有各自独立的地址,但是共用一个物理存储空间。他们唯一的区别就是,读取 SCIRXEMU的数据不会清除 RXRDY 位,而读取 SCIRXBUF 会清除 RXRDY 位。因此一般读取 SCI接收的数据都是读取 SCIRXBUF 寄存器。SCIRXEMU 寄存器主要用于仿真时,因为它可以不清除 RXRDY 标志位而不断读取接收到的数据。在系统复位时 SCIRXEMU被清空

    RXRDY 接收器就绪标志位 读SCIRXBUF寄存器、软件复位、系统复位都可将该位清零。
    SCIFFRX FIFO接收寄存器
    SCIFFTX FIFIO发送寄存器
    SCIFFCT FIFO控制寄存器
    SCIPRI 优先权控制寄存器

    数据格式

    通过对SCICCR通信控制寄存器进行配置,可选择不同的帧结构

    典型数据帧格式
    1位起始位
    1-8位数据位(LSB低位先行)
    1个奇/偶校验位
    1位或2位停止位

    通信格式

    既可以使用单线(半双工)也可以使用双线(全双工)通信
    接收器在接收到一个有效的起始位后开始工作,一个有效的起始位由持续时间多于4个 SCICLK周期的低电平信号标明。

    SCI数据流

    1.一个发送器(TX)的相关寄存器:发送数据缓冲寄存器(SCITXBUF)和发送移位寄存器(TXSHF)
    数据流向为:发送数据–>SCITXBUF–>TXSHF—>SCITXD发送出去;
    2.一个接收器(RX)的相关寄存器:接收数据缓冲寄存器(SCIRXBUF)和接收移位寄存器(RXSHF)
    数据流向为:接收数据—>SCIRXD–>RXSHF–>SCITXBUF存取缓冲器;
    接收数据直接通过接收数据缓冲器的变量即可。

    以上的数据流都是在非FIFO模式下的,FIFO模式简单来说是设置了一个缓冲机制,设置一个数据的缓冲深度,当发送或接受数据存到设置的深度时,再进行发送或接收。

    信号接收时序

    1-RXENA使能,接收数据;
    2- 数据到SCIRXD,检测起始位;
    3-数据从移位寄存器RXSHF到缓冲寄存器SCIRXBUF,产生中断申请,RXRDY变高(1),已接收到一个新字符;
    4-程序读缓冲寄存器,RXRDY=0;
    5-下一次字节到达SCIRXD,检测启动位,清除;
    6-RXENA变为低(0);
    继续向移位寄存器转载数据,但不移入缓冲寄存器。
    以上是中断接收,我们一般都是用中断接收,中断直接获取缓冲寄存器的中的数据即可;而查询接收则是通过查询RXRDY标志位来进行接收,为高则接收到新字符,读之后为0.

    信号的发送时序

    1-TXENA使能,发送数据,初始时缓冲寄存器SCITXBUF为空,TXRDY为高(1),TX EMPTY为高(1);
    2-写数据到缓冲寄存器,不为空,TXRDY为低(0),EMPTY为低(0);
    3-发送数据到移位寄存器TXSHF,缓冲寄存器为空,准备传送第二个字符到缓冲寄存器,3-TXRDY为高(1),中断请求;
    4-TXRDY为高(1)时,程序写第二个字符到缓冲寄存器,这时SCITXD开始发送第一个字符;写入缓冲寄存器后,TXRDY为低(0);
    5-发送完第一个字符,开始将第二个字符移入移位寄存器,移完5-TXRDY为高(1),开始发送第二个字符;
    6-TXENA位变低,禁止发送数据,,结束当前字符的发送;
    7-第二个字符发送完成,缓冲寄存器为空,准备发送下一个字符。
    以上为中断发送,一般我们发送可以直接赋值给缓冲寄存器SCITXBUF即可。

    transmitter由发送缓冲区和发送移位寄存器构成。我们要发送信息时,首先将信息进行编码(一般用ASCII码)成二进制流,然后将一帧数据(一般是8位)写入发送缓冲区(从这里以后程序就不用管了,剩下的发送部分由硬件自动完成),最后发送移位寄存器会自动从发送缓冲区中读取一帧数据,然后自动移位(移位的目的是将一帧数据的各个位分别拿出来)将其发送到Tx通信线上。

    receiver由接收缓冲区和接收移位寄存器构成。当有人通过串口线向我发送信息时,信息通过Rx通信线进入我的接收移位寄存器中,然后接收移位寄存器自动移位并将该二进制位保存入我的接收缓冲区,接收完一帧数据后receiver会产生一个中断给CPU,CPU收到中断后即可知道receiver接收满了一帧数据,就会来读取这帧数据。
    发送缓冲区和接收缓冲区是关键,发送移位寄存器和接收移位寄存器的工作都是自动的,不用编程控制的,所以我们写串口代码就是:首先初始化串口控制器(包括发送控制器和接收控制器),然后要发送信息时直接写入发送缓冲区,要接收信息时直接去接收缓冲区中读取即可。 软件工程师对串口操作的接口就是发送/接收缓冲区(实际就是寄存器,操作方式就是读写内存)。

    SCI波特率计算

    SCI内部串行时钟信号由低速外设时钟信号LSPCLK及波特率选择寄存器共同决定,SCI通过波特率选择寄存器中的16位值可以选择多达64k种不同的波特率。

    BRR = SCIHBAUD + SCILBAUD
    
    如果1<= BRR <=65535,那么SCI波特率=LSPCLK / ( (BRR+1) * 8 ),由此,可以带入你需要的波特率,既可以得到BRR的值;
    
    如果BRR = 0,那么SCI波特率=LSPCLK/ 16
    

    FIFO模式

    FIFO模式及其作用

    典型的串口设计,发送/接收缓冲区只有1字节,每次发送/接收只能处理1帧数据。这样在单片机中没什么问题,但是到复杂SOC中(一般有操作系统的)就会有问题,会导致效率低下,因为CPU需要不断切换上下文。

    解决方案就是想办法扩展串口控制器的发送/接收缓冲区,譬如将发送/接收缓冲区设置为64字节,CPU一次过来直接给发送缓冲区64字节的待发送数据,然后transmitter慢慢发送,发送完再找CPU再要64字节数据。但是串口控制器本来的发送/接收缓冲区是固定的1字节大小的,所有做了个变相的扩展,就是FIFO。CPU先将64字节的数据放到FIFO中,然后启动FIFO模式,FIFO每次会自动往发送缓冲区中添加1字节数据,最后进行移位操作传输数据。

    FIFO,就是first in first out,先进先出。FIFO其实是一种数据结构,这里这个大的缓冲区叫FIFO是因为这个缓冲区的工作方式类似于FIFO这种数据结构。

    接收器与发送器是具有16级深度的FIFO。
    如果使能了SCI的FIFO功能,则RXSHF会将数据直接加载到RX FIFO队列中,CPU再从FIFO队列中读取数据。同理,如果使能了SCI的FIFO功能,则TXSHF将直接从TX FIFO队列中获取需要发送的数据。

  • SCI FIFO发送流程
    将内存数据放置发送缓存当中
    ScibRegs.SCITXBUF=’A’;

    发送缓存中的数据自动存到FIFO当中
    ScibRegs.SCITXBUF中的数据会放入到发送FIFO中,最多16字节数据如果连续发送的字节数量大于16需要等待,否则发送的数据将会被覆盖

    发送FIFO将数据转到发送移位寄存器TXSHF当中
    FIFO会自动将数据发送到移位寄存器TXSHF中最终到TXD引脚

  • SCI FIFO接收流程
    数据到达RXD引脚之后,检测启动位
    TXSHF移位到接收FIFO当中
    当FIFO接收字节数量等于设置的接收FIFO深度ScibRegs.SCIFFRX.bit.RXFFIL = 8时产生一个中断

  • 如果使能了接收中断将会产生一个中断

    串口通信与中断的关系

    SCI的中断

    SCI模块可以产生两个中断:接收中断SCIRXINT,发送中断SCITXINT
    接收器和发送器都可通过中断控制,接收器和发送器具有独立的中断使能位,当中断禁止时,中断标志位仍然正常反映中断事件,但发送中断请求。接收器相比于发送器具有更高的优先级。

    串口通信分为发送/接收两部分,发送一般不需要中断即可完成发送,接收一般需要使用中断来接收。

    发送方可以选择使用中断,也可以选择不使用中断。使用中断的工作情景是:发送方先设置好中断并绑定一个中断处理程序,然后发送方丢一帧数据给transmitter,transmitter耗费一段时间来发送这一帧数据,这段时间内发送方CPU可以去做别的事情,等transmitter发送完成后会产生一个TXD中断,该中断会导致事先绑定的中断处理程序执行,在中断处理程序中CPU会切换回来继续给transmitter放一帧数据,然后CPU切换离开;不使用中断的工作情景是:发送方事先禁止TXD中断(当然也不需要给相应的中断处理程序了),发送方CPU给一帧数据到transmitter,然后transmitter耗费一段时间来发送这帧数据,这段时间CPU在这等着(CPU没有切换去做别的事情),待发送方发送完成后CPU再给它一帧数据继续发送直到所有数据发完。CPU是怎么知道transmitter已经发送完了?原来是有个状态寄存器,状态寄存器中有一个位叫发送缓冲区空标志,transmitter发送完成(发送缓冲区空了)就会给这个标志位置1,CPU就是通过不断查询这个标志位为1还是0来知道发送是否已经完成的。

    接收方可以选择使用中断,也可以选择不使用中断。使用中断的工作情景是:接收方先设置好中断并绑定一个中断处理程序,然后接收方会耗费一段时间从receiver中来接收一帧数据,这段时间内接收方CPU可以去做别的事情,等receiver接收数据完成后会产生一个RXD中断,该中断会导致事先绑定的中断处理程序执行,在中断处理程序中CPU会切换回来从receiver中读取数据,然后CPU切换离开;不使用中断的工作情景是:接收方事先禁止RXD中断(当然也不需要给相应的中断处理程序了),接收方会耗费一段时间从receiver中接收一帧数据,这段时间CPU在这等着(CPU没有切换去做别的事情),待接收方接收完成后CPU会继续等着直到所有数据接收完。CPU是怎么知道receiver已经接收完了?原来是有个状态寄存器,状态寄存器中有一个位叫接收缓冲区满标志,receiver接收完成(接收缓冲区满了)就会给这个标志位置1,CPU就是通过不断查询这个标志位为1还是0来知道接收是否已经完成的。

    因为串口通信是异步的,异步的意思就是说发送方占主导权。也就是说发送方随时想发就能发,但是接收方只有时刻等待才不会丢失数据。所以这个差异就导致发送方可以不用中断,而接收方不得不使用中断模式

    SCI串口编程例程

  • A.先初始化IO管脚 (以SCI-A为例,SCI-B、SCI-C的初始化方法一样,就是照着改对应的管脚就行)
  • //要使用SCI 外设则需开启相应时钟
    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1; // SCI-A
    EDIS;
    //开启SCI 时钟后,根据自己需求,使用哪个SCI 口就初始化对应的GPIO
    
    void InitSciaGpio()    //初始化SCIA的GPIO管脚为例子
        {
           EALLOW;
        //根据硬件设计决定采用GPIO28/29和GPIO35/36中的哪一组。这里以35/36为例
        //定义管脚为上拉
        GpioCtrlRegs.GPBPUD.bit.GPIO36 = 0;    
        GpioCtrlRegs.GPBPUD.bit.GPIO35 = 0;   
       //定义管脚为异步输入
        GpioCtrlRegs.GPBQSEL1.bit.GPIO36 = 3; 
     
    //配置管脚为SCI功能管脚
        GpioCtrlRegs.GPBMUX1.bit.GPIO36 = 1; 
            GpioCtrlRegs.GPBMUX1.bit.GPIO35 = 1;   
             EDIS;
    }
    
  • B.SCI初始化配置

    void scia_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
    
    SciaRegs.SCICTL2.bit.TXINTENA =1; //发送中断使能
    SciaRegs.SCICTL2.bit.RXBKINTENA =1;//接收中断使能
    
    SciaRegs.SCIHBAUD    =0x0001; // 9600 baud @LSPCLK = 37.5MHz.
    SciaRegs.SCILBAUD    =0x00E7;
    
    SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset
    }
    
  • C.接着进行中断的配置

    EALLOW;    // This is needed to write to EALLOW protected registers
    PieVectTable.SCIRXINTA = &sciaRxIsr;
    PieVectTable.SCITXINTA = &sciaTxIsr;
    PieVectTable.SCIRXINTB = &scibRxIsr;
    PieVectTable.SCITXINTB = &scibTxIsr;
    EDIS;   // This is needed to disable write to EALLOW protected registers
    
  • D.上面是将SCIA和SCIB的中断服务程序连到PIE的中断表中,发生中断就会跑到你的ISR去了, 下面是开中断

    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;
     这样串口基本就配置完成。
    
  • SCIA FIFO 串口通信配置步骤

    串口数据发送函数

    单数据发送

    // Transmit a character from the SCI'
    void UARTa_SendByte(int a)
    {
    	while (SciaRegs.SCIFFTX.bit.TXFFST != 0);
    	SciaRegs.SCITXBUF=a;
    }
    

    字符串发送

    void UARTa_SendString(char * msg)
    {
    	int i=0;
     
    	while(msg[i] != '\0')
    	{
    		UARTa_SendByte(msg[i]);
    		i++;
    	}
    }
    

    单数据发送

     void scib_xmit(int a)
    {
        while (ScibRegs.SCICTL2.bit.TXRDY == 0) {} //TXRDY=1时发送器SCITXBUF为空,写SCITXBUF时TXRDY为1     
        ScibRegs.SCITXBUF=a;
    
    }
    

    字符串发送

      void scib_msg(char * msg)
        {
            int i;
            i = 0;
            while(msg[i] != '\0')
            {
                scib_xmit(msg[i]);
                i++;
            }
        }
    

    串口数据接收函数

    采用查询方式接收

      // Wait for inc character
        while(SciaRegs.SCIFFRX.bit.RXFFST !=1);// wait for RXDY =1 for empty state
        // Get character
        ReceivedChar = SciaRegs.SCIRXBUF.all;
    

    采用中断方式接收

    SCI配置步骤

    (1)使能SCI 外设时钟及初始化对应GPIO

    要使用SCI 外设则需开启相应时钟,开启SCI 外设时钟代码如下:

    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1; // SCI-A
    EDIS;
    

    开启SCI 时钟后,根据自己需求,使用哪个SCI 口就初始化对应的GPIO,本章实验使用的是SCIA,即GPIO35 和GPIO36。GPIO 时钟及IO 口初始化在前面都
    已经讲解过,SCI 的GPIO 初始化配置,TI 已经在库文件内提供给我们了,所以直接调用函数即可,SCI GPIO 初始化函数如下:

    InitSciGpio();
    

    函数内包含了SCIA、SCIB 和SCIC 的初始化,如下:

    void InitSciGpio()
    {
    #if DSP28_SCIA
    InitSciaGpio();
    #endif // if DSP28_SCIA
    #if DSP28_SCIB
    InitScibGpio();
    #endif // if DSP28_SCIB
    #if DSP28_SCIC
    InitScicGpio();
    #endif // if DSP28_SCIC
    }
    
    (2)SCI 工作方式及参数设置,包括数据格式、波特率、使能发送、接收功能等。

    要使用SCI 还需要对其工作方式及相关参数进行设置,包括数据格式、波特率、使能位设置等。这里就以本章实验代码为例介绍,代码如下:

    //Initalize the SCI FIFO
    SciaRegs.SCIFFTX.all=0xE040;
    SciaRegs.SCIFFRX.all=0x204f;
    SciaRegs.SCIFFCT.all=0x0;
    
    // Note: Clocks were turned on to the SCIA peripheral
    // in the InitSysCtrl() function
    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
    SciaRegs.SCICTL2.all =0x0003;
    SciaRegs.SCICTL2.bit.TXINTENA =1;
    SciaRegs.SCICTL2.bit.RXBKINTENA =1;
    SciaRegs.SCIHBAUD =scihbaud; // baud set @LSPCLK = 37.5MHz.
    SciaRegs.SCILBAUD =scilbaud;
    // SciaRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back
    SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset
    

    在上面代码中我们看到了有scihbaud 和scilbaud 变量,这两个参数是用来
    设置SCI 波特率的,一个是高字节,另一个是低字节。这两个变量计算等式如下:

    scibaud=37500000/(8*baud)-1;
    scihbaud=scibaud>>8;
    scilbaud=scibaud&0xff;
    

    等式中的37500000 是SCI 外设工作频率37.5MHZ 值。先根据前面介绍的波特率计算公式将波特率值得到,然后拆成高低字节分别传入SCIHBAUD 和SCILBAUD 寄存器中。因此只需要修改参数baud 值就可以起到修改波特率的功能。

    void UARTa_Init(Uint32 baud)
    {
    	unsigned char scihbaud=0;
    	unsigned char scilbaud=0;
    	Uint16 scibaud=0;
    scibaud=37500000/(8*baud)-1;
    scihbaud=scibaud>>8;
    scilbaud=scibaud&0xff;
    ......
    }
    //入口参数baud,该参数用于设置SCIA通信波特率,比如通信波特率设置为4800,那么该参数值即为4800。
    
    (3)SCI 发送字节函数

    通过前面的配置就已经初始化SCI 了,下面就可以开始使用SCI 进行数据收发,SCI 发送数据前,先查询发送完成标志,如果发送完成就开始发送下面数据,
    否则一直等待,本章我们封装了自己的SCI 发送单个字节函数如下:

    void UARTa_SendByte(int a)
    {
    while (SciaRegs.SCIFFTX.bit.TXFFST != 0);
    SciaRegs.SCITXBUF=a;
    }
    

    上面是SCI 发送单字节函数,实际应用中我们需要发送多个字节,这就需要对SCI 单字节发送函数再次封装,代码如下:

    void UARTa_SendString(char * msg)
    {
       int i=0;
        
       while(msg[i] != '\0')  //字符串以\0结尾
       {
         UARTa_SendByte(msg[i]);
         i++;
       }
    }
    

    函数参数是一个字符指针类型。函数内当遇到字符串结尾‘\0’自动停止发送。

    (4)SCI 接收字节函数

    有发送就会有接收数据,SCI 在接收数据之前,同样需要先判断接收完成标志,然后在开始接收下面数据。代码如下:

    // Wait for inc character
    while(SciaRegs.SCIFFRX.bit.RXFFST !=1);// wait for XRDY =1 for empty state
    // Get character
    ReceivedChar = SciaRegs.SCIRXBUF.all;
    

    变量ReceivedChar 是我们自定义的,其内部存储的就是SCI 接收的数据,该部分一次只能接收一个字节数据,要想接收多字节,可定义一个数组存储其中。

    一个例程

    /*
     * uart.h
     */
     #ifndef UART_H_
    #define UART_H_
    
    #include "DSP2833x_Device.h"     // DSP2833x 头文件
    #include "DSP2833x_Examples.h"   // DSP2833x 例子相关头文件
    
    
    void UARTa_Init(Uint32 baud);
    void UARTa_SendByte(int a);
    void UARTa_SendString(char * msg);
    
    #endif /* UART_H_ */
    
    /*
     * uart.c
     */
    #include "uart.h"
    
    void UARTa_Init(Uint32 baud)
    {
    	unsigned char scihbaud=0;
    	unsigned char scilbaud=0;
    	Uint16 scibaud=0;
    
    	scibaud=37500000/(8*baud)-1;
    	scihbaud=scibaud>>8;
    	scilbaud=scibaud&0xff;
    
    
    	EALLOW;
    	SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1;   // SCI-A
    	EDIS;
    
    	InitSciaGpio();
    
    	//Initalize the SCI FIFO
    	SciaRegs.SCIFFTX.all=0xE040;
    	SciaRegs.SCIFFRX.all=0x204f;
    	SciaRegs.SCIFFCT.all=0x0;
    
    	// Note: Clocks were turned on to the SCIA peripheral
    	// in the InitSysCtrl() function
    	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
    	SciaRegs.SCICTL2.all =0x0003;
    	SciaRegs.SCICTL2.bit.TXINTENA =1;
    	SciaRegs.SCICTL2.bit.RXBKINTENA =1;
    	SciaRegs.SCIHBAUD    =scihbaud;  // 9600 baud @LSPCLK = 37.5MHz.
    	SciaRegs.SCILBAUD    =scilbaud;
    //	SciaRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back
    	SciaRegs.SCICTL1.all =0x0023;     // Relinquish SCI from Reset
    
    }
    
    
    // Transmit a character from the SCI'
    void UARTa_SendByte(int a)
    {
    	while (SciaRegs.SCIFFTX.bit.TXFFST != 0);
    	SciaRegs.SCITXBUF=a;
    }
    
    void UARTa_SendString(char * msg)
    {
    	int i=0;
    
    	while(msg[i] != '\0')
    	{
    		UARTa_SendByte(msg[i]);
    		i++;
    	}
    }
    
    /*
     * main.c
     */
    void main()
    {
    	int i=0;
    	char *msg;
    	Uint16 ReceivedChar=0;
    
    	InitSysCtrl();
    	InitPieCtrl();
    	IER = 0x0000;
    	IFR = 0x0000;
    	InitPieVectTable();
    
    	LED_Init();
    	TIM0_Init(150,200000);//200ms
    	UARTa_Init(4800);
    
    	msg = "Hello World!\r\n";
    	UARTa_SendString(msg);
    	msg = "You will enter a character, and the DSP will echo it back!\r\n";
    	UARTa_SendString(msg);
    
    	while(1)
    	{
    		msg = "\r\nEnter a character: ";
    		UARTa_SendString(msg);
    
    		// Wait for inc character
    		while(SciaRegs.SCIFFRX.bit.RXFFST !=1);// wait for XRDY =1 for empty state
    		// Get character
    		ReceivedChar = SciaRegs.SCIRXBUF.all;
    
    		// Echo character back
    		msg = "  You sent: ";
    		UARTa_SendString(msg);
    		UARTa_SendByte(ReceivedChar);
    
    		DELAY_US(1000);
    	}
    }
    
    
    物联沃分享整理
    物联沃-IOTWORD物联网 » F28335微控制器的串行通信接口(SCI)模块

    发表评论