CC2640 丢失外部脉冲中断点
我这边用的2640,挂了一个ADS1292R采集芯片,用的外部中断,4K采样率。
用的是CC2640的simpleperipheral例程开发的,在现有的基础上加了一个任务,用于采集ADS1292R数据
void ECG_createTask(void)
{
Task_Params taskParams;
// Configure the ECG task
Task_Params_init(&taskParams);
taskParams.stack = myTaskStack;
taskParams.stackSize = sizeof(myTaskStack);
taskParams.priority = 5;
Task_construct(&myTask, ECG_taskFxn, &taskParams, NULL);
// Create the semaphore used to wait for ....
Semaphore_Params semParams;
Semaphore_Params_init(&semParams);
semParams.mode = Semaphore_Mode_BINARY;
Semaphore_construct(&semECGTask, 0, &semParams);
//Create the Msg Quene
Queue_Params queueParams;
Queue_Params_init(&queueParams);
Queue_construct(&ECGMsg,&queueParams);
ECGMsgQueue = Queue_handle(&ECGMsg);
//ECGMsg
Error_Block eb;
Error_init(&eb);
msg = (MsgObj *) Memory_alloc(NULL, NUMMSGS * sizeof(MsgObj), 0, &eb);
//allocation the Memory to DataRadyMsg and CloclkIntMsg;
DataRadyMsg =msg++;
CloclkIntMsg=msg;
}
还有一个外部中断的处理
///////////////////////////////////////
//ADS1292R_registerInt
//ADS1292R注册输入中断函数
//参数:硬件中断的callback函数
//返回:无
//注意:调用该函数前必须先调用PIN的初始化函数ADS129xR_Inial_GPIO
///////////////////////////////////////
void ADS1292R_registerInt(ptrFuc intFuc)
{
//Register ADS1292 ISR
PIN_registerIntCb(hADSPins, intFuc);
// Configure interrupt
PIN_setConfig(hADSPins, PIN_BM_IRQ, Board_ADS_DRDY | PIN_IRQ_NEGEDGE);
// Enable wakeup
//PIN_setConfig(hADSPins, PINCC26XX_BM_WaKEUP, Board_KEY_UP|PINCC26XX_WAKEUP_NEGEDGE);
}
现在测试只是在中断函数中翻转LED
void ECG_HwiIntFxn(PIN_Handle hPin, PIN_Id pinId)
{
//LED_toggle();
//DataRadyMsg->id=ECG_DATARDY_EVT;
//Queue_enqueue(ECGMsgQueue,(Queue_Elem*)DataRadyMsg);
//Semaphore_post(Semaphore_handle(&semECGTask));
LED_toggle();
}
问题:
会丢掉中断点,即有时候两个中断只执行的一次。而且波形宽宽窄窄很补齐。

不知道是系统的调度原因导致的,还是蓝牙的任务引起的。请大神解答。
注意ADS1292R的采集时间,我觉得是他引起的。外部中断是由什么触发的呢?
我这个示波器图中根本没有读取ADS1292的数据,只是接收到中断后翻转LED。外部中断是由ADS1292R的DRDY引脚的下降沿触发

奇怪,确实是没有触发中断。其他都能触发,看着信号都是一样的。只能解释为你触发的时间不够引起的了。放大这个触发信号看看
关闭蓝牙低功耗模式,降低触发时钟频率。
或者设定中断优先级!
大神,谢谢提醒,确实是由于低功耗模式影响了这个。
Qian Xue1
你好, 我有几个类似平台的问题, 能否和你私下交流一下。
我的QQ号, 1992411019
邮箱, you_sun@yahoo.com
真诚希望得到你的回复。
David Sun
你好,我在做一个类似的设计,能参考一下你的代码吗
这个恐怕现在不太方便了。有什么问题可以拿出来讨论!
加你QQ了!
加我QQ,讨论一下, 275503841。
xiao li7, 我试着加你qq, 加不了
,
我试图用CC2640 SPI读写ADS1292寄存器,总是读不对。是用TIRTOS 的SPI driver,默认是用DMA。能否分享一下你的SPIdriver用法?
谢谢!
当把SPI时钟降低到100K,能正确读写ADS1292寄存器,但在中断服务程序中读ADC,不管用100K还是500KSPI时钟都不对。这是中断服务程序调用的SPI读数据程序
bool ADS1292_spi_read(uint8_t *buf, uint8_t len)
{
uint8_t wbuf[9];
SPI_Transaction masterTransaction;
wbuf[0] = ADS1292_RDATA;
wbuf[1] = 0;
wbuf[2] = 0;
masterTransaction.count = len;
masterTransaction.txBuf = wbuf;
masterTransaction.arg = NULL;
masterTransaction.rxBuf = buf;
return SPI_transfer(spiHandle, &masterTransaction) ? 1 : 0;
}
SPI一般都没啥问题,ads1292要能正确读者,初始化很关键,看看参考手册的初始化过程。
谢谢你的回答,请问你是在中断服务程序里void ECG_HwiIntFxn(PIN_Handle hPin, PIN_Id pinId)读ADS1292,还是到semECGTask里去读?
最好去task里处理
多谢了
