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/1.Cabin/1.Software/STM32_AD7606/Drivers/BSP/AD7606/AD7606.c

277 lines
8.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "./BSP/AD7606/AD7606.h"
#include "./BSP/TIMER/gtim.h"
/* AD7606 FSMC总线地址只能读无需写 */
#define AD7606_RESULT1() *(__IO uint16_t *)0x60000000
#define AD7606_RESULT2() *(__IO uint16_t *)0x64000000
AD7606_VAR_T g_tAD7606; /* 定义1个全局变量保存一些参数 */
AD7606_FIFO_T g_tAdcFifo; /* 定义FIFO结构体变量 */
uint16_t RevNumFlag = 4; /* 转速数据采集计数标志*/
uint16_t ADNumFlag = 4; /* AD数据采集计数标志*/
int flag = 0;
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|RANGE2_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);
HAL_GPIO_WritePin(GPIOG, STBY2_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);
/*Configure GPIO pins : PCPin PCPin */
GPIO_InitStruct.Pin = FRSTDATA2_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(FRSTDATA2_GPIO_Port, &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 = RANGE2_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(RANGE2_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 : PEPin PEPin */
GPIO_InitStruct.Pin = BUSY2_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(BUSY2_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_PULLDOWN;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(BYTE_SEL_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pins : PBPin PBPin */
GPIO_InitStruct.Pin = STBY2_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(STBY2_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_PULLDOWN;
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);
/*Configure GPIO pins : PEPin PEPin */
GPIO_InitStruct.Pin = Rev_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
HAL_GPIO_Init(Rev_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路样本 */
while(HAL_GPIO_ReadPin(BUSY2_GPIO_Port, BUSY2_Pin)==GPIO_PIN_SET);
g_tAD7606.sNowAdc[8] = AD7606_RESULT2(); /* 读第9路样本 */
g_tAD7606.sNowAdc[9] = AD7606_RESULT2(); /* 读第10路样本 */
g_tAD7606.sNowAdc[10] = AD7606_RESULT2(); /* 读第11路样本 */
g_tAD7606.sNowAdc[11] = AD7606_RESULT2(); /* 读第12路样本 */
// g_tAD7606.sNowAdc[12] = AD7606_RESULT2(); /* 读第13路样本 */
// g_tAD7606.sNowAdc[13] = AD7606_RESULT2(); /* 读第14路样本 */
// g_tAD7606.sNowAdc[14] = AD7606_RESULT2(); /* 读第15路样本 */
// g_tAD7606.sNowAdc[15] = AD7606_RESULT2(); /* 读第16路样本 */
}
/*开始采集*/
void AD7606_StartRecord(void)
{
// printf("AD7606_StartRecord\n");
AD7606_StopRecord();
RevNumFlag = 4;
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<12; i++){
DataArray[1028*i + ADNumFlag] = (g_tAD7606.sNowAdc[i]>>8);
DataArray[1028*i + ADNumFlag+1] = (g_tAD7606.sNowAdc[i]);
}
DataArray[1028*12 + RevNumFlag] = HAL_GPIO_ReadPin(Rev_GPIO_Port, Rev_Pin);
memset(g_tAD7606.sNowAdc, 0, sizeof(g_tAD7606.sNowAdc));
ADNumFlag += 2;
RevNumFlag += 1;
// HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
/* 采样512次之后使用USB发送数据 */
if(ADNumFlag == 1028){
CDC_Transmit_HS(DataArray,13364);
ADNumFlag = 1028*13 +4;
RevNumFlag = 1028*13 + 4;
}
/* 采样512次之后使用USB发送数据 */
if(ADNumFlag == 14392){
CDC_Transmit_HS(&DataArray[13364],13364);
ADNumFlag = 4;
RevNumFlag = 4;
}
}