打印

采集ADC数值通过SCI发送给上位机

[复制链接]
2888|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kxyyaonixingfu|  楼主 | 2014-3-27 21:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问大仙们·~我想采集一个通道的ADC数值,并通过SCI传送给电脑上的串口通讯工具~~设置了三个中断。一个是ADC,一个是SCI接受中断,和SCI发送中断。结果显示的数据时不正确的~~而且~~我觉得没有发送应该也是可以的吧~~去掉之后串口调试根本收不到数据了·~请大仙们指教~~~头痛ing~~~~

相关帖子

沙发
zhangmangui| | 2014-3-27 22:19 | 只看该作者
发送中断没有必要开了吧   
首先确保波特率正确  然后确保DSP是怎么发送的
上位机需要用字符或十六进制显示

使用特权

评论回复
板凳
kxyyaonixingfu|  楼主 | 2014-3-28 08:59 | 只看该作者
zhangmangui 发表于 2014-3-27 22:19
发送中断没有必要开了吧   
首先确保波特率正确  然后确保DSP是怎么发送的
上位机需要用字符或十六进制显示 ...

恩。是没必要~~不开也行。我就是单纯的写上两个中断:ADC和SCI。不知道是不是自行发送的呢?波特率是没问题的·~~

使用特权

评论回复
地板
kxyyaonixingfu|  楼主 | 2014-3-31 11:37 | 只看该作者
貌似错了~~是接收中断没有必要开了·~@zhangmangui  

使用特权

评论回复
5
kxyyaonixingfu|  楼主 | 2014-3-31 17:22 | 只看该作者
请大仙们进来看看帮帮忙啊·~~···

使用特权

评论回复
6
zhangmangui| | 2014-3-31 21:11 | 只看该作者
kxyyaonixingfu 发表于 2014-3-31 11:37
貌似错了~~是接收中断没有必要开了·~@zhangmangui

接收中断不开的话   那你接收采用查询方式也可以
发送中断没必要开

使用特权

评论回复
7
kxyyaonixingfu|  楼主 | 2014-4-1 14:58 | 只看该作者
zhangmangui 发表于 2014-3-31 21:11
接收中断不开的话   那你接收采用查询方式也可以
发送中断没必要开

我想的是,要用sci将AD采集的值发给电脑上的串口工具,那不应该是发送中断开吗?我不从上位机接收任何信息。。而且只是接收中断开的话,通讯不了。请大仙指教·~~·

使用特权

评论回复
8
zhangmangui| | 2014-4-1 21:35 | 只看该作者
kxyyaonixingfu 发表于 2014-4-1 14:58
我想的是,要用sci将AD采集的值发给电脑上的串口工具,那不应该是发送中断开吗?我不从上位机接收任何信 ...

配置好SCI   直接往发送寄存器中写数据就可以啦  
发送中断是指你把发送的数据写到发送寄存器中   等发送完了之后就会触发中断
所以发送中断是没必要的

使用特权

评论回复
9
kxyyaonixingfu|  楼主 | 2014-4-7 21:40 | 只看该作者
zhangmangui 发表于 2014-4-1 21:35
配置好SCI   直接往发送寄存器中写数据就可以啦  
发送中断是指你把发送的数据写到发送寄存器中   等发送 ...

下面是我的程序~~跪求大神修改~~这个已经折磨我好久了~~


Uint16 sdataB[2];        // Send data for SCI-B
//Uint16 rdataB[2];        // Received data for SCI-B
Uint16 ConversionCount=0;
Uint16 test=0;
Uint16 Voltage[3];   
interrupt void adc_isr(void);
interrupt void scibTxFifoIsr(void);
//interrupt void scibRxFifoIsr(void);
void scib_fifo_init(void);
void ADC_init(void);
//void scib_xmit(Uint16 a);
//void scib_msg(Uint16 * msg);
Uint16 flag;
void main()
{

   InitSysCtrl();
   InitScibGpio();
   EALLOW;
     SysCtrlRegs.HISPCP.all = ADC_MODCLK;        // HSPCLK = SYSCLKOUT/ADC_MODCLK
   EDIS;
   InitXintf16Gpio();
   DINT;
   InitPieCtrl();
   IER = 0x0000;
   IFR = 0x0000;
   InitPieVectTable();

   InitAdc();
   scib_fifo_init();
   ADC_init();
        EALLOW;  // This is needed to write to EALLOW protected register
       PieVectTable.ADCINT = &adc_isr;
       //PieVectTable.SCIRXINTB=&scibRxFifoIsr;
        PieVectTable.SCITXINTB= &scibTxFifoIsr;
        EDIS;
        PieCtrlRegs.PIECTRL.bit.ENPIE = 1;   // Enable the PIE block
        PieCtrlRegs.PIEIER1.bit.INTx6 = 1;      //adc中断1.6
        //PieCtrlRegs.PIEIER9.bit.INTx3=1;     // PIE Group 9, INT3
        PieCtrlRegs.PIEIER9.bit.INTx4=1;     //  9.4发送中断
        IER |= M_INT1; // Enable CPU Interrupt 1
        IER |= M_INT9;        // Enable CPU INT
          EINT;          // Enable Global interrupt INTM
          ERTM;  // For this example, init the ADC

          AdcRegs.ADCTRL2.all = 0x2800;
for(;;);

}
interrupt void  adc_isr(void)
{
        ConversionCount++;
        //Uint16 i;
     // AdcRegs.ADCTRL2.all = 0x2800;
      //while(AdcRegs.ADCST.bit.INT_SEQ1 == 0);
      //for(i=0;i<3;i++)
             //{
              Voltage[0]=((AdcRegs.ADCRESULT0) >>4);
             //}
            // Voltage[1]=AdcRegs.ADCRESULT1 >>4;

             AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;       // Clear INT SEQ1 bit
             AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;         // Reset SEQ1
            PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;   // Acknowledge interrupt to PIE
             DELAY_US(100);

  //return;
}
interrupt void scibTxFifoIsr(void)
{

   Uint16 i=0;
  test++;
    for(i=0; i<2; i++)
    {

          ScibRegs.SCITXBUF=sdataB;     // Send data
      //while(ScibRegs.SCICTL2.bit.TXRDY!=1){}
        }
   // text++;
        ScibRegs.SCIFFTX.bit.TXFFINTCLR=1;  // Clear Interrupt flag
        PieCtrlRegs.PIEACK.all|=0x100;      // Issue PIE ACK
        EINT;

}

/*interrupt void scibRxFifoIsr(void)
{
    Uint16 i;
        for(i=0;i<8;i++)
        {
                //ScibRegs.SCIRXBUF.all=Voltage1[ConversionCount];
            sdataB=ScibRegs.SCIRXBUF.all;         // Read data
        }
        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.SCICTL1.bit.TXENA=1;    //发送使能
   ScibRegs.SCICTL2.bit.TXINTENA =1;
  // ScibRegs.SCICTL2.bit.RXBKINTENA =1;
   ScibRegs.SCIHBAUD    =0x01;
   ScibRegs.SCILBAUD    =0xE7 ;//9600
//  ScibRegs.SCICCR.bit.LOOPBKENA =0; // Enable loop back
   ScibRegs.SCIFFTX.all=0xC020;    //发送FIFO为空时发生中断
  // 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;

}


   void ADC_init()
      // Specific ADC setup for this example:
   {

           AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;  // 连续采样Sequential mode: Sample rate   = 1/[(2+ACQ_PS)*ADC clock in ns]
                         //                     = 1/(3*40ns) =8.3MHz (for 150 MHz SYSCLKOUT)
                                             //                     = 1/(3*80ns) =4.17MHz (for 100 MHz SYSCLKOUT)
                                             // If Simultaneous mode enabled: Sample rate = 1/[(3+ACQ_PS)*ADC clock in ns]
    AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;
    AdcRegs.ADCTRL3.bit.SMODE_SEL=0;          //顺序采样
    AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;         // 级联模式(=0为双序列模式)
    AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;    //  采样ADCINA0和ADCINB0
    AdcRegs.ADCTRL1.bit.CONT_RUN = 1;         // 连续转换模式

    AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1;         // Enable Sequencer override feature
    AdcRegs.ADCCHSELSEQ1.all = 0x0;           // Initialize all ADC channel selects to A0
   // AdcRegs.ADCCHSELSEQ2.all = 0x0;
   // AdcRegs.ADCCHSELSEQ3.all = 0x0;
   // AdcRegs.ADCCHSELSEQ4.all = 0x0;
    AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x0;
    // convert and store in 8 results registers最大采样通道数为2,一次采两个通道,总共可采4个通道
// Start SEQ1   软件触发
    AdcRegs.ADCTRL2.all = 0x2800;//0x2800;  //AdcRegs.ADCTRL2.bit.SOC_SEQ1=1; 软件触发,中断使能
//0800为定时中断触发转换,中断使能。




   }

使用特权

评论回复
10
zhangmangui| | 2014-4-7 21:55 | 只看该作者
kxyyaonixingfu 发表于 2014-4-7 21:40
下面是我的程序~~跪求大神修改~~这个已经折磨我好久了~~

寄存器都不知道了   一时看不出来
不好意思

使用特权

评论回复
11
kxyyaonixingfu|  楼主 | 2014-4-8 08:21 | 只看该作者
zhangmangui 发表于 2014-4-7 21:55
寄存器都不知道了   一时看不出来
不好意思

恩~~么事~~~热心的大神~~~

使用特权

评论回复
12
zercola| | 2014-6-18 18:22 | 只看该作者
请问有解决么?能否指导我一下呢

使用特权

评论回复
13
1988020566| | 2014-6-19 10:03 | 只看该作者

使用特权

评论回复
14
lifemiracle06| | 2015-4-25 21:43 | 只看该作者
楼主,我也遇到相同的问题,求帮助

使用特权

评论回复
15
jesuswd| | 2015-4-28 08:42 | 只看该作者
你的发送中断怎么进入的,没写数据进去,他能开始第一个中断吗?

使用特权

评论回复
16
quray1985| | 2015-4-29 09:09 | 只看该作者
先用查询方式,确定硬件没有问题吧
然后中断一个一个的开

使用特权

评论回复
17
cowboy2014| | 2015-4-29 21:00 | 只看该作者
先确保adc和sci都是可用的,然后再想想如何将两者结合起来

使用特权

评论回复
18
dicktime| | 2015-5-7 09:45 | 只看该作者
quray1985 发表于 2015-4-29 09:09
先用查询方式,确定硬件没有问题吧
然后中断一个一个的开

我跑过一个中断收发程序,上位机发什么 下位机就返回什么,是成功的,我觉得这就说明硬件没问题吧。

但是我自己编写了个只有发送功能的程序,无论用查询模式还是中断模式,发现上位机接收到的都是空格,十六进制的话也就是0x00,不知道可能错在哪里。因为我一直监测这SCITXBUF,里面的值确实是对的


请大神们不吝赐教,指出可能犯错的地

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

46

帖子

0

粉丝