Files
CW_A5H_9225_8108/A5H_9225_8108_SPIV3.0/HY88xx/SpbApi.c
2025-09-29 16:49:49 +08:00

393 lines
11 KiB
C

#include "SpbApi.h"
#include "string.h"
#include "bl_ic_config.h"
MACHINE_t machine;
volatile spb_tx_t spb_tx= {0};
volatile spb_rx_dos_t spb_rx_dos= {0};
uint8_t spb_dos_inbuf[256]= {0};
/**************************************************
*获取DOS中断超时定时器中断
**************************************************/
void TIM5_IRQHandler(void) {
TIM5->STS &=~1;
spb_rx_dos.timeout--;
if(spb_rx_dos.timeout==0) {
SpbApi_StopDosCap();
EXTI->IMASK &=~(machine.dos_mask1|machine.dos_mask2); //关DOS中断
spb_rx_dos.status|=2; //2超时
}
}
/**************************************************
*DOS计数超时定时器中断
**************************************************/
void TIM4_IRQHandler(void) {
if(DOS_TIM->STS&0x01)
{
SpbApi_StopDosCap();
DOS_TIM->STS &=~1;
DOS_TIM->CNT=0;
EXTI->IMASK &=~(machine.dos_mask1|machine.dos_mask2); //关DOS中断
spb_rx_dos.status|=1;
}
}
void Dip_Set_High(void) {
DIP_PORT->POD |=machine.di_mask;
}
void Dip_Set_Low(void) {
DIP_PORT->POD &=~machine.di_mask;
}
volatile bool cap_flag=0;
void SpbApi_ReadyDosCap(uint8_t index) {
EXTI->IMASK&=~(machine.dos_mask1|machine.dos_mask2);
memset(spb_dos_inbuf,0x00,sizeof(spb_dos_inbuf));
//enable falling edge cap
//#if COMMUNICATION_MODE==SERIAL
spb_rx_dos.mask =(1<<index);
EXTI->IMASK|= (1<<index);//开放线上中断请求
EXTI->RT_CFG |= (machine.dos_mask1|machine.dos_mask2);//允许上升沿触发
EXTI->FT_CFG |= (machine.dos_mask1|machine.dos_mask2);//运行下降沿触发
// #endif
cap_flag=0;
spb_rx_dos.dos_len=0;
spb_rx_dos.InData=spb_dos_inbuf;
spb_rx_dos.timeout=30;
spb_rx_dos.status=0;
//DOS_TIM->CNT=0;
TIM5->CNT=0;
TIM5->CTRL1|=1;
}
void SpbApi_StartDosCap(void) {
DOS_TIM->CTRL1|=1;
}
void SpbApi_StopDosCap(void) {
DOS_TIM->CTRL1&=~1;
TIM5->CTRL1&=~1;
}
/**************************************************
*获取DOS数据采集
**************************************************/
void SpbApi_DosCapFunction(void) {
if(cap_flag) {
spb_rx_dos.InData[spb_rx_dos.dos_len++]=DOS_TIM->CNT;
//printf("DOSLEN=%d/n",spb_rx_dos.dos_len);
}
else { //first edge
cap_flag=1;
DOS_TIM->STS=0;
DOS_TIM->CTRL1 |=1;//使能计数器
}
DOS_TIM->CNT = 0; //CNT SET 0
}
void EXTI0_IRQHandler(void) {
if (((EXTI->PEND & EXTI_LINE0) != (uint32_t)RESET) && ((EXTI->IMASK & EXTI_LINE0) != (uint32_t)RESET))
{
EXTI->PEND = EXTI_LINE0;
SpbApi_DosCapFunction();
}
}
void EXTI1_IRQHandler(void) {
if (((EXTI->PEND & EXTI_LINE1) != (uint32_t)RESET) && ((EXTI->IMASK & EXTI_LINE1) != (uint32_t)RESET))
{
//当外部中断线上发生选定的边沿触发事件时,该位设置为 1。向该位写入“1”将
//其清零,或改变边沿检测的极性以清零该位。
EXTI->PEND = EXTI_LINE1;
SpbApi_DosCapFunction();
}
}
void EXTI2_IRQHandler(void) {
if (((EXTI->PEND & EXTI_LINE2) != (uint32_t)RESET) && ((EXTI->IMASK & EXTI_LINE2) != (uint32_t)RESET))
{
EXTI->PEND = EXTI_LINE2;
SpbApi_DosCapFunction();
}
}
void EXTI3_IRQHandler(void) {
if (((EXTI->PEND & EXTI_LINE3) != (uint32_t)RESET) && ((EXTI->IMASK & EXTI_LINE3) != (uint32_t)RESET))
{
EXTI->PEND = EXTI_LINE3;
SpbApi_DosCapFunction();
}
}
void EXTI4_IRQHandler(void) {
if (((EXTI->PEND & EXTI_LINE4) != (uint32_t)RESET) && ((EXTI->IMASK & EXTI_LINE4) != (uint32_t)RESET))
{
EXTI->PEND = EXTI_LINE4;
SpbApi_DosCapFunction();
}
}
void EXTI9_5_IRQHandler(void)
{
if (((EXTI->PEND & EXTI_LINE5) != (uint32_t)RESET) && ((EXTI->IMASK & EXTI_LINE5) != (uint32_t)RESET))
{
EXTI->PEND = EXTI_LINE5;
SpbApi_DosCapFunction();
}
if (((EXTI->PEND & EXTI_LINE6) != (uint32_t)RESET) && ((EXTI->IMASK & EXTI_LINE6) != (uint32_t)RESET))
{
EXTI->PEND = EXTI_LINE6;
SpbApi_DosCapFunction();
}
if (((EXTI->PEND & EXTI_LINE7) != (uint32_t)RESET) && ((EXTI->IMASK & EXTI_LINE7) != (uint32_t)RESET))
{
EXTI->PEND = EXTI_LINE7;
SpbApi_DosCapFunction();
}
if (((EXTI->PEND & EXTI_LINE8) != (uint32_t)RESET) && ((EXTI->IMASK & EXTI_LINE8) != (uint32_t)RESET))
{
EXTI->PEND = EXTI_LINE8;
SpbApi_DosCapFunction();
}
if (((EXTI->PEND & EXTI_LINE9) != (uint32_t)RESET) && ((EXTI->IMASK & EXTI_LINE9) != (uint32_t)RESET))
{
EXTI->PEND = EXTI_LINE9;
SpbApi_DosCapFunction();
}
}
static void SpbApi_DipInit(void) {
GPIO_InitType GPIO_InitSt;
RCC_AHB_Peripheral_Clock_Enable(RCC_AHB_PERIPH_GPIOA);
GPIO_Structure_Initialize(&GPIO_InitSt);
GPIO_InitSt.GPIO_Mode=GPIO_MODE_OUT_PP;
GPIO_InitSt.GPIO_Slew_Rate=GPIO_SLEW_RATE_FAST;
GPIO_InitSt.Pin=DIP1_PIN;
GPIO_Peripheral_Initialize(DIP_PORT,&GPIO_InitSt);
GPIO_InitSt.Pin=DIP2_PIN;
GPIO_Peripheral_Initialize(DIP_PORT,&GPIO_InitSt);
GPIO_InitSt.Pin=DIP3_PIN;
GPIO_Peripheral_Initialize(DIP_PORT,&GPIO_InitSt);
GPIO_InitSt.Pin=DIP4_PIN;
GPIO_Peripheral_Initialize(DIP_PORT,&GPIO_InitSt);
GPIO_InitSt.Pin=DIP5_PIN;
GPIO_Peripheral_Initialize(DIP_PORT,&GPIO_InitSt);
GPIO_InitSt.Pin=DIP6_PIN;
GPIO_Peripheral_Initialize(DIP_PORT,&GPIO_InitSt);
GPIO_InitSt.Pin=DIP7_PIN;
GPIO_Peripheral_Initialize(DIP_PORT,&GPIO_InitSt);
GPIO_InitSt.Pin=DIP8_PIN;
GPIO_Peripheral_Initialize(DIP_PORT,&GPIO_InitSt);
GPIO_InitSt.Pin=DIP9_PIN;
GPIO_Peripheral_Initialize(DIP_PORT,&GPIO_InitSt);
GPIO_InitSt.Pin=DIP10_PIN;
GPIO_Peripheral_Initialize(DIP_PORT,&GPIO_InitSt);
GPIO_InitSt.Pin=DIP11_PIN;
GPIO_Peripheral_Initialize(DIP_PORT,&GPIO_InitSt);
GPIO_InitSt.Pin=DIP12_PIN;
GPIO_Peripheral_Initialize(DIP_PORT,&GPIO_InitSt);
#if defined HY8608 || HY8108
#if COMMUNICATION_MODE==HALF_DUPLEX
GPIO_InitSt.Pin=DI13_PIN;
GPIO_Peripheral_Initialize(DI_PORT,&GPIO_InitSt);
GPIO_InitSt.Pin=DI14_PIN;
GPIO_Peripheral_Initialize(DI_PORT,&GPIO_InitSt);
#endif
#endif
#if defined HY8602
Dip_Set_Low();
#else
Dip_Set_High();
#endif
}
#if defined HY8810 || HY8602 || HY8811 || HY8603 || HY8822 || HY8612
void Dis_Set_High(void) {
DIS_PORT->POD |=machine.dis_mask;
}
void Dis_Set_Low(void) {
DIS_PORT->POD &=~machine.dis_mask;
}
static void SpbApi_DisInit(void) {
GPIO_InitType GPIO_InitSt;
RCC_AHB_Peripheral_Clock_Enable(RCC_AHB_PERIPH_GPIOD);
GPIO_Structure_Initialize(&GPIO_InitSt);
GPIO_InitSt.GPIO_Mode=GPIO_MODE_OUT_PP;
GPIO_InitSt.GPIO_Slew_Rate=GPIO_SLEW_RATE_FAST;
GPIO_InitSt.Pin=DIS1_PIN;
GPIO_Peripheral_Initialize(DIS_PORT,&GPIO_InitSt);
GPIO_InitSt.Pin=DIS2_PIN;
GPIO_Peripheral_Initialize(DIS_PORT,&GPIO_InitSt);
#if defined HY8602
Dis_Set_Low();
#else
Dis_Set_High();
#endif
}
#endif
static void SpbApi_DosInit(void) {
GPIO_InitType GPIO_InitSt;
TIM_TimeBaseInitType TIM_TimeBaseSt;
uint16_t PrescalerValue = 0;
RCC_AHB_Peripheral_Clock_Enable(RCC_AHB_PERIPH_GPIOB);
RCC_AHB_Peripheral_Clock_Enable(RCC_AHB_PERIPH_GPIOD);
RCC_APB2_Peripheral_Clock_Enable(RCC_APB2_PERIPH_AFIO);
RCC_APB1_Peripheral_Clock_Enable(RCC_APB1_PERIPH_TIM4);
RCC_APB1_Peripheral_Clock_Enable(RCC_APB1_PERIPH_TIM5);
GPIO_Structure_Initialize(&GPIO_InitSt);
#if COMMUNICATION_MODE==SERIAL
GPIO_InitSt.GPIO_Mode=GPIO_MODE_INPUT;
GPIO_InitSt.GPIO_Slew_Rate=GPIO_SLEW_RATE_FAST;
GPIO_InitSt.GPIO_Pull = GPIO_PULL_UP;
GPIO_InitSt.Pin=DOS1_PIN;
GPIO_Peripheral_Initialize(DOS1_PORT,&GPIO_InitSt);
GPIO_EXTI_Line_Set(DOS1_EXTI_LINE_SOURCE, AFIO_EXTI_PB0);
GPIO_InitSt.Pin=DOS2_PIN;
GPIO_Peripheral_Initialize(DOS2_PORT,&GPIO_InitSt);
GPIO_EXTI_Line_Set(DOS2_EXTI_LINE_SOURCE, AFIO_EXTI_PB1);
GPIO_InitSt.Pin=DOS3_PIN;
GPIO_Peripheral_Initialize(DOS3_PORT,&GPIO_InitSt);
GPIO_EXTI_Line_Set(DOS3_EXTI_LINE_SOURCE, AFIO_EXTI_PB2);
GPIO_InitSt.Pin=DOS4_PIN;
GPIO_Peripheral_Initialize(DOS4_PORT,&GPIO_InitSt);
GPIO_EXTI_Line_Set(DOS4_EXTI_LINE_SOURCE, AFIO_EXTI_PB3);
GPIO_InitSt.Pin=DOS5_PIN;
GPIO_Peripheral_Initialize(DOS5_PORT,&GPIO_InitSt);
GPIO_EXTI_Line_Set(DOS5_EXTI_LINE_SOURCE, AFIO_EXTI_PB4);
GPIO_InitSt.Pin=DOS6_PIN;
GPIO_Peripheral_Initialize(DOS6_PORT,&GPIO_InitSt);
GPIO_EXTI_Line_Set(DOS6_EXTI_LINE_SOURCE, AFIO_EXTI_PB5);
GPIO_InitSt.Pin=DOS7_PIN;
GPIO_Peripheral_Initialize(DOS7_PORT,&GPIO_InitSt);
GPIO_EXTI_Line_Set(DOS7_EXTI_LINE_SOURCE, AFIO_EXTI_PB6);
GPIO_InitSt.Pin=DOS8_PIN;
GPIO_Peripheral_Initialize(DOS8_PORT,&GPIO_InitSt);
GPIO_EXTI_Line_Set(DOS8_EXTI_LINE_SOURCE, AFIO_EXTI_PB7);
GPIO_InitSt.Pin=DOS9_PIN;
GPIO_Peripheral_Initialize(DOS9_PORT,&GPIO_InitSt);
GPIO_EXTI_Line_Set(DOS9_EXTI_LINE_SOURCE, AFIO_EXTI_PB8);
GPIO_InitSt.Pin=DOS10_PIN;
GPIO_Peripheral_Initialize(DOS10_PORT,&GPIO_InitSt);
GPIO_EXTI_Line_Set(DOS10_EXTI_LINE_SOURCE, AFIO_EXTI_PB9);
GPIO_InitSt.Pin=DOS11_PIN;
GPIO_Peripheral_Initialize(DOS11_PORT,&GPIO_InitSt);
GPIO_EXTI_Line_Set(DOS11_EXTI_LINE_SOURCE, AFIO_EXTI_PB14);
GPIO_InitSt.Pin=DOS12_PIN;
GPIO_Peripheral_Initialize(DOS12_PORT,&GPIO_InitSt);
GPIO_EXTI_Line_Set(DOS12_EXTI_LINE_SOURCE, AFIO_EXTI_PD15);
#endif
EXTI->IMASK &=~(machine.dos_mask1|machine.dos_mask2);
EXTI->RT_CFG |= (machine.dos_mask1|machine.dos_mask2);
EXTI->FT_CFG |= (machine.dos_mask1|machine.dos_mask2);
#if COMMUNICATION_MODE==HALF_DUPLEX
EXTI->FT_CFG &=~(1<<9);
#endif
//TIMER4 dos cap 100K(10us) 64M
TIM_Base_Struct_Initialize(&TIM_TimeBaseSt);
PrescalerValue = 3;
TIM_TimeBaseSt.Period = 159;
TIM_TimeBaseSt.Prescaler = 3;
TIM_TimeBaseSt.ClkDiv = 0;
TIM_TimeBaseSt.CntMode = TIM_CNT_MODE_UP;
TIM_Base_Initialize(DOS_TIM, &TIM_TimeBaseSt);
TIM_Auto_Reload_Preload_Enable(DOS_TIM);
TIM_Base_Prescaler_Set(DOS_TIM, PrescalerValue);
DOS_TIM->STS &= ~1;
TIM_Interrupt_Enable(DOS_TIM, TIM_INT_UPDATE);
//TIMER5 dos cap timeout 1ms/round
TIM_Base_Struct_Initialize(&TIM_TimeBaseSt);
PrescalerValue = 15;
TIM_TimeBaseSt.Period = 3999;
TIM_TimeBaseSt.Prescaler = 0;
TIM_TimeBaseSt.ClkDiv = 0;
TIM_TimeBaseSt.CntMode = TIM_CNT_MODE_UP;
TIM_Base_Initialize(TIM5, &TIM_TimeBaseSt);
TIM_Auto_Reload_Preload_Enable(TIM5);
TIM_Base_Prescaler_Set(TIM5, PrescalerValue);
TIM5->STS &= ~1;
TIM_Interrupt_Enable(TIM5, TIM_INT_UPDATE);
}
void SpbApi_SpbBspInit(void) {
#if defined HY8810 || HY8602 || HY8811 || HY8603 || HY8822 || HY8612
#if DIP_DIS_COMBINE==0
SpbApi_DisInit();
#endif
#endif
SpbApi_DipInit();
SpbApi_DosInit();
}