硬汉嵌入式论坛

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

[FMC] STM32H723ZGT6使用FMC读取两片AD7606,通讯有问题

  [复制链接]

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2024-6-22 15:21:30 | 显示全部楼层 |阅读模式
当前我使用的是STM32H723ZGT6使用FMC读取两片AD7606,ADC1采集6路电压(V1-V6),ADC2采集6路电流(V1-V6)。参考硬汉哥的FMC总线驱动例程,之前一直使用spi的方式读取两片AD并成功验证数据无误。
问题描述:FMC通讯ADC1(6路电压)有数据,修改输入电压无效果;ADC2有数据,修改输入电流有反馈且计算后符合输入值。
主要外设:FMC——并行通讯;TIM3——输出PWM波给两片AD芯片同步采集数据;MPU——参考硬汉哥代码配置;DMA——未启用;
主频我设置为500MHZ,HCLK3:250MHZ
我的问题:

为什么会存在ADC1一路数据异常但是ADC2数据正常

核心代码部分
————————————————————FMC————————————————————————————————

  hsram1.Instance = FMC_NORSRAM_DEVICE;
  hsram1.Extended = FMC_NORSRAM_EXTENDED_DEVICE;
  /* hsram1.Init */
  hsram1.Init.NSBank = FMC_NORSRAM_BANK1;
  hsram1.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_DISABLE;
  hsram1.Init.MemoryType = FMC_MEMORY_TYPE_SRAM;
  hsram1.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_16;
  hsram1.Init.BurstAccessMode = FMC_BURST_ACCESS_MODE_DISABLE;
  hsram1.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;
  hsram1.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS;
  hsram1.Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE;
  hsram1.Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE;
  hsram1.Init.ExtendedMode = FMC_EXTENDED_MODE_ENABLE;
  hsram1.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_DISABLE;
  hsram1.Init.WriteBurst = FMC_WRITE_BURST_DISABLE;
  hsram1.Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ONLY;
  hsram1.Init.WriteFifo = FMC_WRITE_FIFO_ENABLE;
  hsram1.Init.PageSize = FMC_PAGE_SIZE_NONE;
  /* Timing 4 */
  Timing.AddressSetupTime = 10;
  Timing.AddressHoldTime =3;
  Timing.DataSetupTime = 10;
  Timing.BusTurnAroundDuration = 2;
  Timing.CLKDivision = 3;
  Timing.DataLatency = 3;
  Timing.AccessMode = FMC_ACCESS_MODE_A;
  /* ExtTiming */

  if (HAL_SRAM_Init(&hsram1, &Timing, &Timing) != HAL_OK)
  {
    Error_Handler( );
  }

  /** Perform the SRAM2 memory initialization sequence
  */
  hsram2.Instance = FMC_NORSRAM_DEVICE;
  hsram2.Extended = FMC_NORSRAM_EXTENDED_DEVICE;
  /* hsram2.Init */
  hsram2.Init.NSBank = FMC_NORSRAM_BANK2;
  hsram2.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_DISABLE;
  hsram2.Init.MemoryType = FMC_MEMORY_TYPE_SRAM;
  hsram2.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_16;
  hsram2.Init.BurstAccessMode = FMC_BURST_ACCESS_MODE_DISABLE;
  hsram2.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;
  hsram2.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS;
  hsram2.Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE;
  hsram2.Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE;
  hsram2.Init.ExtendedMode = FMC_EXTENDED_MODE_ENABLE;
  hsram2.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_DISABLE;
  hsram2.Init.WriteBurst = FMC_WRITE_BURST_DISABLE;
  hsram2.Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ONLY;
  hsram2.Init.WriteFifo = FMC_WRITE_FIFO_ENABLE;
  hsram2.Init.PageSize = FMC_PAGE_SIZE_NONE;
  /* Timing */
  Timing.AddressSetupTime = 10;
  Timing.AddressHoldTime = 3;
  Timing.DataSetupTime = 10;
  Timing.BusTurnAroundDuration = 2;
  Timing.CLKDivision = 3;
  Timing.DataLatency = 3;
  Timing.AccessMode = FMC_ACCESS_MODE_A;
  /* ExtTiming */

  if (HAL_SRAM_Init(&hsram2, &Timing, &Timing) != HAL_OK)
  {
    Error_Handler( );
  }
————————————————————FMC————————————————————————————————
————————————————————MPU(在进入main后便执行)————————————————————————————————

static void MPU_Config( void )
{
        MPU_Region_InitTypeDef MPU_InitStruct;

        /* 禁止 MPU */
        HAL_MPU_Disable();
        MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
        MPU_InitStruct.BaseAddress      = 0x20000000;
        MPU_InitStruct.Size             = MPU_REGION_SIZE_128KB;
        MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
        MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
        MPU_InitStruct.IsCacheable      = MPU_ACCESS_NOT_CACHEABLE;
        MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
        MPU_InitStruct.Number           = MPU_REGION_NUMBER1;
        MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
        MPU_InitStruct.SubRegionDisable = 0x00;
        MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;

        HAL_MPU_ConfigRegion(&MPU_InitStruct);
   
   
   
        /* 配置AXI SRAM的MPU属性为Non-cacheable  */
        MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
        MPU_InitStruct.BaseAddress      = 0x24000000;
        MPU_InitStruct.Size             = MPU_REGION_SIZE_512KB;
        MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
        MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
        MPU_InitStruct.IsCacheable      = MPU_ACCESS_NOT_CACHEABLE;
        MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
        MPU_InitStruct.Number           = MPU_REGION_NUMBER0;
        MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL1;
        MPU_InitStruct.SubRegionDisable = 0x00;
        MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;

        HAL_MPU_ConfigRegion(&MPU_InitStruct);
       
       
        /* 配置FMC扩展IO的MPU属性为Device或者Strongly Ordered */
        MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
        MPU_InitStruct.BaseAddress      = 0x60000000;
        MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_1MB;       
        MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
        MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;
        MPU_InitStruct.IsCacheable      = MPU_ACCESS_NOT_CACHEABLE;        /* 不能用MPU_ACCESS_CACHEABLE;会出现2次CS、WE信号 */
        MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
        MPU_InitStruct.Number           = MPU_REGION_NUMBER2;
        MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
        MPU_InitStruct.SubRegionDisable = 0x00;
        MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
       
        HAL_MPU_ConfigRegion(&MPU_InitStruct);
    /* 配置FMC扩展IO的MPU属性为Device或者Strongly Ordered */
        MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
        MPU_InitStruct.BaseAddress      = 0x64000000;
        MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_1MB;       
        MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
        MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;
        MPU_InitStruct.IsCacheable      = MPU_ACCESS_NOT_CACHEABLE;        /* 不能用MPU_ACCESS_CACHEABLE;会出现2次CS、WE信号 */
        MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
        MPU_InitStruct.Number           = MPU_REGION_NUMBER3;
        MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
        MPU_InitStruct.SubRegionDisable = 0x00;
        MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
       
        HAL_MPU_ConfigRegion(&MPU_InitStruct);

        /* 使能cache需要保护eth mac-dma  */
        MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
        MPU_InitStruct.BaseAddress      = 0x30000000;
        MPU_InitStruct.Size             = MPU_REGION_SIZE_256B;
        MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
        MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;
        MPU_InitStruct.IsCacheable      = MPU_ACCESS_NOT_CACHEABLE;
        MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
        MPU_InitStruct.Number           = MPU_REGION_NUMBER4;
        MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
        MPU_InitStruct.SubRegionDisable = 0x00;
        MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;

        HAL_MPU_ConfigRegion(&MPU_InitStruct);


        /*使能 MPU */
        HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
   
   uint32_t *SouceAddr = (uint32_t *)FLASH_BANK1_BASE;
   uint32_t *DestAddr = (uint32_t *)D1_DTCMRAM_BASE;
   memcpy(DestAddr, SouceAddr, 0x400);
   SCB->VTOR = D1_DTCMRAM_BASE;
}
————————————————————MPU(在进入main后便执行)————————————————————————————————
————————————————————AD7606相关————————————————————————————————
数据接受缓冲区:

__align(16) int16_t UxxBuff[SAMPLING_CHANNEL] = {0};
__align(16) int16_t IxxBuff[SAMPLING_CHANNEL] = {0};



两片ADC的地址定义

/*AD7606地址定义——FMC*/
#define  ADC1_UXX_Data_8   *((volatile uint16_t*)0x60000000)//NE1
#define  ADC2_IXX_Data_8   *((volatile uint16_t*)0x64000000)//NE2
读取数据函数节选


————————————————————AD7606相关————————————————————————————————

————————————————————硬件连接部分————————————————————————————————
ADC1:电压采集

ADC2:电流采集

FMC引脚配置

  /** FMC GPIO Configuration
  PF0   ------> FMC_A0
  PE7   ------> FMC_D4
  PE8   ------> FMC_D5
  PE9   ------> FMC_D6
  PE10   ------> FMC_D7
  PE11   ------> FMC_D8
  PE12   ------> FMC_D9
  PE13   ------> FMC_D10
  PE14   ------> FMC_D11
  PE15   ------> FMC_D12
  PD8   ------> FMC_D13
  PD9   ------> FMC_D14
  PD10   ------> FMC_D15
  PD14   ------> FMC_D0
  PD15   ------> FMC_D1
  PD0   ------> FMC_D2
  PD1   ------> FMC_D3
  PD4   ------> FMC_NOE
  PD7   ------> FMC_NE1
  PG9   ------> FMC_NE2
  */
  /* GPIO_InitStruct */
————————————————————硬件连接部分————————————————————————————————
————————————————————问题截图————————————————————————————————




回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2024-6-22 16:15:08 | 显示全部楼层
后来我用示波器连接NE1和NOE查看ADC1的波形,在单独读取ADC1的时候是正确的独立RD和CS进行6通道读取。但是在ADC2的时候发现NE2处于常选中(一直低电平)。ADC2和ADC1一起读取的时候是这样,所以我怀疑NE2未能被正确的拉高和拉低导致我在先读取ADC1的时候,ADC2的片选由于拉低,NOE两个芯片公用。所以在读取电压的时候会有数据异常。在电压读完的后六个下降沿才是ADC2的数据,由于ADC2最后读取所以不会被干扰。
但是为什么NE2不能被FMC外设正确的拉高拉低
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2024-6-22 16:17:38 | 显示全部楼层
后续我连接示波器
1.单独测试ADC1的通讯。发现NE1和NOE正常的拉低6次,时序也是正常的。
2.单独测试ADC2的通讯。发现NE2并未被拉高过,NOE正常拉低。
所以我怀疑NE2处于低电平表示常选中,当读取ADC1的时候,NE1和NE2同时拉低,会导致两片AD芯片数据一起运输在并行总线上,由于ADC1先行输入缓冲区所以导致数据异常。
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2024-6-22 18:26:01 | 显示全部楼层
去除了NE2的初始化并且将NE2对应的引脚改为普通GPIO常选中高电平,ADC1依然存在输入电压无反应。检查Vdrive确认连接3v3了,有人能分享一下调试经验么
回复

使用道具 举报

4

主题

1441

回帖

1453

积分

至尊会员

积分
1453
发表于 2024-6-22 21:03:15 | 显示全部楼层

回帖奖励 +2 个金币

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-6-24 08:19:11 | 显示全部楼层
qq1178094772 发表于 2024-6-22 16:17
后续我连接示波器
1.单独测试ADC1的通讯。发现NE1和NOE正常的拉低6次,时序也是正常的。
2.单独测试ADC2 ...

通过楼主的描述,是这个意思吧,单独测试ADC1时正常,ADC2不正常,一起测试时ADC1不正常。

初步锁定时ADC2的片选没有正常执行,是这个意思吧,楼主方便时把GPIO的配置贴下。
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2024-6-24 09:47:34 | 显示全部楼层
eric2013 发表于 2024-6-24 08:19
通过楼主的描述,是这个意思吧,单独测试ADC1时正常,ADC2不正常,一起测试时ADC1不正常。

初步锁定时 ...

我又补测了一下。实际情况是ADC2的NE2引脚始终为低电平选中。在我拆除ADC2后进行1对1的通信数据是正常的。所以问题锁定在NE2的片选没有被正常拉高导致
-------------FMC:GPIO————————————————————————
备注:NE3及NE4仅作GPIO初始化,对应外设并没有初始化仅作预留
  /** FMC GPIO Configuration
  PF0   ------> FMC_A0
  PE7   ------> FMC_D4
  PE8   ------> FMC_D5
  PE9   ------> FMC_D6
  PE10   ------> FMC_D7
  PE11   ------> FMC_D8
  PE12   ------> FMC_D9
  PE13   ------> FMC_D10
  PE14   ------> FMC_D11
  PE15   ------> FMC_D12
  PD8   ------> FMC_D13
  PD9   ------> FMC_D14
  PD10   ------> FMC_D15
  PD14   ------> FMC_D0
  PD15   ------> FMC_D1
  PG6   ------> FMC_NE3
  PD0   ------> FMC_D2
  PD1   ------> FMC_D3
  PD4   ------> FMC_NOE
  PD7   ------> FMC_NE1
  PG9   ------> FMC_NE2
  PG12   ------> FMC_NE4
  */
/* GPIO_InitStruct */
  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF12_FMC;

  HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);

  /* GPIO_InitStruct */
  GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10
                          |GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14
                          |GPIO_PIN_15;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed =GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF12_FMC;

  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

  /* GPIO_InitStruct */
  GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14
                          |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1|ADC_NOE_Pin
                          |GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed =GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF12_FMC;

  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  /* GPIO_InitStruct */
  GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_9|GPIO_PIN_12;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed =GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF12_FMC;

  HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
————————————————————————————————————
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2024-6-24 09:51:01 | 显示全部楼层
本帖最后由 qq1178094772 于 2024-6-24 10:11 编辑

后续连接示波器截图:ch1:NOE;ch2:NE2;ch3:NE1.可以看到单次通讯中NE2始终没有被拉高过
E:\RigolDS157.png
RigolDS157.png
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2024-6-24 10:15:31 | 显示全部楼层
找到可能是问题原因所在,由于PG9是NE2,在进行GPIO初始化后,对应寄存器并未被修改依然是模拟模式,导致电平常低
/* GPIO_InitStruct */
  GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_9|GPIO_PIN_12;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed =GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF12_FMC;

  HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
为什么GPIO初始化会失败呢
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2024-6-24 10:28:09 | 显示全部楼层
问题已解决:问题在于使用HAL库配置的时候 gpio.c中没有用到GPIOG引脚导致GPIOG的时钟并未开启,在fmc.c文件中用到了GPIOG引脚但是可能cubemx认为 gpio.c文件中开启了GPIOG的时钟。因此结果就是GPIOG的时钟并未初始化。因此NE2片选相当于模拟输入导致常低
回复

使用道具 举报

33

主题

188

回帖

287

积分

高级会员

积分
287
发表于 2024-6-24 11:15:54 | 显示全部楼层
HAL库找bug真的不好找。
回复

使用道具 举报

14

主题

118

回帖

160

积分

初级会员

积分
160
发表于 2024-6-24 14:02:18 | 显示全部楼层
qq1178094772 发表于 2024-6-24 10:28
问题已解决:问题在于使用HAL库配置的时候 gpio.c中没有用到GPIOG引脚导致GPIOG的时钟并未开启,在fmc.c文 ...

管脚时钟未使能问题,我之前也遇到过
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-6-25 14:54:18 | 显示全部楼层
qq1178094772 发表于 2024-6-24 10:28
问题已解决:问题在于使用HAL库配置的时候 gpio.c中没有用到GPIOG引脚导致GPIOG的时钟并未开启,在fmc.c文 ...

这个时候必须得手动核对下引脚,有时候CubeMX略坑。
回复

使用道具 举报

15

主题

49

回帖

94

积分

初级会员

积分
94
发表于 2024-6-26 11:55:00 | 显示全部楼层
楼主是两片中断读取吗还是DMA读取两片
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2024-7-30 10:46:34 | 显示全部楼层
楼主读取数据的时候有没有对片选进行控制
回复

使用道具 举报

0

主题

26

回帖

26

积分

新手上路

积分
26
发表于 2024-8-2 13:44:18 | 显示全部楼层
请教一下,两个AD7606共用FMC接口的时候,D0-D15的数据线,是直连的吗,我现在一个两个AD7606同时使用,数据就会出错,哪怕其中一个关闭片选,只焊接一个AD7606时,数据才对
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-8-3 07:55:33 | 显示全部楼层
梦幻的帅帅 发表于 2024-8-2 13:44
请教一下,两个AD7606共用FMC接口的时候,D0-D15的数据线,是直连的吗,我现在一个两个AD7606同时使用,数 ...

是直连,如果片选不能正常控制两个器件,这个现象不正常。
回复

使用道具 举报

0

主题

26

回帖

26

积分

新手上路

积分
26
发表于 2024-8-3 11:43:24 | 显示全部楼层
eric2013 发表于 2024-8-3 07:55
是直连,如果片选不能正常控制两个器件,这个现象不正常。

问题找到了,两个AD7606的D0-D15是通过数字隔离器输出到一起的,结果一个数字隔离器输出的高电平会被另一个的低电平拉低到1.7V左右。造成数据读取异常,是不是两个AD7606直连不会有这个问题,一个AD7606输出数据会被另一个AD7606引脚的低电平拉低吗
回复

使用道具 举报

0

主题

26

回帖

26

积分

新手上路

积分
26
发表于 2024-8-3 12:39:03 | 显示全部楼层
eric2013 发表于 2024-8-3 07:55
是直连,如果片选不能正常控制两个器件,这个现象不正常。

硬汉哥,啊hi有哥问题请教一下,两个AD7606通过片选使用,他们的busy引脚触发STM32外部中断,这两个BUSY需要分开接两个pin吗,还是说可以接在一起
回复

使用道具 举报

0

主题

26

回帖

26

积分

新手上路

积分
26
发表于 2024-8-3 18:52:48 | 显示全部楼层
梦幻的帅帅 发表于 2024-8-3 11:43
问题找到了,两个AD7606的D0-D15是通过数字隔离器输出到一起的,结果一个数字隔离器输出的高电平会被另一 ...

两个AD7606共用FMC接口,NE1 NE2控制片选,这个NE1和NE2需要我自己控制吗,还是说自动切换,然后把数据存到0x6000000    0x6400000 ,然后我只要读这两个地址的数据就行了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-8-4 00:35:33 | 显示全部楼层
梦幻的帅帅 发表于 2024-8-3 12:39
硬汉哥,啊hi有哥问题请教一下,两个AD7606通过片选使用,他们的busy引脚触发STM32外部中断,这两个BUSY ...

分别两个PIN
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-8-4 00:36:01 | 显示全部楼层
梦幻的帅帅 发表于 2024-8-3 18:52
两个AD7606共用FMC接口,NE1 NE2控制片选,这个NE1和NE2需要我自己控制吗,还是说自动切换,然后把数据存 ...

不需要你控制,复用FMC后,你操作对应地址,就会自动控制,
回复

使用道具 举报

0

主题

26

回帖

26

积分

新手上路

积分
26
发表于 2024-8-8 11:18:49 | 显示全部楼层
eric2013 发表于 2024-8-4 00:36
不需要你控制,复用FMC后,你操作对应地址,就会自动控制,

硬汉兄,再请教个问题,AD7606是不是也支持差分输入的,和单端输入比,精度上会有损失吗
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-8-9 10:00:25 | 显示全部楼层
梦幻的帅帅 发表于 2024-8-8 11:18
硬汉兄,再请教个问题,AD7606是不是也支持差分输入的,和单端输入比,精度上会有损失吗

7606是真双极性,比差分好使,精度好。
回复

使用道具 举报

15

主题

49

回帖

94

积分

初级会员

积分
94
发表于 2024-8-14 16:57:42 | 显示全部楼层
eric2013 发表于 2024-8-9 10:00
7606是真双极性,比差分好使,精度好。

想问一下,控制两片,用DMA的话,怎么样同步,一片倒还好已经做出来,用DMA突发模式刚好半字的8次突发。
要是两片的,是不是要用2个DMA了,那当得到数据的时候,就存在DMA仲裁器的优先发送级,需要等待一个优先级更高的DMA线传输完后才能传输第2个DMA的数据,这样就有问题,2片的DMA一直没搞出来,哥指导一下
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-8-15 09:32:50 | 显示全部楼层
海米阿门 发表于 2024-8-14 16:57
想问一下,控制两片,用DMA的话,怎么样同步,一片倒还好已经做出来,用DMA突发模式刚好半字的8次突发。
...

使用同一个PWM同时触发就行。
回复

使用道具 举报

15

主题

49

回帖

94

积分

初级会员

积分
94
发表于 2024-8-15 10:29:15 | 显示全部楼层
eric2013 发表于 2024-8-15 09:32
使用同一个PWM同时触发就行。

哥,能具体点不,同一个PWM触发两片,然后配置两个片选,两个DMA的8次突发事件吗
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-8-16 09:27:23 | 显示全部楼层
海米阿门 发表于 2024-8-15 10:29
哥,能具体点不,同一个PWM触发两片,然后配置两个片选,两个DMA的8次突发事件吗

推荐所有引脚都用相同的,除了数据引脚一个占用DB0-DB15,另一个DB16-DB31,然后BUSY引脚使用不同的。

之前有个坛友是这么测试的。

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-29 03:25 , Processed in 0.724470 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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