一 概述
在生理信号领域死磕,那就离不开对心电的研究。笔者最近用到ads1292r。调试过程中走了一些弯路,这里做个梳理和总结。
二 源码解析
1.ads1292的初始化寄存器配置:
void ads1292_init(void)
{
uint8_t id;
Ads1292_Reset();
osDelay(10);
mprintf("aa ads_rx_irq_cnt is: %d \n\r", ads_rx_irq_cnt);
ADS1292_poweron_init();
osDelay(10);
mprintf("ss ads_rx_irq_cnt is: %d \n\r", ads_rx_irq_cnt);
// 0 is 125 sps 1 is 250 sps 2 is 500 sps 3 is 1k sps 4 is 2k sps 5 is 4k sps 6 is 8k sps
ADS_1292_WREG(ADS1292_REG_CONFIG1, 0x00);//Set sampling rate to 125 SPS
osDelay(10);
ADS_1292_WREG(ADS1292_REG_CONFIG2, 0xA0);//Lead-off comp off,0
id = ADS_1292_RREG(ADS1292_REG_CONFIG2);
mprintf("ads1292 CFG2=%#X\r\n", id);
osDelay(10);
ADS_1292_WREG(ADS1292_REG_LOFF, 0x10);//Lead-off defaults
osDelay(10);
ADS_1292_WREG(ADS1292_REG_CH1SET, 0x00);//Ch 1 enabled, gain 1
id = ADS_1292_RREG(ADS1292_REG_CH1SET);
mprintf("ads1292 CH1SET is=%#X\r\n", id);
osDelay(10);
ADS_1292_WREG(ADS1292_REG_CH2SET, 0x00); //Ch 2 enabled, gain 1
osDelay(10);
ADS_1292_WREG(ADS1292_REG_RLDSENS, 0x00); //RLD settings: off
osDelay(10);
ADS_1292_WREG(ADS1292_REG_LOFFSENS, 0x00); //LOFF settings: all disabled
osDelay(10);
ADS_1292_WREG(ADS1292_REG_RESP1, 0xc2); //Respiration: MOD/DEMOD turned only, phase 0
osDelay(10);
ADS_1292_WREG(ADS1292_REG_RESP2, 0x03); //Respiration: Calib OFF, respiration freq defaults
osDelay(10);
ADS_1292_WREG(ADS1292_REG_GPIO, 0x0C); //GPIO input
osDelay(10);
id = ADS_1292_RREG(ADS1292_REG_ID);
mprintf("ads1292r ID=0x%x\r\n", id);
mprintf("ads1292 (01 is ads1292 10 is ads1291 11 is ads1292 or ads1292r)ID=0x%x\r\n", id & 0x03);
for (uint32_t i = 0; i < 10; i++)
{
/* code */
uint8_t temp_val = ADS_1292_RREG(i);
mprintf("ads read addr is:0x%x val is:0x%x \n\r",i,temp_val);
}
// hardware controller
//Ads1292_Enable_Start();
ads1292_data_start();
}
2.ads1292r的数据读取入口:
/**
* @brief This function handles EXTI line1 interrupt.
*/
void EXTI1_IRQHandler(void)
{
/* USER CODE BEGIN EXTI1_IRQn 0 */
HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin, GPIO_PIN_RESET);
if(HAL_SPI_TransmitReceive_DMA(&hspi2, ADS1299_Txbuffer, ADS1299_Rxbuffer, 3+RX_ADS_NUM)!=HAL_OK)
{
__set_FAULTMASK(1);
HAL_NVIC_SystemReset();
}
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_1);
/* USER CODE END EXTI1_IRQn 0 */
HAL_GPIO_EXTI_IRQHandler(ADS_DRDY_Pin);
/* USER CODE BEGIN EXTI1_IRQn 1 */
/* USER CODE END EXTI1_IRQn 1 */
}
三 思路梳理
1.硬件的连接:
这个硬件接口比较多,注意每个接口都是通的非常关键。最有效的方法使用万用表逐个测量,确保连线是ok了再做其他。
2.首先确认一能否读到ID号码,这个是判断是否通的关键。
3.读不到数据怎么办?
拿笔者上面的代码反复确认一下,假如代码配置有问题,特别是clk的配置,是读不到数据的。
四 总结
心电的东西还不少,后续还要继续加大分析力度,比如,性能,算法。等。