#include "ADX3202.h"
#define PI 3.1415926
uint8_t FIFO_Depth = 10;
Data_Format ADX320X_Data_Buff = {0};
extern SPI_HandleTypeDef hspi1;
extern uint8_t Pace_Mode_Flag;
#pragma - O0
void Delayus(uint16_t a)
{
a = a * 5;
while (a--)
;
}
void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
{
uint64_t CH1_IQDEM_AMP = 0, CH2_IQDEM_AMP = 0;
Delayus(4);
HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_SET);
ADX320X_ReadData_fifo();
HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET);
}
uint8_t ADX320X_Init(void)
{
uint8_t device_id;
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED4_GPIO_Port, LED4_Pin, GPIO_PIN_RESET);
__HAL_GPIO_EXTI_CLEAR_FALLING_IT(GPIO_PIN_9);
HAL_NVIC_DisableIRQ(EXTI4_15_IRQn);
DVDD_EN(GPIO_PIN_SET);
AVCC_EN(GPIO_PIN_SET);
XTAL_DIS;
InternalCLK;
NSS_H;
PWDN_H;
START_L;
HAL_Delay(100);
PWDN_L;
HAL_Delay(30);
PWDN_H;
HAL_Delay(300);
ADX320X_CMD(ADX320X_SDATAC);
ADX320X_CMD(ADX320X_SDATAC);
device_id = ADX320X_REG(ADX320X_RREG | ECG_ID, 0X00);
//AUTO_Printf(" device_id = 0X%02X \r\n", device_id);
while (device_id != 0xF3)
{
device_id = ADX320X_REG(ADX320X_RREG | ECG_ID, 0X00);
HAL_Delay(20);
}
return device_id;
}
void ADX320X_Config(void)
{
uint8_t reg_data[11] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0X40};
ADX320X_CMD(ADX320X_SDATAC);
/********SYSTEM********/
ADX320X_REG_Stream(ADX320X_WREG, AC_CMP_THD0, 10, reg_data); //流写入后10个寄存器
ADX320X_REG(ADX320X_WREG | CONFIG2, 0X80 | PDB_REFBUF_EN | PDB_BO_COMP_EN | TEST_FREQ_1HZ | INT_TEST_ON);
ADX320X_REG(ADX320X_WREG | GPIO, GPIO2_IN | GPIO1_IN);
ADX320X_REG(ADX320X_WREG | BO_CFG, DEBOUNCE_117); // LEAD OFF开启 117ms滤波器
ADX320X_REG(ADX320X_WREG | PWE_CFG, WMODE);
ADX320X_REG(ADX320X_WREG | CLK_CFG, FSEL_512K); //配置系统时钟为512K
/********ADC********/
ADX320X_REG(ADX320X_WREG | CONFIG1, DR_500); //
ADX320X_REG(ADX320X_WREG | CH1SET, PD_EN | GAIN6 | MUX_NORMAL);
ADX320X_REG(ADX320X_WREG | CH2SET, PD_EN | GAIN6 | MUX_NORMAL);
ADX320X_REG(ADX320X_WREG | BIAS_SENS, PDB_BIAS_EN | BIAS1N_CON | BIAS1P_CON); // BIAS打开并连接至CH1
/********LEAD OFF********/
ADX320X_REG(ADX320X_WREG | BO, 0xfd & (COMP_TH_70 | 0x10)); // DC LEAD OFF比较器阈值
ADX320X_REG(ADX320X_WREG | BO_SENSE, EMUX1_VSS_CON_P | EMUX1_VDD_CON_N);
ADX320X_REG(ADX320X_WREG | BO_BIAS, EMUX2_VSS_CON_P | EMUX2_VDD_CON_N);
ADX320X_REG(ADX320X_WREG | BO_ISETP, CUR_LEVEL_EN | ISTEP_nA(4.4)); // 4.4nA LEAD OFF电流
/********RES********/
ADX320X_REG(ADX320X_WREG | CAL, CALIB_ON | RESP_FREQ_DIV2 | BIASREF_INT | 0x01);
/********FIFO********/
ADX320X_REG(ADX320X_WREG | FIFO_CFG1, FRAME_CFG_2CH_ECG | FIFO_EN);
ADX320X_REG(ADX320X_WREG | FIFO_CFG2, STATUS_SEL_GPIO1_2 | DEPTH(FIFO_Depth));
/********PACE********/
ADX320X_REG(ADX320X_WREG | CONFIG4, BIASIN2RAMPP_CON);
/********************/
//START_H;
//ADX320X_CMD(ADX320X_OFFSETCAL); //自矫正
//HAL_Delay(200);
//START_L;
//__HAL_GPIO_EXTI_CLEAR_FALLING_IT(GPIO_PIN_9);
// HAL_Delay(10);
// HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);
}
void ADX320X_CMD(uint8_t cmd)
{
NSS_L;
Delayus(10);
ADX320X_SPI_RW(cmd, 1);
Delayus(10);
NSS_H;
Delayus(10);
}
uint8_t ADX320X_SPI_RW(uint8_t data, uint8_t len)
{
uint8_t rx_data = 0;
HAL_SPI_TransmitReceive(&hspi1, &data, &rx_data, len, 10);
Delayus(10);
return rx_data;
}
void ADX320X_ReadReg(uint8_t *cmd, uint8_t *data, uint8_t size)
{
uint8_t i = 0;
NSS_L;
Delayus(10);
ADX320X_SPI_RW(cmd[0], 1);
ADX320X_SPI_RW(cmd[1], 1);
for (i = 0; i < size; i++)
HAL_SPI_TransmitReceive(&hspi1, &cmd[2] + i, data + i, 1, 10);
Delayus(10);
NSS_H;
Delayus(10);
}
uint8_t ADX320X_REG(uint8_t cmd, uint8_t data)
{
uint8_t rx_data = 0;
NSS_L;
ADX320X_SPI_RW(cmd, 1);
ADX320X_SPI_RW(0X00, 1);
if ((cmd & 0x20) == 0x20)
rx_data = ADX320X_SPI_RW(0X00, 1);
else
rx_data = ADX320X_SPI_RW(data, 1);
NSS_H;
Delayus(10);
return rx_data;
}
/** @brief Stream Mode Operation Register.
* @param CMD command
* @param StartAddr first address
* @param StopAddrNum Read the number of registers
* @param data content
* @retval None
*/
uint8_t ADX320X_REG_Stream(uint8_t CMD, uint8_t StartAddr, uint8_t StopAddrNum, uint8_t *data) //
{
uint8_t data_buf[33] = {0};
uint8_t j = 0, Size = 1, i = 0;
NSS_L;
ADX320X_SPI_RW(CMD | StartAddr, 1);
ADX320X_SPI_RW(0x1f & (StopAddrNum - 1), 1);
if ((CMD & ADX320X_RREG) == ADX320X_RREG)
{
for(j = 0;j<StopAddrNum;j++)
i = HAL_SPI_TransmitReceive(&hspi1, data_buf, &data[j], 1, 10); //
}
else
{
for(j = 0;j<StopAddrNum;j++)
i = HAL_SPI_TransmitReceive(&hspi1, &data[j], data_buf, 1, 10); //
}
NSS_H;
Delayus(10);
return i;
}
void ADX320X_ReadData(void)
{
__disable_irq();
uint8_t tempread[9] = {0}, tempbuff[11] = {0};
tempbuff[9] = 0x0D;
tempbuff[10] = 0x0A;
NSS_L;
HAL_SPI_TransmitReceive(&hspi1, tempbuff, tempbuff, 9, 10);
ADX320X_Data_Buff.Header = (0XF0 & tempbuff[0]) >> 4;
ADX320X_Data_Buff.LEAD_OFF = ((0X0F & tempbuff[0]) << 1) | ((0x80 & tempbuff[1]) >> 7);
ADX320X_Data_Buff.A32X_GPIO = (0X60 & tempbuff[1]) >> 5;
ADX320X_Data_Buff.DATA_1CH = s24tos32((tempbuff[3] << 16) | (tempbuff[4] << 8) | tempbuff[5]);
ADX320X_Data_Buff.DATA_2CH = s24tos32((tempbuff[6] << 16) | (tempbuff[7] << 8) | tempbuff[8]);
NSS_H;
AUTO_Printf_DATA(tempbuff, 11);
__enable_irq();
}
void ADX320X_ReadData_fifo(void)
{
static uint8_t tempbuff[111] = {0};
uint8_t *tdata;
uint8_t j = 0, Size = 1, i = 0;
NSS_L;
Delayus(10);
*((__IO uint8_t *)&hspi1.Instance->DR) = ADX320X_RFIFO;
Delayus(10);
while (~(hspi1.Instance->SR) & 1)
;
(*(uint8_t *)&tempbuff[j]) = *(__IO uint8_t *)&hspi1.Instance->DR;
*((__IO uint8_t *)&hspi1.Instance->DR) = ADX320X_RFIFO_Item(FIFO_Depth) - 1;
Delayus(10);
while (~(hspi1.Instance->SR) & 1)
;
(*(uint8_t *)&tempbuff[j]) = *(__IO uint8_t *)&hspi1.Instance->DR;
for (j = 0; j < FIFO_Depth * 7; j++)
{
*((__IO uint8_t *)&hspi1.Instance->DR) = i;
while (~(hspi1.Instance->SR) & 1)
;
(*(uint8_t *)&tempbuff[j]) = *(__IO uint8_t *)&hspi1.Instance->DR;
}
NSS_H;
tdata = FIFO_data_transposition(tempbuff, FIFO_Depth);
AUTO_Printf_DATA(tdata, FIFO_Depth * 11);
}
uint8_t *FIFO_data_transposition(uint8_t *pRxData, uint8_t Item)
{
static uint8_t buff[111] = {0};
uint8_t j = 0, i = 0, pace_puls = 0;
if (Pace_Mode_Flag == ENABLE)
{
if (GPIO2 == ENABLE) //当pace_puls为高时
{
pace_puls = 1;
HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_SET);
GPIO1_H; //复位RS触发器
Delayus(10);
GPIO1_L;
}
else
{
HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_RESET);
}
for (j = 0; j < Item; j++)
{
i = j * 11;
buff[0 + i] = 0xc0 | (((*pRxData) & 0xf0) >> 4);
buff[1 + i] = (((*pRxData) & 0x08) << 4) | (((*pRxData & 0x01) | (pace_puls << 1)) << 5);
buff[2 + i] = 0x00;
buff[3 + i] = *++pRxData;
buff[4 + i] = *++pRxData;
buff[5 + i] = *++pRxData;
buff[6 + i] = *++pRxData;
buff[7 + i] = *++pRxData;
buff[8 + i] = *++pRxData;
buff[9 + i] = 0x0D;
buff[10 + i] = 0x0A;
pRxData++;
}
}
else
{
for (j = 0; j < Item; j++)
{
i = j * 11;
buff[0 + i] = 0xc0 | (((*pRxData) & 0xf0) >> 4);
buff[1 + i] = (((*pRxData) & 0x08) << 4) | (((*pRxData) & 0x03) << 5);
buff[2 + i] = 0x00;
buff[3 + i] = *++pRxData;
buff[4 + i] = *++pRxData;
buff[5 + i] = *++pRxData;
buff[6 + i] = *++pRxD