查看: 6765|回复: 11

[求助] KEA8 FIFO模式ADC转换问题

[复制链接]

该用户从未签到

4

主题

23

帖子

0

注册会员

Rank: 2

积分
139
最后登录
1970-1-1
发表于 2015-3-18 00:15:47 | 显示全部楼层 |阅读模式
现在调试KEA8的FIFO模式出现如下问题FIFO模式为2级时,一切正常。
FIFO模式为3级时,ADC不启动,单步调试发现最后一次给Channel FIFO赋值的时候 ADC_SC1没有变化,应该是Channel FIFO没填满导致ADC不启动的。
请问FSL的FAE,这是因为赋值操作不当引起的吗?
另外,数据手册中给的FIFO ADC参考初始化代码channel FIFO操作如下,是不是有问题?为什么是多个转换通道或的结果?
// dummy the 1st channel
ADC_SC1 = ADC_SC1_ADCH0_MASK;
// dummy the 2nd channel
ADC_SC1 = ADC_SC1_ADCH1_MASK | ADC_SC1_ADCH0_MASK;
// dummy the 3rd channel
ADC_SC1 = ADC_SC1_ADCH2_MASK | ADC_SC1_ADCH0_MASK;
// dummy the 4th channel and ADC starts conversion
ADC_SC1 = ADC_SC1_AIEN_MASK | ADC_SC1_ADCH2_MASK | ADC_SC1_ADCH1_MASK | ADC_SC1_ADCH0_MASK;

我知道答案 目前已有11人回答
回复

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2015-3-18 10:44:22 | 显示全部楼层
你好。
我认为这个定义也是有些问题的,不知道ADC_SC1_ADCH0_MASK的定义是什么。
实际上想实现的是:input channels of 1, 3, 5, and 7.
也就是1,3,5,7通道,每次设置通道,应该是直接设置相应的通道即可。
你设置3级,具体配置是怎样的呢 ?
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

23

帖子

0

注册会员

Rank: 2

积分
139
最后登录
1970-1-1
 楼主| 发表于 2015-3-18 21:32:47 | 显示全部楼层
初始化代码如下:
void ADC_Init(void)
{
        SIM->SCGC |= SIM_SCGC_ADC_MASK;                                                                                /* Enable bus clock in ADC*/
        ADC->APCTL1 = ADC_APCTL1_ADPC(ADC_CHANNEL_AD4)                 //ÊäÈë¹Ü½ÅʹÄÜ
                                                        | ADC_APCTL1_ADPC(ADC_CHANNEL_AD5) ;
        ADC->SC4 |= ADC_SC4_AFDEP(ADC_FIFO_LEVEL3) ;
        ADC->SC3  = 0;                                                                                                                                                //³õʼ»¯SC3
        ADC->SC3 |= ADC_SC3_ADICLK(CLOCK_SOURCE_ADACK) ;        //ÅäÖÃADCʱÖÓÔ´       
        ADC->SC3 |= ADC_SC3_MODE(ADC_MODE_12BIT) ;                                //ÅäÖÃADCת»»¾«¶È
        ADC->SC3 |= ADC_SC3_ADLSMP_MASK ;                                                                        //ÅäÖÃADC²ÉÑùʱ¼ä
        ADC->SC3 |= ADC_SC3_ADIV(ADC_ADIV_DIVIDE_1) ;                        //ÅäÖÃADCʱÖÓ·ÖÆµ±È
        ADC->SC2 = 0x00 ;                                                                                                                                       
//        ADC->SC1  = 0x00 ;                                                                                                                                //ʹÄÜADCÄ£¿é
//        ADC->SC1 |= ADC_SC1_AIEN_MASK ;                                                                                //ʹÄÜADCÖжϠ                      
//        ADC->SC1 |= ADC_SC1_ADCO_MASK ;                                                                                //ʹÄÜÁ¬Ðø×ª»»
       
}

void ADC_ChannelSet(unsigned char channel)
{
        unsigned int buff ;       
        buff  = ADC->SC1 ;                                                                                        //¶ÁÈ¡SC1ÊýÖµ
        buff &= ~ADC_SC1_ADCH_MASK ;                                                //Ô¤´¦ÀíbuffÊý¾Ý
        ADC->SC1 = buff|ADC_SC1_ADCH(channel) ;        //ͨµÀֵѡÔñ
}
执行代码如下
                ADC_ChannelSet(ADC_CHANNEL_AD5);
                ReadSc1 = ADC->SC1 ;
                ADC_ChannelSet(ADC_CHANNEL_AD4);
                ReadSc1 = ADC->SC1 ;
                ADC_ChannelSet(ADC_CHANNEL_AD23_BANDGAP);
                ReadSc1 = ADC->SC1 ;
                ADCR[0] = ADC->R ;
                ADCR[1] = ADC->R ;
                ADCR[2] = ADC->R ;
单词转换读ADC->SC1的值都是OK的,但是开FIFO后只有第一次赋值后读回来的数是正常的。也就是后面的赋值都没有写到SC1寄存器里面。
另外,KEA系列的勘误表什么时候会出来,能否确认这不是个BUG?
谢谢!
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2015-3-19 14:04:01 | 显示全部楼层
123123-359596 发表于 2015-3-18 21:32
初始化代码如下:
void ADC_Init(void)
{

楼主,你设置了转换通道之后, 都没有等待转换完成就直接读结果寄存器,这个是有问题的。
在读结果寄存器之前,加上等待转换完成。
关于KEA的勘误表什么时候出来,暂时还没有消息。
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

23

帖子

0

注册会员

Rank: 2

积分
139
最后登录
1970-1-1
 楼主| 发表于 2015-3-19 22:08:50 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2015-3-19 14:04
楼主,你设置了转换通道之后, 都没有等待转换完成就直接读结果寄存器,这个是有问题的。
在读结果寄存器 ...

您好,即使我没有等待转换结束就读寄存器了,但是在我还没有读寄存器的时候,我写入3次通道值的时候每次写入后SC1寄存器的值也应该有对应变化啊,问题就在于我每次写入后寄存器的值都没有正常变化。这才是问题的关键。请问FSL官方能提供一段有参考价值的代码吗?
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2015-3-25 16:33:38 | 显示全部楼层
123123-359596 发表于 2015-3-19 22:08
您好,即使我没有等待转换结束就读寄存器了,但是在我还没有读寄存器的时候,我写入3次通道值的时候每次 ...

楼主你好!
不好意思,回复迟了。
你写入2次以上,其实ADC_SC1的寄存器值记录的是第一次的channel值,其余的都压入了AD CHANNEL FIFO中,是看不到的。这些都是芯片自动去做的。所以,你说的现象是正确的。
实际结果是按照每个通道去转换ADC值的,你可以测试下,你三个通道采集的值对不对,我这边测试是对的。
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2015-3-26 13:43:06 | 显示全部楼层
非常感谢你关于Kinetis的技术问题。如果你没有其他问题,我们将此贴默认为已解决.
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

23

帖子

0

注册会员

Rank: 2

积分
139
最后登录
1970-1-1
 楼主| 发表于 2015-3-29 23:53:36 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2015-3-26 13:43
非常感谢你关于Kinetis的技术问题。如果你没有其他问题,我们将此贴默认为已解决. ...

您好,我以为这个帖子不会有人回了就没关注。
我按您说的方法测试了一下,的确是可以连续读会三次转换的数据了。
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

23

帖子

0

注册会员

Rank: 2

积分
139
最后登录
1970-1-1
 楼主| 发表于 2015-3-29 23:54:51 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2015-3-26 13:43
非常感谢你关于Kinetis的技术问题。如果你没有其他问题,我们将此贴默认为已解决. ...

但是读回来的数据存在一个问题,就是结果1和结果2是相反的。
比如我一次写CH1 CH2 CH3
读回来的结果是CH2 CH1 CH3
能否帮忙把你的测试代码PM给我参考一下呢?谢谢!
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2015-3-30 09:30:50 | 显示全部楼层
123123-359596 发表于 2015-3-29 23:54
但是读回来的数据存在一个问题,就是结果1和结果2是相反的。
比如我一次写CH1 CH2 CH3
读回来的结果是CH2 ...

[url=https://www.freescale.co
m/webapp/sps/download/license.jsp?colCode=KEXX_DRIVERS_V1.2.1_DEVD&location=null&WT_TYPE=Device%20Drivers&WT_VENDOR=FREESCALE&WT_FILE_FORMAT=zip&WT_ASSET=Downloads&fileExt=.zip&Parent_nodeId=1390600077229715168045&Parent_pageType=product]KEXX_DRIVERS_V1.2.1_DEVD[/url]

这个是KE系列的,但是对于ADC FIFO的使用是一样的,你可以参考下ADC_FIFO_demo例程。

回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-23 04:56 , Processed in 0.103385 second(s), 30 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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