#include "./BSP/AD7606/AD7606.h" #include "./BSP/TIMER/gtim.h" /* AD7606 FSMC总线地址,只能读,无需写 */ #define AD7606_RESULT1() *(__IO uint16_t *)0x60000000 AD7606_VAR_T g_tAD7606; /* 定义1个全局变量,保存一些参数 */ AD7606_FIFO_T g_tAdcFifo; /* 定义FIFO结构体变量 */ uint16_t ADNumFlag = 4; /* AD数据采集计数标志*/ void AD7606_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE(); __HAL_RCC_GPIOH_CLK_ENABLE(); __HAL_RCC_GPIOE_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOG, RESET_Pin|RANGE1_Pin|OS2_Pin|OS1_Pin|OS0_Pin, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOB, BYTE_SEL_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, STBY1_Pin, GPIO_PIN_SET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(CONVEST_GPIO_Port, CONVEST_Pin, GPIO_PIN_SET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET); /*Configure GPIO pin : PtPin */ GPIO_InitStruct.Pin = GPIO_PIN_2; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = FRSTDATA1_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(FRSTDATA1_GPIO_Port, &GPIO_InitStruct); /*Configure GPIO pin : PtPin */ GPIO_InitStruct.Pin = RESET_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(RESET_GPIO_Port, &GPIO_InitStruct); /*Configure GPIO pin : PtPin */ GPIO_InitStruct.Pin = RANGE1_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(RANGE1_GPIO_Port, &GPIO_InitStruct); /*Configure GPIO pin : PtPin */ GPIO_InitStruct.Pin = BUSY1_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(BUSY1_GPIO_Port, &GPIO_InitStruct); /*Configure GPIO pins : PBPin PBPin */ GPIO_InitStruct.Pin = BYTE_SEL_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(BYTE_SEL_GPIO_Port, &GPIO_InitStruct); /*Configure GPIO pins : PBPin PBPin */ GPIO_InitStruct.Pin = STBY1_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(STBY1_GPIO_Port, &GPIO_InitStruct); /*Configure GPIO pins : PEPin PEPin */ GPIO_InitStruct.Pin = OS2_Pin|OS1_Pin|OS0_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); /*Configure GPIO pins : PEPin PEPin */ GPIO_InitStruct.Pin = CONVEST_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(CONVEST_GPIO_Port, &GPIO_InitStruct); } /*AD7606硬件复位*/ void AD7606_Reset(void){ HAL_GPIO_WritePin(GPIOG, RESET_Pin|RANGE1_Pin, GPIO_PIN_RESET); //退出复位状态 HAL_GPIO_WritePin(GPIOG, RESET_Pin|RANGE1_Pin, GPIO_PIN_SET); //进入复位状态ESET复位高电平脉冲宽度最小50ns HAL_GPIO_WritePin(GPIOG, RESET_Pin|RANGE1_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOG, RESET_Pin|RANGE1_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOG, RESET_Pin|RANGE1_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOG, RESET_Pin|RANGE1_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOG, RESET_Pin|RANGE1_Pin, GPIO_PIN_RESET); //退出复位状态 } /*启动一次ADC转换*/ void AD7606_StartConvst(void){ HAL_GPIO_WritePin(CONVEST_GPIO_Port,CONVEST_Pin,GPIO_PIN_RESET); //拉低CONVEST HAL_GPIO_WritePin(CONVEST_GPIO_Port,CONVEST_Pin,GPIO_PIN_RESET); //延时CONVST 高电平脉冲宽度和低电平脉冲宽度最短 25ns HAL_GPIO_WritePin(CONVEST_GPIO_Port,CONVEST_Pin,GPIO_PIN_RESET); HAL_GPIO_WritePin(CONVEST_GPIO_Port,CONVEST_Pin,GPIO_PIN_SET); } /*从FIFO读取数据*/ void AD7606_ReadNowAdc(void) { g_tAD7606.sNowAdc[0] = AD7606_RESULT1(); /* 读第1路样本 */ g_tAD7606.sNowAdc[1] = AD7606_RESULT1(); /* 读第2路样本 */ g_tAD7606.sNowAdc[2] = AD7606_RESULT1(); /* 读第3路样本 */ g_tAD7606.sNowAdc[3] = AD7606_RESULT1(); /* 读第4路样本 */ g_tAD7606.sNowAdc[4] = AD7606_RESULT1(); /* 读第5路样本 */ g_tAD7606.sNowAdc[5] = AD7606_RESULT1(); /* 读第6路样本 */ g_tAD7606.sNowAdc[6] = AD7606_RESULT1(); /* 读第7路样本 */ g_tAD7606.sNowAdc[7] = AD7606_RESULT1(); /* 读第8路样本 */ } /*开始采集*/ void AD7606_StartRecord(void) { // printf("AD7606_StartRecord\n"); AD7606_StopRecord(); ADNumFlag = 4; AD7606_Reset(); /* 复位硬件 */ gtim_timx_int_init(ARR - 1, PCS - 1); /* T = 84 000 000 / (ARR * PCS) */ printf("PCS=%d,ARR=%d\r\n",PCS,ARR); } /*停止采集*/ void AD7606_StopRecord(void){ HAL_NVIC_DisableIRQ(GTIM_TIMX_INT_IRQn); /* 关闭定时器中断 */ HAL_GPIO_WritePin(CONVEST_GPIO_Port,CONVEST_Pin,GPIO_PIN_SET); /*CONVST输出高电平*/ } /*定时采集程序*/ void AD7606_ISR(void) { // AD7606_Reset(); /* 复位硬件 */ AD7606_StartConvst(); /* 启动采样 */ while(HAL_GPIO_ReadPin(BUSY1_GPIO_Port, BUSY1_Pin) == GPIO_PIN_SET){} //等待采样完成 int8_t i =0 ; // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET); /* 从FSMC总线读取数据 */ AD7606_ReadNowAdc(); for(i=0; i<6; i++){ DataArray[1028*i + ADNumFlag] = (g_tAD7606.sNowAdc[i+2]>>8); DataArray[1028*i + ADNumFlag+1] = (g_tAD7606.sNowAdc[i+2]); } memset(g_tAD7606.sNowAdc, 0, sizeof(g_tAD7606.sNowAdc)); ADNumFlag += 2; // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET); /* 采样512次之后,使用USB发送数据 */ if(ADNumFlag == 1028){ CDC_Transmit_HS(DataArray,8224); ADNumFlag = 1028*8 + 4; } if(ADNumFlag == 9252){ CDC_Transmit_HS(&DataArray[8224],8224); ADNumFlag = 4; } }