OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7709|回复: 11

STM32的FSMC无地址线控制情况下,读取数据只需取任意地址吗

[复制链接]

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2014-9-17
在线时间
7 小时
发表于 2015-10-9 16:39:42 | 显示全部楼层 |阅读模式
5金钱
我用STM32的FSMC功能获取AD9240的数据,AD采样速度为100M。表示为什么取任意地址读到的数据不一样,或者我应该怎么读取到正确的数据。

最佳答案

查看完整内容[请看2#楼]

1、 return data 这个用法,相当于 adc = Bank1_SRAM4_ADDR + _addr,好像不对,但事实上又能测到脉冲,不明白了。       我一般用 i =  ( * ( u16 * ) ( 0x00000000 + 0x00000000 + 0x60000000 ) ) 这样的句子,你可以试试。 2、放慢读取速度,试试 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11473
金钱
11473
注册时间
2014-4-1
在线时间
1297 小时
发表于 2015-10-9 16:39:43 | 显示全部楼层

1、 return data 这个用法,相当于 adc = Bank1_SRAM4_ADDR + _addr,好像不对,但事实上又能测到脉冲,不明白了。
      我一般用 i =  ( * ( u16 * ) ( 0x00000000 + 0x00000000 + 0x60000000 ) ) 这样的句子,你可以试试。

2、放慢读取速度,试试。

3、固定针对一个地址,便于查问题。 


4、也许输入信号不稳定?


5、如果确认地址0始终正确,就先使用这个地址吧,问题放一放。



回复

使用道具 举报

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2014-9-17
在线时间
7 小时
 楼主| 发表于 2015-10-9 16:39:43 | 显示全部楼层
回复【11楼】xuande:
---------------------------------
感谢!找到问题了。确实是因为括号的问题,简直就是程序员的软肋,代码不够规范导致的。data= Bank1_SRAM4_ADDR + _addr;因为我定义Bank1_SRAM4_ADDR是这个地址上的值,后来把它加了_addr数值后自然是后面的数值全都不对了!

非常感谢。问题解决了。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-10-10 14:55:25 | 显示全部楼层
你这个应该是读任意地址就可以了。
OTR是个什么位?
有效数据是14位,你读取D0~D13试试嘛。
舍弃高位。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2014-9-17
在线时间
7 小时
 楼主| 发表于 2015-10-10 16:51:33 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
OTR是溢出位,我初始化了D0~D15的引脚,并全部下拉。运行代码的时候,我随意取了个设定的Bank1Section4的地址读取数值,结果发现数值都不一样。用示波器测试了下NOE,也没发现没有电平变化。
回复

使用道具 举报

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2014-9-17
在线时间
7 小时
 楼主| 发表于 2015-10-10 17:01:27 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
这是初始化及读取ADC数值的函数。
[mw_shl_code=c,true]void CLK_Init(void) { //SET GPIO CLK RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH,ENABLE); } #define Bank1_SRAM4_ADDR (*((volatile u16 *)(0x6C000000))) void FSMC_SRAM_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure; FSMC_NORSRAMTimingInitTypeDef Read_TimingInitStructure; RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC,ENABLE); GPIO_PinAFConfig(GPIOD, GPIO_PinSource4, GPIO_AF_FSMC); //NOE GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FSMC); //D0 GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FSMC); //D1 GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FSMC); //D2 GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_FSMC); //D3 GPIO_PinAFConfig(GPIOE, GPIO_PinSource7, GPIO_AF_FSMC); //D4 GPIO_PinAFConfig(GPIOE, GPIO_PinSource8, GPIO_AF_FSMC); //D5 GPIO_PinAFConfig(GPIOE, GPIO_PinSource9, GPIO_AF_FSMC); //D6 GPIO_PinAFConfig(GPIOE, GPIO_PinSource10, GPIO_AF_FSMC); //D7 GPIO_PinAFConfig(GPIOE, GPIO_PinSource11, GPIO_AF_FSMC); //D8 GPIO_PinAFConfig(GPIOE, GPIO_PinSource12, GPIO_AF_FSMC); //D9 GPIO_PinAFConfig(GPIOE, GPIO_PinSource13, GPIO_AF_FSMC); //D10 GPIO_PinAFConfig(GPIOE, GPIO_PinSource14, GPIO_AF_FSMC); //D11 GPIO_PinAFConfig(GPIOE, GPIO_PinSource15, GPIO_AF_FSMC); //D12 GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_FSMC); //D13 GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_FSMC); //D14 GPIO_PinAFConfig(GPIOD, GPIO_PinSource10, GPIO_AF_FSMC); //D15 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Pin = FSMC_D0_PIN | FSMC_D1_PIN |FSMC_D2_PIN | FSMC_D3_PIN | FSMC_D13_PIN | FSMC_D14_PIN | FSMC_D15_PIN; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = FSMC_D4_PIN | FSMC_D5_PIN |FSMC_D6_PIN | FSMC_D7_PIN | FSMC_D8_PIN | FSMC_D9_PIN | FSMC_D10_PIN | FSMC_D11_PIN | FSMC_D12_PIN; GPIO_Init(GPIOE, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Pin = FSMC_NOE_PIN; GPIO_Init(FSMC_NOE_PORT, &GPIO_InitStructure); Read_TimingInitStructure.FSMC_AddressSetupTime = 0x19; Read_TimingInitStructure.FSMC_AddressHoldTime = 0x00; Read_TimingInitStructure.FSMC_DataSetupTime = 0x19; Read_TimingInitStructure.FSMC_BusTurnAroundDuration = 0x00; Read_TimingInitStructure.FSMC_CLKDivision = 0x00; Read_TimingInitStructure.FSMC_DataLatency = 0x00; Read_TimingInitStructure.FSMC_AccessMode = FSMC_AccessMode_A; //Mode A FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;// NE4 BTCR[6],[7]?? FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM; FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//data 16bit FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_Disable; FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable; FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Disable; //write Disable FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; //WR same clk FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &Read_TimingInitStructure; FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4,ENABLE); } u16 ReadAdc(u8 _addr) { u16 data; data = Bank1_SRAM4_ADDR + _addr; return data; }[/mw_shl_code]
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-10-10 18:33:25 | 显示全部楼层
回复【3楼】zi_yang:
---------------------------------
NOE一定要有变化(脉冲,每读一次,有一个脉冲的),否则检查配置。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2014-9-17
在线时间
7 小时
 楼主| 发表于 2015-10-11 09:10:28 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
嗯,有捕捉到,之前示波器配置不正确,所以没捕捉到。但是为什么不同地址读取到的值不一样呢。我取的是16位数值,所以地址我是有+2的。 而且这几个地址读取的数值全是错的。
adc_dat = ReadAdc(0);
adc_dat1 = ReadAdc(2);
adc_dat2 = ReadAdc(4);
adc_dat3 = ReadAdc(6);


adc_dat4 = ReadAdc(8);
adc_dat5 = ReadAdc(10);
回复

使用道具 举报

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2014-9-17
在线时间
7 小时
 楼主| 发表于 2015-10-11 14:17:23 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
我发现无论我取Bank1的第几个选区,数值在各个地址和原来的选区是一样的。无法得到我的正确数值。真的是任意一个地址就可以了吗?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-10-11 22:47:05 | 显示全部楼层
回复【7楼】zi_yang:
---------------------------------
你都没有地址线
当然读任意地址都是一样的数据.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11473
金钱
11473
注册时间
2014-4-1
在线时间
1297 小时
发表于 2015-10-12 00:24:28 | 显示全部楼层
怎么不一样了,相差多少?
回复

使用道具 举报

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2014-9-17
在线时间
7 小时
 楼主| 发表于 2015-10-12 13:09:57 | 显示全部楼层
回复【9楼】xuande:
---------------------------------
差别很大,理论上应该是0x17EA的值,结果读出来的6个值分别是0x17E8,0x0FE5,0x0018,0x1018,0x0816。这是第一组数据,后面我改变AD的模拟输入值又测试了另外两组数据,发现只有地址0在误差允许的范围下始终是对的,其他值都是错的。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 09:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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