This repository has been archived on 2025-04-28. You can view files and clone it, but cannot push or open issues or pull requests.
CMS3in1/2.Blade/1.Software/STM32/Drivers/BSP/AD7606/AD7606.c

207 lines
6.2 KiB
C
Raw Normal View History

#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;
}
}