mcbsp配置为uart,接收采用DSP/bios硬中断,发送放在任务线程,数据可以正确接收和发送。
问题1:未使能接收中断线程,只在 DSP uart 任务线程发送数据时,经常出现中断现象,中断后,数据不能继续发送。经调试,是如下代码出现问题:
old = HWI_disable();
timeout = 0;
// Wait for XRDY signal before writing data to DXR
response = 0;
while ((timeout++ < maxTimeout) && !(response & CSL_MCBSP_XRDY))
{
CSL_mcbspGetHwStatus(hMcbsp, CSL_MCBSP_QUERY_DEV_STATUS, &response);
}
if(timeout >= maxTimeout)
{
exit(1);//超时,跳到这里了,问题所在
}
HWI_restore(old);
HWI_enable();
但是,注释掉HWI_disable(); HWI_restore(old); HWI_enable(),后,程序不会出现查询状态为超时退出的情况。为何?
问题2:使能DSP接收中断后,pc发给DSP的数据速度过快时,会出现不能相应中断。此后,不能进入接收中断函数。
为何出现这种情况?求解^^
depeng kong:
补充:查询模式下,程序运行正常!
Anna:
回复 depeng kong:
问题1:未使能接收中断线程,只在 DSP uart 任务线程发送数据时,经常出现中断现象,中断后,数据不能继续发送。经调试,是如下代码出现问题:
这里接收和发送是设计成有什么关系的吗?比如,一定是在接收之后才能发送吗?为什么要加注释掉HWI_disable(); HWI_restore(old); HWI_enable()?任务的调度优先级要比硬中断低。
问题2:使能DSP接收中断后,pc发给DSP的数据速度过快时,会出现不能相应中断。此后,不能进入接收中断函数。
根据您的描述,好像是中断中作了很多处理,使得PC频繁发数据时,中断还未完成处理?您这里的速度过快是指什么?
depeng kong:
回复 Anna:
非常感谢您的答复。更新问题如下:
******************************************************************************************************
问题:初始化函数未使能GPIO4中断 C64_enableIER(GPIO4_INT_FLAG )时,程序正常运行,使能后,Uart接收中断函数SerialPortReceive只能进一次.
问:更高优先级的GPIO4中断为何会对串口接收中断有影响?如何避免?
*****************************************************************************************************
问题补充: 硬件平台为c6454 主频700MHZ
MCBSP寄存器配置如下:
volatile Uint32 spcr = 0x02000000;
volatile Uint32 rcr = 0x81050840;
volatile Uint32 xcr = 0x81040840;
volatile Uint32 pcr = 0x00000b0c;
接收中断函数:
#define BUFFER_SIZE 88
void SerialPortReceive()
{
CSL_mcbspRead (hMcbsp, CSL_MCBSP_WORDLEN_16, &recvbuf[receiveCount]);
receiveCount++;
if(receiveCount == BUFFER_SIZE)
{
receiveCount = 0;
SEM_post(&SEM_MCBSP_RECE);//接收到Buffer_size数据后交给任务线程处理
}
}
数据处理的任务线程如下:
void tskForMcbspReceive()
{
int loopIndex ;
while(1)
{
SEM_pend(&SEM_MCBSP_RECE, SYS_FOREVER);
for(loopIndex = 0; loopIndex < 8; loopIndex++)
{
r[loopIndex] = ProcessReceiveData(&recvbuf[loopIndex*11]);
}
if(满足条件)
{
SerialPortSend();//利用查询方式向pc发送数据
}
}
}
Thomas Yang1:
回复 depeng kong:
你好
综合你的问题来看,应该是中断嵌套了
1)可以考虑在中断子程中关全局中断
2)可以根据系统设计,调整中断优先级设计
谢谢