本帖最后由 dh2964169 于 2018-3-26 10:13 编辑 项目要求:STM32(F429,180MHz)作为主控,来控制外置AD芯片采集1MHz的模拟信号,并将采集的数据传输到主控内存中。现在使用的AD芯片为AD7357,双通道,4.2MSPS,14bit,芯片时序图后附。 实验的思路:使用SPI+DMA的传输方式,提供 32位时序 和 收集采集 的数据至内存;(其中,AD芯片需要主控提供一个CS周期内32个sclk才能出数据,故采样率实际上是CS的频率) 实验主要部分代码: int main() { //功能芯片初始化 AD9833_GPIO_Init(); AD9833_reset(); AD9833_Init(150000); Debug_USART_Config(); IO_GPIO_Init(); IO_Enalbel(); SPIx_Init(); //SPI初始化 GPIO_SetBits(AD_CS_GPIO_PORT,AD_CS_PIN); //CS置1 Rheostat_DMA_Mode_Config(); //DMA初始化 DMAxx_NVIC(); //中断配置 DMA_ITConfig(RHEOSTAT_AD_DMAR_STREAM,DMA_IT_TC,ENABLE ); //DMA传输完成中断使能 SPI_Cmd(AD_SPI, ENABLE); //SPI使能 SPI_I2S_DMACmd(AD_SPI,SPI_I2S_DMAReq_Tx,ENABLE); //SPI_DMA发送数据使能 SPI_I2S_DMACmd(AD_SPI,SPI_I2S_DMAReq_Rx,ENABLE); //SPI_DMA接收数据使能 DMA_Cmd (RHEOSTAT_AD_DMAR_STREAM,ENABLE); //DMA使能 while (1) { SPI_DMA_Send() ; //循环使能DMA发送数据和接收数据 Delay(1); } void SPI_DMA_Send(void) { GPIO_ResetBits(AD_CS_GPIO_PORT,AD_CS_PIN); //CS置0 DMA_ClearFlag(RHEOSTAT_AD_DMAT_STREAM,DMA_FLAG_TCIF5); //清除传输完成标志位 DMA1_Stream5->NDTR=numlength1; //重新初始化传输数目 DMA_Cmd (RHEOSTAT_AD_DMAT_STREAM,ENABLE); //DMA使能 while(DMA_GetFlagStatus(RHEOSTAT_AD_DMAT_STREAM,DMA_FLAG_TCIF5 )==RESET); /传输完成标志位 DMA_Cmd (RHEOSTAT_AD_DMAT_STREAM,DISABLE); //DMA失能 while(SPI_GetFlagStatus(AD_SPI,SPI_FLAG_BSY)==SET); //BSY标志位等待 GPIO_SetBits(AD_CS_GPIO_PORT,AD_CS_PIN); //CS置1 } 实验中遇到的问题: 当SPI3的速度配置最高通信速率为22.5MHz,但此时AD芯片提供的实际采样频率为440KHz(理论值:22.5/32=703KHz),因为当SPI最高时,执行void SPI_DMA_Send(void)函数过程中,使实际采样频率降低(程序貌似也不能简化了),不能采集到1MHz的信号数据; 请问: 1. 请问主控(eg:STM32F429)使用哪种方式能够为AD7357提供这么高的采样频率呢? 2. 若能提供大于4MHz的采样频率,那么如何来传输采集到的数据呢? 3. 如果主控通过任何方式都不能完成,采集1MHz的模拟信号(提供4M以上的采样频率),那么有没有其他的主控能实现呢? |
32个å¨æ为å¨ä¸ä¸ªééä¼ è¾Aï¼B两个ééç16bitçæ°æ®
STM32F407 定时器触发DMA 求助大神
【MCU实战经验】基于STM32F407的音频播放器设计
盘古UE-STM32F407工控板原理图
【STM32F429心得\疑问】+STM32F4之FSMC和FMC
STM32F429读取IO口传输的数据速率
STM32F407ZGT6 手摸芯片背部重启
STM32F4 SPI 动作时,软件片选信号被拉高,IO口程序逻辑失控
STM32F401RE NUCLEO求助,串口一直不能进中断
读取STM32F407内部温度传感器值错误
STM32F429多路内部ADC独立采集的办法
http://bbs.16rd.com/thread-56289-1-1.html
评分
查看全部评分
评分
查看全部评分
评分
查看全部评分
评分
查看全部评分
评分
查看全部评分
用两路SPI采,一路提供时钟做主控制,另一路作为从接收。把SDATAA、SDATAB分别采两路。
话说429的SPI好嚣张,45 Mbits/s
AD7357的SPI更高,最大80M。理论上来说,429可以用45M的SPI来与AD7357通信。
评分
查看全部评分
评分
查看全部评分
能用FPGA采的话,就非常简单了。
我FPGA直接采过4路SPI接口的18位AD,1M的AD。FPGA状态机采样及SPI传输,转换的数据存到4个寄存器,传输完成给个标志位。STM32并行读取FPGA输出寄存器。
我觉得这么做都恐怕会有点慢,还不如在 FPGA 里面做个 bus matrix,FPGA 一方面不断地维持 1MSPS 读采样,存到挂着的采样存储器里面,并且判断触发中断条件;另一方面允许处理器随时过来读数据。采样存储器用 FPGA 外挂 LPDDR3 或 GDDR5。
如果不是为了记录数据,我觉的可以在FPGA上做一些前级的处理
评分
查看全部评分
的确。我前面给的设计是参考了不少廉价示波器的设计思路,如果加入前级处理也无妨。或者如果不用 FPGA,可以考虑用专职流处理 DSP,譬如 ADSP-BF531 或 TMS320C6748 这种来做前级处理。专职流处理 DSP 里面的 DMA 远远要比 STM32 的高效灵活的多,可以大大减少 CPU 的干预。