硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3319|回复: 21
收起左侧

429驱动7616测工频

  [复制链接]

36

主题

249

回帖

357

积分

高级会员

积分
357
发表于 2020-10-16 16:33:29 | 显示全部楼层 |阅读模式
用429的FMC驱动两块7616;用两个定时器触发采集256个点一个周期;两个外部中断触发读取数据。每个7616上有一段电压,再用两个定时器捕获采集两端电压的两个频率。1号7616中一段电压的频率正确,2号7616中计算出的频率受到1号7616是否开启的影响;关闭1号7616,2号频率正确;关闭1号7616的触发定时器,2号正确;把1号读取数据的FMC的地址修改为2号的,2号频率正确。读取数据时互相关闭总中断,没有影响。一时间没了处理的思路,想求助。
1.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2020-10-17 11:00:32 | 显示全部楼层
通过你的描述来看,是不是你的中断程序执行时间太长了,影响了两个同时处理。
回复

使用道具 举报

36

主题

249

回帖

357

积分

高级会员

积分
357
 楼主| 发表于 2020-10-19 08:29:54 | 显示全部楼层
eric2013 发表于 2020-10-17 11:00
通过你的描述来看,是不是你的中断程序执行时间太长了,影响了两个同时处理。

也有可能。如果是这个原因的话,我把第一个模块中断的地址AD7616_Data_Result_ONE 修改成第二个模块的地址AD7616_Data_Result_TWO;这样两个频率都没问题,虽然MODE1读出的数据有问题,但是中断处理时间应该没怎么变。这又解释不通了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2020-10-19 11:52:45 | 显示全部楼层
zhengwending 发表于 2020-10-19 08:29
也有可能。如果是这个原因的话,我把第一个模块中断的地址AD7616_Data_Result_ONE 修改成第二个模块的地 ...

把中断里面OS相关的都删掉,单纯测试是否正常。
回复

使用道具 举报

36

主题

249

回帖

357

积分

高级会员

积分
357
 楼主| 发表于 2020-10-19 13:11:43 | 显示全部楼层
eric2013 发表于 2020-10-19 11:52
把中断里面OS相关的都删掉,单纯测试是否正常。

谢谢版主积极回复!谢谢!我试了下,不行。2段还是有问题,偶尔会正确一次。我把I段的FMC的地址填写为固定的数值,比如就是20常数,计算的频率就都正确了。     摸不着头绪了。
回复

使用道具 举报

36

主题

249

回帖

357

积分

高级会员

积分
357
 楼主| 发表于 2020-10-30 09:46:16 | 显示全部楼层
eric2013 发表于 2020-10-19 11:52
把中断里面OS相关的都删掉,单纯测试是否正常。

遇到了新问题,也没人商量,只能还来请教版主了;就是两个7616用一个FMC,开始用busy用外部中断的形式,两个读取的数据都正确,CPU利用率太高了。改成了BUSY接TIM的捕获DMA读取的形式。都是用的DMA2,程序几乎一样。一个7616读取正确,另一个读取的数据错位(比如自测第一字节定是0xAAAA,但是一会儿数组这个位置显示AAAA,一会儿那个位置显示AAAA),是不是可以FMC的布线有点问题?软件配置地址保持和数据保持我对了,也没啥问题。也没有其他的分析工具
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2020-10-30 10:30:57 | 显示全部楼层
zhengwending 发表于 2020-10-30 09:46
遇到了新问题,也没人商量,只能还来请教版主了;就是两个7616用一个FMC,开始用busy用外部中断的形式, ...

你是两个AD7616是直接就焊接到主板上的吗,还是扩展模块的形式。
回复

使用道具 举报

36

主题

249

回帖

357

积分

高级会员

积分
357
 楼主| 发表于 2020-10-30 13:05:08 | 显示全部楼层
eric2013 发表于 2020-10-30 10:30
你是两个AD7616是直接就焊接到主板上的吗,还是扩展模块的形式。

直接焊接在板子上的,以为是两个有影响,把没问题的那个去掉了,单独调这个有问题的!但是另一个去掉,这个还是有问题!读出的数据还是错着位,没规律!
void AD7616_FSMC_Config(void)
{
        FMC_NORSRAMInitTypeDef  init;
        FMC_NORSRAMTimingInitTypeDef  p;

        /* 使能FSMC时钟 */
        RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FMC, ENABLE);
        // 1 / 180M = 0.00556us = 5.56ns
       
        /*
                AD7616规格书要求(3.3V时):RD读信号低电平脉冲宽度最短30ns,高电平脉冲最短宽度10ns。
        */
       
        p.FMC_AddressSetupTime = 3;                                                //低   或者8
        p.FMC_AddressHoldTime = 0;
        p.FMC_DataSetupTime = 7;                                                        //高   或者4
        p.FMC_BusTurnAroundDuration = 0;
        p.FMC_CLKDivision = 0;
        p.FMC_DataLatency = 0;
        p.FMC_AccessMode = FMC_AccessMode_A;
       
        init.FMC_Bank = FMC_Bank1_NORSRAM1;
        init.FMC_DataAddressMux = FMC_DataAddressMux_Disable;
        init.FMC_MemoryType = FMC_MemoryType_SRAM;
        init.FMC_MemoryDataWidth = FMC_NORSRAM_MemoryDataWidth_16b;
        init.FMC_BurstAccessMode = FMC_BurstAccessMode_Disable;
        init.FMC_AsynchronousWait = FMC_AsynchronousWait_Disable;
        init.FMC_WaitSignalPolarity = FMC_WaitSignalPolarity_Low;
       
        init.FMC_WrapMode = FMC_WrapMode_Disable;
        init.FMC_WaitSignalActive = FMC_WaitSignalActive_BeforeWaitState;
        init.FMC_WriteOperation = FMC_WriteOperation_Enable;
        init.FMC_WaitSignal = FMC_WaitSignal_Disable;
        init.FMC_ExtendedMode = FMC_ExtendedMode_Enable;
        init.FMC_WriteBurst = FMC_WriteBurst_Disable;
        init.FMC_ReadWriteTimingStruct = &p;
        init.FMC_WriteTimingStruct = &p;
        init.FMC_ContinousClock = FMC_CClock_SyncOnly;
        FMC_NORSRAMInit(&init);
       
        /* - BANK 1 (of NOR/SRAM Bank 1~4) is enabled */
        FMC_NORSRAMCmd(FMC_Bank1_NORSRAM1, ENABLE);
//        FMC_NORSRAMCmd(FMC_Bank1_NORSRAM2, ENABLE);
}


void AD7616_DMA_MODE1_Config(uint16_t count)
{
        DMA_InitTypeDef DMA_InitStructure;
       
        DMA_DeInit(DMA2_Stream2);
               
        DMA_InitStructure.DMA_Channel = DMA_Channel_0;
        DMA_InitStructure.DMA_PeripheralBaseAddr = NET_BASE_ADDR_ONE;
        DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC_7616_collect.AD7616_1_DATA[count];  
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
        DMA_InitStructure.DMA_BufferSize = 16;
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;
        DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;         
        DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
        DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
        DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_INC16;

        DMA_Init(DMA2_Stream2,&DMA_InitStructure);

        DMA_ITConfig(DMA2_Stream2,DMA_IT_TC,ENABLE); //使能DMA传输完成中断
        DMA_ITConfig(DMA2_Stream2,DMA_IT_TE,ENABLE);
        DMA_Cmd(DMA2_Stream2,ENABLE);
}



1.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2020-10-31 08:52:04 | 显示全部楼层
zhengwending 发表于 2020-10-30 13:05
直接焊接在板子上的,以为是两个有影响,把没问题的那个去掉了,单独调这个有问题的!但是另一个去掉,这 ...

作为局部变量,这两个要清零

FMC_NORSRAMInitTypeDef  init = {0}
FMC_NORSRAMTimingInitTypeDef  p = {0}
然后就是你的片选是怎么接的? NE1和NE2分别接一个吗
回复

使用道具 举报

36

主题

249

回帖

357

积分

高级会员

积分
357
 楼主| 发表于 2020-11-2 09:05:19 | 显示全部楼层
eric2013 发表于 2020-10-31 08:52
作为局部变量,这两个要清零

FMC_NORSRAMInitTypeDef  init = {0}

是分开接的,NE1和NE2
回复

使用道具 举报

36

主题

249

回帖

357

积分

高级会员

积分
357
 楼主| 发表于 2020-11-2 11:18:17 | 显示全部楼层
zhengwending 发表于 2020-11-2 09:05
是分开接的,NE1和NE2

我又试了下初始化清零,还是老样子!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2020-11-3 09:08:55 | 显示全部楼层
zhengwending 发表于 2020-11-2 09:05
是分开接的,NE1和NE2

别的问题看不出来了
你的硬件设计可能真有点问题。
回复

使用道具 举报

36

主题

249

回帖

357

积分

高级会员

积分
357
 楼主| 发表于 2020-11-3 14:18:06 | 显示全部楼层
eric2013 发表于 2020-11-3 09:08
别的问题看不出来了
你的硬件设计可能真有点问题。

嗯 谢谢!再想办法试他一试!
回复

使用道具 举报

36

主题

249

回帖

357

积分

高级会员

积分
357
 楼主| 发表于 2020-11-4 09:57:08 | 显示全部楼层
eric2013 发表于 2020-11-3 09:08
别的问题看不出来了
你的硬件设计可能真有点问题。

要说硬件有问题,我不用DMA的形式,我用EXTI的形式,这时两个读取的数据对没问题,但是CPU利用率太高了,其他的就没法处理了!  所以也疑惑。
回复

使用道具 举报

1

主题

17

回帖

20

积分

新手上路

积分
20
发表于 2021-4-27 17:52:03 | 显示全部楼层
请问楼主问题解决了吗?
回复

使用道具 举报

1

主题

17

回帖

20

积分

新手上路

积分
20
发表于 2021-4-27 17:52:32 | 显示全部楼层
感觉不只是时序问题,接口电平是否有些问题?
回复

使用道具 举报

36

主题

249

回帖

357

积分

高级会员

积分
357
 楼主| 发表于 2021-5-26 11:25:57 | 显示全部楼层
wade_szcn 发表于 2021-4-27 17:52
感觉不只是时序问题,接口电平是否有些问题?

还没有,有其他事情半路杀出,暂时搁置了!解决的话,我会尽量及时分享解决方法!
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2021-6-22 13:53:17 | 显示全部楼层
请教下,7616的busy信号一直为高是怎么回事?复位信号也给了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2021-6-23 08:46:22 | 显示全部楼层
whywhy 发表于 2021-6-22 13:53
请教下,7616的busy信号一直为高是怎么回事?复位信号也给了

应该没有正常启动转换
回复

使用道具 举报

36

主题

249

回帖

357

积分

高级会员

积分
357
 楼主| 发表于 2021-9-2 08:52:08 | 显示全部楼层
whywhy 发表于 2021-6-22 13:53
请教下,7616的busy信号一直为高是怎么回事?复位信号也给了

看看你的配置是否出了问题,有个位置是可以读出来,看配置对不对的
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2021-11-14 06:39:09 | 显示全部楼层
楼主问题解决了吗,我也是同样的问题,用DMA读出来都是A0通道的数据
回复

使用道具 举报

36

主题

249

回帖

357

积分

高级会员

积分
357
 楼主| 发表于 2021-12-9 13:03:40 | 显示全部楼层
dxhuo 发表于 2021-11-14 06:39
楼主问题解决了吗,我也是同样的问题,用DMA读出来都是A0通道的数据

没   z在忙其他事情
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 23:45 , Processed in 0.240669 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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