原创 DSP2812串口FIFO设置及"手动触发"发送中断服务之C++程序

2008-5-7 20:14 8137 5 6 分类: 处理器与DSP

所谓"手动触发"发送中断祥见: 俺来非典非典---利用UDRIE实现"手动触发"


这次菜农又在DSP2812上再次倒塌成功,特发帖祝贺~~~


/*****************************************************


注: 引用此法(实际给出了一般和FIFO两种串口编程方法用SCI_FIFO_MODE区别)


切记是菜农倒塌的~~~


转载请注明: 雁塔菜地 HotPower@126.com  2008.5.7


*****************************************************/


1.设置


void UartObj::Init(void)
{
unsigned int i;
    for (i = 0; i < sizeof(ReceiveBuffer); i ++) {
        ReceiveBuffer = 0;
    }
    for (i = 0; i < sizeof(SendBuffer); i ++) {
        SendBuffer = 0;
    }
    ReceiveWritePtr = 0;
    ReceiveReadPtr = 0;
    ReceivePosition = 0;
    ReceiveCount = 0;
    SendWritePtr = 0;
    SendReadPtr = 0;
 SendBusy = false;
 State = 0;
  
 EALLOW;
    GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4 = 1;
    GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5 = 1;
 EDIS;


    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.SCILBAUD = SCI_BAUD(CBR_38400);
#if SCI_FIFO_MODE
//    SciaRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back
    SciaRegs.SCIFFTX.all=0xE061;
    SciaRegs.SCIFFRX.all=0x2028;
#else   
    SciaRegs.SCIFFTX.all=0xA000;
    SciaRegs.SCIFFRX.all=0x201F;
#endif
    SciaRegs.SCIFFCT.all=0x00;


    SciaRegs.SCICTL1.all =0x0023;     // Relinquish SCI from Reset
#if SCI_FIFO_MODE
 SciaRegs.SCICTL1.bit.SWRESET = 1;
//    SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;
    SciaRegs.SCIFFRX.bit.RXFIFORESET=1;
    PieCtrlRegs.PIECRTL.bit.ENPIE = 1;   // Enable the PIE block
#endif 
 PieCtrlRegs.PIEIER9.bit.INTx1 = 1;
 PieCtrlRegs.PIEIER9.bit.INTx2 = 1;


 /*设置中断服务程序入口地址*/
 EALLOW; // This is needed to write to EALLOW protected registers
 PieVectTable.TXAINT = &ISRTxUart;
 PieVectTable.RXAINT = &ISRRxUart;
 EDIS;   // This is needed to disable write to EALLOW protected registers


 /*开中断*/
 IER |= M_INT9;
}


2."手动触发"发送中断


void UartObj::putchar(const char dat)
{
char ch;
    ch = dat;
    SendBuffer[SendWritePtr ++] = ch;//写入发送缓冲区(并非FIFO!!!)
    SendWritePtr &= sizeof(SendBuffer) - 1;
    if ((!SendBusy) && (dat == 0x0a))
    {
     SendBusy = true;
#if SCI_FIFO_MODE
     SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;//.手动触发"发送中断


#else
  SciaRegs.SCITXBUF = SendBuffer[SendReadPtr ++];
  SendReadPtr &= sizeof(SendBuffer) - 1;
#endif  
    }
}


3.收发中断服务程序


interrupt void ISRTxUart(void)
{
#if SCI_FIFO_MODE//串口为FIFO中断模式
 for (int i = 14 - SciaRegs.SCIFFTX.bit.TXFFST; (i > 0) && (Uart.SendWritePtr != Uart.SendReadPtr); i --)
 {//最多发送14个字符,16个容易丢字符
  SciaRegs.SCITXBUF = Uart.SendBuffer[Uart.SendReadPtr ++];
  Uart.SendReadPtr &= sizeof(Uart.SendBuffer) - 1;
 }
 Uart.SendBusy = Uart.SendWritePtr != Uart.SendReadPtr;//判断缓冲区空


//注意下句是成功的关键!!!
 SciaRegs.SCIFFTX.bit.TXFIFOXRESET = Uart.SendBusy//缓冲区非空
                                  || SciaRegs.SCIFFTX.bit.TXFFST;//FIFO非空
 SciaRegs.SCIFFTX.bit.TXINTCLR = 1;
#else//串口为一般中断模式
 if (Uart.SendWritePtr != Uart.SendReadPtr)//缓冲区非空允许发送
 {
  SciaRegs.SCITXBUF = Uart.SendBuffer[Uart.SendReadPtr ++];
  Uart.SendReadPtr &= sizeof(Uart.SendBuffer) - 1;
 }
 Uart.SendBusy = Uart.SendWritePtr != Uart.SendReadPtr;//判断缓冲区空
#endif 
 PieCtrlRegs.PIEACK.bit.ACK9 = 1;
}



interrupt void ISRRxUart(void)
{
#if SCI_FIFO_MODE//串口为FIFO中断模式
 for (int i = SciaRegs.SCIFFRX.bit.RXFIFST; i > 0; i --)
 {
  Uart.ReceiveBuffer[Uart.ReceiveWritePtr ++] = SciaRegs.SCIRXBUF.all;
  Uart.ReceiveWritePtr &= sizeof(Uart.ReceiveBuffer) - 1;
 }
 SciaRegs.SCIFFRX.bit.RXFFOVRCLR = 1;
 SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1;
#else//串口为一般中断模式
 Uart.ReceiveBuffer[Uart.ReceiveWritePtr ++] = SciaRegs.SCIRXBUF.all;
 Uart.ReceiveWritePtr &= sizeof(Uart.ReceiveBuffer) - 1;
#endif 
 PieCtrlRegs.PIEACK.bit.ACK9 = 1;
}


interrupt void ISRADC(void)
{
   Adc.Result[0] = AdcRegs.ADCRESULT0 >>4;
   Adc.Result[1] = AdcRegs.ADCRESULT1 >>4;


   // Reinitialize for next ADC sequence
   AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;         // Reset SEQ1
   AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;       // Clear INT SEQ1 bit
   PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;   // Acknowledge interrupt to PIE
}


有关帖图如下:


 


点击开大图


点击开大图

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户377235 2013-8-1 15:37

你好,能不能麻烦您把‘DSP2812串口FIFO设置及"手动触发"发送中断服务之C++程序’完整版发给我一份,初学者,调试历程sci程序一直调不通了,谢谢了prc_an@163.com

相关推荐阅读
雁塔菜农 2012-04-05 17:51
2012年度新唐Cortex-M0助学开发套件有约束条件赠送申报贴
2012年度新唐Cortex-M0助学套件从4月起每月有约束条件发放16套。 申报人必须是21ic或 EDNC 会员 并具备1月的会龄。 申报时必须注明“遵守约束条件,缴纳250元订金,上...
雁塔菜农 2012-04-05 17:04
2012年度Cortex-M0助学园地推广框图
...
雁塔菜农 2012-04-01 17:59
2012年度Cortex-M0助学园地奖励计划细则
抢楼请点击:菜地公告:即日起创建《菜农Cortex-M0助学园地》(盖楼入口) 每月10号和25号的下午2:50进行2次抢楼,规则同去年12月的疯狂抢楼活动。 奖品由21IC、北航、广州迪圣...
雁塔菜农 2012-02-03 08:19
菜农谋略:搞定牛人宋俊德,对女牛人孙昌旭说:“记住,俺是雁塔菜农~~~ ”
http://www.baidu.com/s?wd=%B2%CB%C5%A9%D0%A6%CC%B8%A1%B6%D0%C2%C0%CB%C3%FB%C8%CB%D0%A7%D3%A6%A1%B7...
EE直播间
更多
我要评论
1
5
关闭 站长推荐上一条 /3 下一条