12061|11

79

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

关于2812的串口中断(接收) [复制链接]

调试2812的串口,
使用查询方式接收和发送都成功了。但查询方式接收数据太耗CPU,现在是想要中断方式接收数据。

写了串口接收中断的处理函数,interrupt void scia_rx_isr(void);
然后在main函数中使用         
    EALLOW;
      PieVectTable.SCIRXINTA_ISR=&scia_rx_isr;//指定中断服务子程序的入口地址
      EDIS;
将其挂接到中断处理结构体上去。(中断使能是开的)
可是,试来试去就是无法触发这个中断。(使用串口助手给它发字节)


哪位dx给我一份中断方式接收数据的程序demo?或者帮忙给我看下,指出一些注意事项?
万分感激了

(另外,谁要我的查询方式的串口代码可以pm我!助人者常得人助^_^)

最新回复

在中断程序中打个断点,看是否进入中断,或者观察中断标志位是否置位,一步一步查,总会解决的  详情 回复 发表于 2017-12-25 20:13
 
点赞 关注

回复
举报

82

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
你运行程序,then查看一下SCIFFRX寄存器的值,看看RXFFINT的值有没有置1,置1才表示你产生了中断
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
其实。。。。。。。。。
这个问题很容易。。。。。。。。。。
google一下就有了。。。。。。。。。。
一般说来,不要指望这里的斑竹或者产品提供者会给你回复。。。。。。。
下面是TI的例程

//###########################################################################
//
// FILE:   Example_281xSci_FFDLB_int.c
//
// TITLE:  DSP281x Device SCI Digital Loop Back porgram.
//
//
// ASSUMPTIONS:
//
//         This program requires the DSP281x V1.00 header files.  
//         As supplied, this project is configured for \"boot to H0\" operation.
//
//         Other then boot mode pin configuration, no other hardware configuration
//         is required.
//
// DESCRIPTION:
//
// This program is a SCI example that uses the internal loopback of
// the peripheral.  Both interrupts and the SCI FIFOs are used.
//
// A stream of data is sent and then compared to the recieved stream.
//  
// The SCI-A sent data looks like this:
// 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..
//
//
// The SCI-B sent data looks like this:
// 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..
//
// Both patterns are repeated forever.  
//
// Watch Variables:  
//  
//     SCI-A           SCI-B
//     ----------------------
//     sdataA          sdataB           Data being sent
//     rdataA          rdataB           Data received
//     rdata_pointA    rdata_pointB     Keep track of where we are in the datastream
//                                      This is used to check the incoming data           
//###########################################################################
// Original Source by S.D.
//
//  Ver | dd mmm yyyy | Who  | Description of changes
// =====|=============|======|===============================================
//  1.00| 11 Sep 2003 | L.H. | EzDSP Alpha Release
//###########################################################################


#include \"DSP281x_Device.h\"     // DSP281x Headerfile Include File
#include \"DSP281x_Examples.h\"   // DSP281x Examples Include File

#define CPU_FREQ         150E6
#define SCI_FREQ         100E3
#define SCI_PRD         CPU_FREQ/(SCI_FREQ*8)

// 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 sci_error(void);

// Global variables
Uint16 sdataA[8];    // Send data for SCI-A
Uint16 sdataB[8];    // Send data for SCI-B
Uint16 rdataA[8];    // Received data for SCI-A
Uint16 rdataB[8];    // Received data for SCI-A
Uint16 rdata_pointA; // Used for checking the received data
Uint16 rdata_pointB;


void main(void)
{
   Uint16 i;

// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP281x_SysCtrl.c file.
   InitSysCtrl();

// Step 2. Initalize GPIO:
// This example function is found in the DSP281x_Gpio.c file and
// illustrates how to set the GPIO to it\'s default state.
// InitGpio();   
// Setup only the GP I/O only for SCI-A and SCI-B functionality
   EALLOW;
   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;

// Step 3. Clear all interrupts and initialize PIE vector table:
// Disable CPU interrupts
   DINT;

// Initialize PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags
// are cleared.  
// This function is found in the DSP281x_PieCtrl.c file.
   InitPieCtrl();

// Disable CPU interrupts and clear all CPU interrupt flags:
   IER = 0x0000;
   IFR = 0x0000;

// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).  
// This will populate the entire table, even if the interrupt
// is not used in this example.  This is useful for debug purposes.
// The shell ISR routines are found in DSP281x_DefaultIsr.c.
// This function is found in DSP281x_PieVect.c.
   InitPieVectTable();

// Interrupts that are used in this example are re-mapped to
// ISR functions found within this file.  
   EALLOW;        // This is needed to write to EALLOW protected registers
   PieVectTable.RXAINT = &sciaRxFifoIsr;
   PieVectTable.TXAINT = &sciaTxFifoIsr;
   PieVectTable.RXBINT = &scibRxFifoIsr;
   PieVectTable.TXBINT = &scibTxFifoIsr;
   EDIS;   // This is needed to disable write to EALLOW protected registers


// Step 4. Initialize all the Device Peripherals:
// This function is found in DSP281x_InitPeripherals.c
// InitPeripherals(); // Not required for this example
   scia_fifo_init();  // Init SCI-A
   scib_fifo_init();  // Init SCI-B
       
// Step 5. User specific code, enable interrupts:

// Init send data.  After each transmission this data
// will be updated for the next transmission
   for(i = 0; i<8; i++)
   {
      sdataA = i;
   }

   for(i = 0; i<8; i++)
   {
      sdataB = 0xFF - i;
   }

   rdata_pointA = sdataA[0];
   rdata_pointB = sdataB[0];

// Enable interrupts required for this example
   PieCtrlRegs.PIECRTL.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;   

// Step 6. IDLE loop. Just sit and loop forever (optional):       
        for(;;

}        

void sci_error(void)
{
    asm(\"     ESTOP0\"; // Test failed!! Stop!
    for (;;
}


interrupt void sciaTxFifoIsr(void)
{   
    Uint16 i;
    for(i=0; i< 8; i++)
    {
           SciaRegs.SCITXBUF=sdataA;     // Send data
        }

    for(i=0; i< 8; i++)                 //Increment send data for next cycle
    {
           sdataA = (sdataA+1) & 0x00FF;  
        }       

        SciaRegs.SCIFFTX.bit.TXINTCLR=1;        // Clear SCI Interrupt flag
        PieCtrlRegs.PIEACK.all|=0x100;      // Issue PIE ACK
}

interrupt void sciaRxFifoIsr(void)
{   
    Uint16 i;
        for(i=0;i<8;i++)
        {
           rdataA=SciaRegs.SCIRXBUF.all;         // Read data
        }
        for(i=0;i<8;i++)                     // Check received data
        {
           if(rdataA != ( (rdata_pointA+i) & 0x00FF) ) sci_error();
        }
        rdata_pointA = (rdata_pointA+1) & 0x00FF;                                 

        SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;   // Clear Overflow flag
        SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;   // Clear Interrupt flag
        PieCtrlRegs.PIEACK.all|=0x100;       // Issue PIE ack
}

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
   SciaRegs.SCICTL2.bit.TXINTENA =1;
   SciaRegs.SCICTL2.bit.RXBKINTENA =1;
   SciaRegs.SCIHBAUD = 0x0000;
   SciaRegs.SCILBAUD = SCI_PRD;
   SciaRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back  
   SciaRegs.SCIFFTX.all=0xC028;
   SciaRegs.SCIFFRX.all=0x0028;
   SciaRegs.SCIFFCT.all=0x00;

   SciaRegs.SCICTL1.all =0x0023;     // Relinquish SCI from Reset
   SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;
   SciaRegs.SCIFFRX.bit.RXFIFORESET=1;         
                                                                            
                                                                                                                                                                                                                                    
}  

interrupt void scibTxFifoIsr(void)
{      
    Uint16 i;
    for(i=0; i< 8; i++)
    {
           ScibRegs.SCITXBUF=sdataB;     // Send data
        }

    for(i=0; i< 8; i++)                 //Increment send data for next cycle
    {
           sdataB = (sdataB-1) & 0x00FF;  
        }       

        ScibRegs.SCIFFTX.bit.TXINTCLR=1;    // Clear Interrupt flag
        PieCtrlRegs.PIEACK.all|=0x100;      // Issue PIE ACK
}

interrupt void scibRxFifoIsr(void)
{
    Uint16 i;
        for(i=0;i<8;i++)
        {
           rdataB=ScibRegs.SCIRXBUF.all;         // Read data
        }
        for(i=0;i<8;i++)                     // Check received data
        {
           if(rdataB != ( (rdata_pointB-i) & 0x00FF) ) sci_error();
        }
        rdata_pointB = (rdata_pointB-1) & 0x00FF;
                                        
        ScibRegs.SCIFFRX.bit.RXFFOVRCLR=1;  // Clear Overflow flag
        ScibRegs.SCIFFRX.bit.RXFFINTCLR=1;         // Clear Interrupt flag
        PieCtrlRegs.PIEACK.all|=0x100;          // Issue PIE ack
}

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    =SCI_PRD;
   ScibRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back  
   ScibRegs.SCIFFTX.all=0xC028;
   ScibRegs.SCIFFRX.all=0x0028;
   ScibRegs.SCIFFCT.all=0x00;

   ScibRegs.SCICTL1.all =0x0023;     // Relinquish SCI from Reset
   ScibRegs.SCIFFTX.bit.TXFIFOXRESET=1;
   ScibRegs.SCIFFRX.bit.RXFIFORESET=1;         
      
}  

//===========================================================================
// No more.
//===========================================================================

 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

4
 
feature!

我跟你的情况一样 也是查询方式 搞定了

在做中断方式 串口 接收,串口接收我现在能进中断,但只能收一桢数据 之后就是 收到最后一个数据 还有点问题

 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

5
 
偶的串口中断程序

interrupt void SCIRXINTA_ISR(void)     // SCI-A
{
    char ReceivedChar,huanchong;

///////////////////////////////////   
    PieCtrl.PIEIFR9.bit.INTx1=1;   
   
    PieCtrl.PIEACK.bit.ACK9=1;
        
    PieCtrl.PIEIER9.bit.INTx1=1;
///////////////////////////////////

    ReceivedChar = SciaRegs.SCIRXBUF.all;
        
    huanchong = ReceivedChar ;
        
    SciaRegs.SCITXBUF=huanchong;

}


发送数据 c2 01 11 22 33 44 55 66 77 88 99 aa

接收数据 。。。
C2 C2 01 11 22 33 44 55 66 77 88 99 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA

只接收到了第一桢  之后就全是 最后一个数据 AA

我百思不得其解~~~

哪位高手能解决此问题
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

6
 
我也遇到同样问题~!程序始终在发送中断中,而不能进入接收中断~! 接收中断级存缓存器中接受不到串口发送的字符,搂主的问题解决了么?

 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

7
 
我现在使用发送中断发送timer0中A/D转换的数据,当外部通过串口发送字符串时,接收中断自动使能接收字符串,timer0周期设置大于10ms时能够实现,但是现在要求timer0周期为0.1ms, 此时   接收中断不能被相应  接收缓存寄存器中不能接收新的字符
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

8
 

回复 楼主 mapleyang 的帖子

我采用查询方式老是在PC机上的串口调试大师上总是接受不到 查了很多资料 和我配置的几乎差不多 能不能发个例程给我  不胜感激啊 qq:1244651499@qq.com
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

9
 
学习一下
 
 
 

回复

54

帖子

0

TA的资源

一粒金砂(中级)

10
 
TI提供的2812例程

v110.rar

1.9 MB, 下载次数: 42

 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 
PieVectTable.SCIRXINTA_ISR=&scia_rx_isr;//指定中断服务子程序的入口地址
这句里面的中断向量入口一般是不是写成 PieVectTable.RXAINT = &scia_rx_isr;
下面是ti的例程:
PieVectTable.RXAINT = &sciaRxFifoIsr;
    PieVectTable.TXAINT = &sciaTxFifoIsr;
    PieVectTable.RXBINT = &scibRxFifoIsr;
    PieVectTable.TXBINT = &scibTxFifoIsr;
我写成 SCIRXINTA_ISR的时候,编译出错。这是为什么?
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

12
 
在中断程序中打个断点,看是否进入中断,或者观察中断标志位是否置位,一步一步查,总会解决的
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表