This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

做SCI测试的时候的一个问题?



for(i=0; i< 8; i++)                   //要发送的下一个数据
    {
    sdataA[i] = (sdataA[i]+1) & 0x00FF;   

请问这个语句是什么意思?? 

  • 这是哪的代码,把上下文贴出来,这代码应该有问题

  • //#####################################################################
    //文件:  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
    //etc..
    //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
    //etc..
    //检查变量:
    //     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 i;
      //步骤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 = &sciaRxFifoIsr;
        PieVectTable.TXAINT = &sciaTxFifoIsr;
        PieVectTable.RXBINT = &scibRxFifoIsr;
        PieVectTable.TXBINT = &scibTxFifoIsr;
        EDIS;   //与 EALLOW 对应使用
      //步骤4.初始化外设
      //InitPeripherals();       //在本程序中可以省略
            scia_fifo_init();       //初始化SCI-A
            scib_fifo_init();       //初始化SCI-B
      //步骤5.用户程序段,使能中断
      //初始化要发送的数据
        for(i = 0; i<8; i++)
        {
          sdataA[i] = i;
        }
        for(i = 0; i<8; i++)
        {
          sdataB[i] = 0xFF - i;
        }
        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 中断
        EINT;
      //步骤6.空循环
      for(;;);
    }
    void error(void)
    {
        asm("     ESTOP0"); //Test failed!! Stop!
        for (;;);
    }
    //SCIA 发送中断服务程序
    interrupt void sciaTxFifoIsr(void)
    {
        Uint16 i;
        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 i;
    for(i=0;i<8;i++)
    {
      rdataA[i]=SciaRegs.SCIRXBUF.all; //读取数据
    }
    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 i;
        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 i;
    for(i=0;i<8;i++)
    {
      rdataB[i]=ScibRegs.SCIRXBUF.all; //读取数据
    }
    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;
    }
     

  • 恩,那就是没问题,就是按照要求设置SCIA的发送数据。

    你指出的代码是将发送数组里的每一个数据加1后作为下一次发送的数据流。