TI中文支持网
TI专业的中文技术问题搜集分享网站

mcbsp 配置为uart发送错误

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)可以根据系统设计,调整中断优先级设计

谢谢

赞(0)
未经允许不得转载:TI中文支持网 » mcbsp 配置为uart发送错误
分享到: 更多 (0)