搜索
bottom↓
回复: 2

为何2812内部ADC的ADCTRL2寄存器中RST_SEQ1位不能置1

[复制链接]

出0入0汤圆

发表于 2012-4-21 17:21:21 | 显示全部楼层 |阅读模式
配置SEQ1和SEQ2为 级联模式,顺序采样16次(0~3通道各采集4次),并且SEQ1的启动转换触发,使能ADC中断
下面是配置内部ADC的代码:
  1. void InitAdc(void)
  2. {
  3.         unsigned int i;
  4.        
  5.         AdcRegs.ADCTRL1.bit.RESET=1;                                //复位整个ADC模块
  6.         NOP;
  7.         NOP;
  8.         AdcRegs.ADCTRL1.bit.RESET=0;
  9.         AdcRegs.ADCTRL1.bit.SUSMOD=3;                                //仿真悬挂模式,排序器和其他逻辑立即停止
  10.         AdcRegs.ADCTRL1.bit.ACQ_PS=15;                                //采集窗口大小,即SOC的脉冲宽度,同时也决定了采样开关闭合的时间
  11.         AdcRegs.ADCTRL1.bit.CPS=0;                                        //Fclk = CLK/1,对外设时钟HSPCLK分频
  12.         AdcRegs.ADCTRL1.bit.CONT_RUN=0;                                //开始/停止模式,需要在中断服务程序中复位排序器
  13.         AdcRegs.ADCTRL1.bit.SEQ_CASC=1;                                //级联模式,SEQ1和SEQ2作为一个16状态排序工作
  14.        
  15.         AdcRegs.ADCTRL3.bit.EXTREF = 0;                                //内部参考源的输出引脚
  16.         AdcRegs.ADCTRL3.bit.ADCBGRFDN=3;                        //带隙和参考电路上电
  17.         for(i=0;i<10000;i++)        NOP;
  18.         AdcRegs.ADCTRL3.bit.ADCPWDN=1;                                //ADC其他模拟地电路上电
  19.         for(i=0;i<5000;i++)        NOP;
  20.         AdcRegs.ADCTRL3.bit.ADCCLKPS=15;                        //ADC的内核时钟分频器,参数待定
  21.         AdcRegs.ADCTRL3.bit.SMODE_SEL=0;                        //顺序采样模式,每次对一个通道进行采样
  22.        
  23.         AdcRegs.MAX_CONV.bit.MAX_CONV=15;                        //一次采样最大16个通道
  24.        
  25.         AdcRegs.CHSELSEQ1.bit.CONV00=0;                                //排序器初始化,对AINA0~3依次采样,连续采样16次,每道4次
  26.         AdcRegs.CHSELSEQ1.bit.CONV01=1;
  27.         AdcRegs.CHSELSEQ1.bit.CONV02=2;
  28.         AdcRegs.CHSELSEQ1.bit.CONV03=3;
  29.        
  30.         AdcRegs.CHSELSEQ2.bit.CONV04=0;
  31.         AdcRegs.CHSELSEQ2.bit.CONV05=1;
  32.         AdcRegs.CHSELSEQ2.bit.CONV06=2;
  33.         AdcRegs.CHSELSEQ2.bit.CONV07=3;
  34.        
  35.         AdcRegs.CHSELSEQ3.bit.CONV08=0;
  36.         AdcRegs.CHSELSEQ3.bit.CONV09=1;
  37.         AdcRegs.CHSELSEQ3.bit.CONV10=2;
  38.         AdcRegs.CHSELSEQ3.bit.CONV11=3;
  39.        
  40.         AdcRegs.CHSELSEQ4.bit.CONV12=0;
  41.         AdcRegs.CHSELSEQ4.bit.CONV13=1;
  42.         AdcRegs.CHSELSEQ4.bit.CONV14=2;
  43.         AdcRegs.CHSELSEQ4.bit.CONV15=3;
  44.                
  45.         AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ=0;                        //不允许EVB SOC
  46.         AdcRegs.ADCTRL2.bit.RST_SEQ1=1;                                //复位排序器1
  47.         AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1;                        //使能INT SEQ1产生的中断申请
  48.         AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1=0;                        //每个SEQ1序列结束时,INT SEQ1置位
  49.         AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=0;                        //EVA不能启动SEQ1
  50.         AdcRegs.ADCTRL2.bit.EXT_SOC_SEQ1=0;                        //外部ADCSOC引脚信号不能启动ADC
  51.         AdcRegs.ADCTRL2.bit.RST_SEQ2=0;                                //复位排序器2
  52.         AdcRegs.ADCTRL2.bit.SOC_SEQ2=0;                                //SEQ2的转换触发启动
  53.         AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2=0;                        //INT SEQ2中断禁止
  54.         AdcRegs.ADCTRL2.bit.INT_MOD_SEQ2=0;                        //中断模式,每个/间隔
  55.         AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ2=0;                        //EVB SOC不能启动SEQ2
  56. //        AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;                                //SEQ1的启动转换触发,软件启动转换

  57.         PieCtrl.PIEIER1.bit.INTx6 = 1;                                //使能PIE模块中的ADC采样中断
  58. }       
复制代码
在中断服务程序中清除SEQ1中断标志位,并置位AD_DOWN_Flag,数据处理程序在主程序中
下面是中断程序
  1. AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR = 1;
  2.         PieCtrl.PIEACK.all = 0x0001;
  3.         AD_DOWN_Flag = 1;
  4.         EINT;
  5.    return;
复制代码
现在的问题是:仿真环境中,可以进一次ADC中断,但是执行完主程序中的
  1. AD_DOWN_Flag = 0;
  2.                         NOP;       
  3.         AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;
  4.                         NOP;
  5.         AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;       
复制代码
后就不能再进入中断了。

逐步运行发现AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;这一句不能执行,RST_SEQ1不能置1,就是不能复位排序器,并且ADC状态寄存器中的INT SEQ1始终为1

请问这是为什么?为何RST_SEQ1不能置1?有什么解决的方法么?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2012-4-23 18:35:18 | 显示全部楼层
试了一些方法,发现答案了!
以前写的程序用的头文件不是ti公司原版的,是买的一块开发板上的头文件。现全部换为TI公司的。编译连接的库文件也用ccs自带的,编译运行成功了。复位排序器成功,也能进中断了。

出0入0汤圆

 楼主| 发表于 2012-4-23 18:37:13 | 显示全部楼层
所以,写程序还是在ti公司例程上修改比较好,能减少很多问题。那些低质量的开发板简直是......无语
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 11:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表