硬汉嵌入式论坛

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

[有问必答] STM32F407+AD7606

[复制链接]

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2022-3-6 19:16:00 | 显示全部楼层 |阅读模式
最近在使用AD7606芯片做一个数据采集器,学习了安富莱相关例程,有几点不理解的,请大神赐教。

#define AD7606_RESULT()    *(__IO uint16_t *)0x6C400000void AD7606_ReadNowAdc(void)
{
        g_tAD7606.sNowAdc[0] = AD7606_RESULT();        /* ¶áμú1·Ñù±¾ */
        g_tAD7606.sNowAdc[1] = AD7606_RESULT();        /* ¶áμú2·Ñù±¾ */
        g_tAD7606.sNowAdc[2] = AD7606_RESULT();        /* ¶áμú3·Ñù±¾ */
        g_tAD7606.sNowAdc[3] = AD7606_RESULT();        /* ¶áμú4·Ñù±¾ */
        g_tAD7606.sNowAdc[4] = AD7606_RESULT();        /* ¶áμú5·Ñù±¾ */
        g_tAD7606.sNowAdc[5] = AD7606_RESULT();        /* ¶áμú6·Ñù±¾ */
        g_tAD7606.sNowAdc[6] = AD7606_RESULT();        /* ¶áμú7·Ñù±¾ */
        g_tAD7606.sNowAdc[7] = AD7606_RESULT();        /* ¶áμú8·Ñù±¾ */
}

AD7606的8路信号读取是有时间间隔的,连续的读取8路信号不会产生错误吗?

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2022-3-7 04:33:20 | 显示全部楼层
顺序读取即可,在下次转换之前完成读取。
回复

使用道具 举报

210

主题

1045

回帖

1685

积分

至尊会员

More we do, more we can do.

积分
1685
发表于 2022-3-7 10:44:27 | 显示全部楼层
参见并行接口访问时序,具体哪种我没看:
截屏_2022-03-07_10-03-07.png
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2022-3-7 21:15:07 | 显示全部楼层
eric2013 发表于 2022-3-7 04:33
顺序读取即可,在下次转换之前完成读取。

您好,多谢回复。
我是这么理解的,读取(  g_tAD7606.sNowAdc[0] = AD7606_RESULT()  )这个地址的数据,作为第一路的输出,之后读取第二路时候,AD7606_RESULT()  这个地址内的数据刚好变成第二路吗?很明显c语言执行一句话的时间要比AD7606输出下一路的信号的时间要短。
还是说AD7606读取一次的信号存储在这个地址,以及之后的7个地址内,这个读取 ( g_tAD7606.sNowAdc[0] = AD7606_RESULT()  )语句是一次读取这个地址内的数据以及后面7个地址的数据,但是没有地址递增呢。


{
        g_tAD7606.sNowAdc[0] = AD7606_RESULT();        /* ¶áμú1·Ñù±¾ */
        g_tAD7606.sNowAdc[1] = AD7606_RESULT();        /* ¶áμú2·Ñù±¾ */
        g_tAD7606.sNowAdc[2] = AD7606_RESULT();        /* ¶áμú3·Ñù±¾ */
        g_tAD7606.sNowAdc[3] = AD7606_RESULT();        /* ¶áμú4·Ñù±¾ */
        g_tAD7606.sNowAdc[4] = AD7606_RESULT();        /* ¶áμú5·Ñù±¾ */
        g_tAD7606.sNowAdc[5] = AD7606_RESULT();        /* ¶áμú6·Ñù±¾ */
        g_tAD7606.sNowAdc[6] = AD7606_RESULT();        /* ¶áμú7·Ñù±¾ */
        g_tAD7606.sNowAdc[7] = AD7606_RESULT();        /* ¶áμú8·Ñù±¾ */
}

这只是一个简单的赋值啊。
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2022-3-7 21:18:28 | 显示全部楼层
emwin 发表于 2022-3-7 10:44
参见并行接口访问时序,具体哪种我没看:

您好,多谢回复。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2022-3-8 10:44:37 | 显示全部楼层
我不会啊 发表于 2022-3-7 21:15
您好,多谢回复。
我是这么理解的,读取(  g_tAD7606.sNowAdc[0] = AD7606_RESULT()  )这个地址的数据 ...

这个一定要看下时序图和对应的时序参数,比如我们这里仅关注连续8个通道的读取,不考虑下次启动转换的时间限制,你读取这8个通道的时间可以无限长,你要做的仅仅是顺序读取8次即可。
下面这两个参数只有最小值限制,没有最大值限制。
image.png
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2022-3-10 20:36:22 | 显示全部楼层
eric2013 发表于 2022-3-8 10:44
这个一定要看下时序图和对应的时序参数,比如我们这里仅关注连续8个通道的读取,不考虑下次启动转换的时 ...

您好,多谢,最近忙,回复满了。
对于FSMC和AD7606,我是不是可以这样理解
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2022-3-10 20:45:51 | 显示全部楼层
eric2013 发表于 2022-3-8 10:44
这个一定要看下时序图和对应的时序参数,比如我们这里仅关注连续8个通道的读取,不考虑下次启动转换的时 ...

多谢是不是可以这样理解开启一次转换,读取数据时。
image.png
执行这句语句,FSMC首先会自动配置时序,读取信号。
在经历过例程配置的地址建立时间(23.8s)和数据建立时间(23.8s)后,也就是CS和RD后赋值给数组。
接着CPU才会执行下一句数据读取。
image.png
即每次执行一路通道读取时候,程序会在这里卡这里(23.8s)+(23.8s)的时间来进行AD采集转换,而不是,简单的只是一句赋值。





回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2022-3-11 09:42:57 | 显示全部楼层
我不会啊 发表于 2022-3-10 20:45
多谢是不是可以这样理解开启一次转换,读取数据时。

执行这句语句,FSMC首先会自动配置时序,读取信号 ...

23.8s? 这个从哪里得出来的。

他就是依次读取的,只要你没有开启下次转换,本次8个通道的时间可以不限,你可以这样操作下,用示波器把几个控制信号都接上看下波形效果,就更好理解了。
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2022-3-11 11:05:49 | 显示全部楼层
eric2013 发表于 2022-3-11 09:42
23.8s? 这个从哪里得出来的。

他就是依次读取的,只要你没有开启下次转换,本次8个通道的时间可以不 ...

写错了 ,应该是 RD高持续35.7ns,低电平持续23.8ns  开发用户手册里面配置的。 不是AD7606的最小值。
多谢啊,这块我懂了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 20:07 , Processed in 0.314357 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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