首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

SMAC通信调试的时候发现,在等待gu8RTXMODE!=IDLE_MODE

不会数据没收完就跳出
芯片回到idle状态下会产生一个中断,可以在driver.c中看到中断服务子程序,这里面改变了gu8RTXMODE的状态

SMAC通信调试的时候发现,在等待gu8RTXMODE!=IDLE_MODE

UINT8 PDDataRequest(tTxPacket *psPacket)
{
if (gu8RTxMode == IDLE_MODE)
{
RAMDrvWriteTx(psPacket); /* Load the data into packet RAM */
PLMESetTrxStateRequest(TX_MODE); /* transmit it */

/* Wait for the state to return to idle. (finish transmitting) */
while (gu8RTxMode != IDLE_MODE)[/color ]{
MCU_LOW_POWER_WHILE();
}
return SUCCESS;
}
else
{
return RX_ON;
}
}
请问gu8RTXMODE在什么条件下跳出?是自动的吗?这个问题会是数据没发完造成的吗?

[此贴子已经被作者于2007-5-28 18:13:18编辑过]

我的程序似乎一直停在这里。请问大虾说的,如果数据没被接收的话,是否一直循环等待?
while (gu8RTxMode != IDLE_MODE0){
MCU_LOW_POWER_WHILE();
}
收发器应该是这样工作的,收发之间不能直接转换,都是经过idle这个状态。收完就idle,发完也是idle。循环等待的话就是MCU没有接收到idle的信号。不知道你用的是那个smac的例子程序,在哪个平台上面?
如果freescale提供的程序没有改动过的话,在fsl对应的平台上运行应该没有任何问题的。
我的平台13213-SRB,可是由于FSL的smac4.1c的例程有限制不能编译通过,所以自己在编写程序。用的是wireless uart 程序修改的,工程已发给版主了。麻烦版主帮助看下
在drivers.c这个文件中,有一个 interrupt void IRQIsr(void) 中断函数,这个函数处理很多事情,比如发送结束、接收结束的时候,射频模块都会给MCU中断信号,然后进入这个函数。

这个函数里有这么一段代码,正是这段代码,使得射频模块发送完成后,将 gu8RTxMode 改回了 IDLE_MODE.

if ((gu8RTxMode == IDLE_MODE) || ((u16StatusContent & CCA_IRQ_MASK) != 0) || \
((u16StatusContent & TX_IRQ_MASK) != 0))
{
    // 发送完毕后,就会满足 (u16StatusContent & TX_IRQ_MASK) != 0 这个条件
    /* If in idle mode already or if CCA or TX is done, just return. */
    RTXENDeAssert(); /* Forces the MC13192 to idle. */

    /* Check for Pulse TX Mode for PRBS9 Test mode sequence */
    if (gu8RTxMode == PULSE_TX_MODE)
    {
        u16StatusContent = (SPIDrvRead(MODE_ADDR) & 0xFF7F); /* Read the MC13192 trx register. Timer trigger off. */
        SPIDrvWrite(MODE_ADDR, u16StatusContent); /* Re-write the trx register. */
        RTXENAssert(); /* Re-start the sequence. */

        #if defined (PA)
        MC13192_PA_CTRL = PA_OFF; //Turn off the PA when TX is complete
        #endif
        return;
    }

    gu8RTxMode = IDLE_MODE; // 在这里,gu8RTxMode 被恢复成了 IDLE_MODE
    return;
}

你发送数据进行调试的时候,看看程序有没有进到中断里呢?如果没有进入中断,那可能是MCU的中断设置有问题——比如是否允许了中断?中断向量表是否设置正确?(中断向量表在 vectortable.c 这个文件里)

[此贴子已经被作者于2007-5-31 16:15:31编辑过]

[此贴子已经被作者于2007-5-31 16:18:27编辑过]

让我在月光下许三个愿望: -愿世界上再没有战争的硝烟, -愿世界上的每一个家庭都幸福快乐, -愿我天天都能看见大家甜甜的笑 ^_*

while (gu8RTxMode != IDLE_MODE)时,跳转到一块
FFF8 STX ,X
FFF9 STX ,X
FFFA STX ,X
FFFB STX ,X
FFFC STX ,X
FFFD STX ,X
FFFE BEST 4,0xA7

我的程序到这里好像跳到这里,就一直死循环了。

大虾,怎么看有没进入中断?中断这块不怎么清楚,请指点下?

vectortable.c也没有加进去而且中断向量我不太明白,请问我应该如何对MCU进行中断设置。

[此贴子已经被作者于2007-6-1 20:07:58编辑过]

返回列表