再贴一个我的详细步骤吧
1、ADC_BUSY配置为定时器12输入捕获引脚,通过下降沿触发,可设置IC_Filter来调整滤波等级
2、SPI配置为硬件CS控制,这样可以保证再下降沿触发的时候CS也自动拉低
3、SPI_DMA的TX和RX都配置为循环模式并且开启DMAMUX的同步事件,选择TIM12_TRGO事件,然后设置8次传输
4、ADC_CONVST可以连接到支持PWM输出的引脚上,也可以通过DMAMUX来控制任意引脚输出PWM(参考硬汉哥H7教程:第43章),我这里使用的是通过LPTIM更新事件来触发PWM
总结:配置完成后,PWM触发ADC_CONVST启动转换,ADC_BUSY拉低后触发输入捕获事件,接着自动触发SPI_DMA的数据读写,这样就完成了全自动流程SPI读写AD7606
下面是一个初始化代码供参考,这里通过DMA半满中断实现了一个双缓冲
[C] 纯文本查看 复制代码 /**
* @name _ad7606_driver_init
* @brief AD7606驱动初始化
* @attention
* @param
* @retval
*/
void _ad7606_driver_init(void)
{
// 过采样配置 OS[2:0] 100b MaxSampleFreq:12.5kHz
HAL_GPIO_WritePin(ADC_OS2_GPIO_Port, ADC_OS2_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(ADC_OS1_GPIO_Port, ADC_OS1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(ADC_OS0_GPIO_Port, ADC_OS0_Pin, GPIO_PIN_RESET);
// 关闭待机模式
HAL_GPIO_WritePin(ADC_STB_GPIO_Port, ADC_STB_Pin, GPIO_PIN_SET);
// 复位AD7606
HAL_GPIO_WritePin(ADC_RES_GPIO_Port,ADC_RES_Pin,GPIO_PIN_RESET);
HAL_Delay(1);
HAL_GPIO_WritePin(ADC_RES_GPIO_Port,ADC_RES_Pin,GPIO_PIN_SET);
HAL_Delay(1);
HAL_GPIO_WritePin(ADC_RES_GPIO_Port,ADC_RES_Pin,GPIO_PIN_RESET);
// 开启BUSY引脚边沿捕获
HAL_TIM_IC_Start(&htim12,TIM_CHANNEL_1);
// 开启SPI传输
HAL_SPI_TransmitReceive_DMA(&hspi1,(uint8_t*)&tempData[0][0][0],(uint8_t*)&ad7606Data[0][0][0],AD7606_SAMPLE_COUNTS*AD7606_CHANNEL_NUM*AD7606_BUFFER_NUM);
// 开启Convst输出 10kHZ
HAL_DMAEx_EnableMuxRequestGenerator(&hdma_dma_generator0);
HAL_DMA_Start(&hdma_dma_generator0,(uint32_t)convstPWM,(uint32_t)&ADC_CONV_GPIO_Port->BSRR,2);
HAL_LPTIM_PWM_Start(&hlptim1,10000-1,1000-1);
}
|