This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

我用DM642的MCBSP接口作为SPI主器件,来控制DA转换,寄存器初始化如下,程序可以跑起来,DXR寄存器中也有我想要发送的值,但用示波器测量没有信号,片选、时钟、数据都没有输出,有没有哪位大侠指点一下,已经搞了好几天了:

Other Parts Discussed in Thread: SPRC090, TMS320DM642

我用DM642的MCBSP接口作为SPI主器件,来控制DA转换,寄存器初始化如下,程序可以跑起来,DXR寄存器中也有我想要发送的值,但用示波器测量没有信号,片选、时钟、数据都没有输出,有没有哪位大侠指点一下,已经搞了好几天了,配置如下:

void Init_25p80Module(void) {
unsigned int spcr, pcr, srgr, xcr, rcr, mcr;
unsigned int rcere0, rcere1, rcere2, rcere3;
unsigned int xcere0, xcere1, xcere2, xcere3;

spcr = MCBSP_SPCR_RMK (
MCBSP_SPCR_FREE_DEFAULT,
MCBSP_SPCR_SOFT_DEFAULT,
MCBSP_SPCR_FRST_OF(0),
MCBSP_SPCR_GRST_OF(0), //波特率复位
MCBSP_SPCR_XINTM_DEFAULT,
MCBSP_SPCR_XSYNCERR_DEFAULT,
MCBSP_SPCR_XRST_OF(0), //发送复位
MCBSP_SPCR_DLB_DEFAULT,
MCBSP_SPCR_RJUST_DEFAULT,
MCBSP_SPCR_CLKSTP_OF(0x03), //数据在发送时钟上升沿发送,在接收下降沿接受
MCBSP_SPCR_DXENA_OFF,
MCBSP_SPCR_RINTM_DEFAULT,
MCBSP_SPCR_RSYNCERR_DEFAULT,
MCBSP_SPCR_RRST_OF(0) //接收复位
);

pcr = MCBSP_PCR_RMK (
MCBSP_PCR_XIOEN_SP,
MCBSP_PCR_RIOEN_SP,
MCBSP_PCR_FSXM_OF(1),
MCBSP_PCR_FSRM_EXTERNAL,
MCBSP_PCR_CLKXM_OF(1), //设置CLKX引脚为输出
MCBSP_PCR_CLKRM_INPUT,
MCBSP_PCR_CLKSSTAT_0,
MCBSP_PCR_DXSTAT_0,
MCBSP_PCR_FSXP_OF(1), //设置FSX引脚为低电平有效
MCBSP_PCR_FSRP_ACTIVEHIGH,
MCBSP_PCR_CLKXP_OF(0), //数据无延时
MCBSP_PCR_CLKRP_FALLING
);

srgr = MCBSP_SRGR_RMK (
MCBSP_SRGR_GSYNC_FREE,
MCBSP_SRGR_CLKSP_RISING,
MCBSP_SRGR_CLKSM_OF(1), //采样率发生器时钟源至CPU时钟
MCBSP_SRGR_FSGM_OF(0), //在每个串行数据包传输期间FSX信号有效
MCBSP_SRGR_FPER_DEFAULT,
MCBSP_SRGR_FWID_DEFAULT,
MCBSP_SRGR_CLKGDV_OF(0x02) //定义采样率发生器时钟的降频因子
);

xcr = MCBSP_XCR_RMK (
MCBSP_XCR_XPHASE_SINGLE,
MCBSP_XCR_XFRLEN2_DEFAULT,
MCBSP_XCR_XWDLEN2_DEFAULT,
MCBSP_XCR_XCOMPAND_DEFAULT,
MCBSP_XCR_XFIG_YES,
MCBSP_XCR_XDATDLY_1BIT, //提供正确FSX信号启动时间
MCBSP_XCR_XFRLEN1_DEFAULT, //单相帧,一个数据元素
MCBSP_XCR_XWDLEN1_8BIT, //几位数
MCBSP_XCR_XWDREVRS_DISABLE
);

rcr = MCBSP_RCR_RMK (
MCBSP_RCR_RPHASE_SINGLE,
MCBSP_RCR_RFRLEN2_DEFAULT,
MCBSP_RCR_RWDLEN2_DEFAULT,
MCBSP_RCR_RCOMPAND_DEFAULT,
MCBSP_RCR_RFIG_YES,
MCBSP_RCR_RDATDLY_1BIT, //提供正确FSX信号启动时间
MCBSP_RCR_RFRLEN1_DEFAULT, //单相帧,一个数据元素
MCBSP_RCR_RWDLEN1_8BIT, //几位数
MCBSP_RCR_RWDREVRS_DISABLE
);

mcr = MCBSP_MCR_DEFAULT;
rcere0 = MCBSP_RCERE0_DEFAULT;
xcere0 = MCBSP_XCERE0_DEFAULT;
rcere1 = MCBSP_RCERE1_DEFAULT;
xcere1 = MCBSP_XCERE1_DEFAULT;
rcere2 = MCBSP_RCERE2_DEFAULT;
xcere2 = MCBSP_XCERE2_DEFAULT;
rcere3 = MCBSP_RCERE3_DEFAULT;
xcere3 = MCBSP_XCERE3_DEFAULT;


MCBSP_configArgs(hMcbsp1, spcr, rcr, xcr, srgr, mcr, rcere0, rcere1,rcere2, rcere3, xcere0, xcere1, xcere2, xcere3, pcr);

MCBSP_enableSrgr(hMcbsp1);
MCBSP_enableFsync(hMcbsp1);
mDelaymS(10);
IRQ_reset(IRQ_EVT_RINT1);
IRQ_enable(IRQ_EVT_RINT1);
IRQ_globalEnable();
mDelaymS(10);
MCBSP_enableRcv(hMcbsp1);
MCBSP_enableXmt(hMcbsp1);
mDelaymS(10);
memset(&config, 0x55, sizeof(config));
MCBSP_getConfig(hMcbsp1, &config);
}

  • mcbsp和VP接口管脚复用,PERCFG.McBSPxEN设置了么?

    另外,跑一下CSL里的mcbsp Digital loop back例程,看自环模式是否可以运行。
    http://www.ti.com/tool/sprc090

  • 万分感谢您的回复,您能说具体点吗?PERCFG.McBSPxEN设置是怎么设置啊?我初始化那段代码没有设置这些管脚吗?

  • 请看一下数据手册中对PERCFG寄存器的说明。查看一下PERCFG的值,默认是mcbsp使能的。
    3.2.1 Peripheral Selection After Device Reset
    http://www.ti.com/lit/ds/symlink/tms320dm642.pdf

  • 您好,感谢您的回复,这几天通过您的指导,现在有些进展了,但是还是有些问题,如下:

    现在我将DM642的McBSP设置从的SPI,设置如下:

    void Init_SPIModule(void) {
    unsigned int spcr, pcr, srgr, xcr, rcr, mcr;
    unsigned int rcere0, rcere1, rcere2, rcere3;
    unsigned int xcere0, xcere1, xcere2, xcere3;

    spcr = MCBSP_SPCR_RMK (
    MCBSP_SPCR_FREE_DEFAULT,
    MCBSP_SPCR_SOFT_DEFAULT,
    MCBSP_SPCR_FRST_OF(0),
    MCBSP_SPCR_GRST_OF(0), //波特率复位
    MCBSP_SPCR_XINTM_DEFAULT,
    MCBSP_SPCR_XSYNCERR_DEFAULT,
    MCBSP_SPCR_XRST_OF(0), //发送复位
    MCBSP_SPCR_DLB_DEFAULT,
    MCBSP_SPCR_RJUST_DEFAULT,
    MCBSP_SPCR_CLKSTP_OF(0x02), //数据在发送时钟上升沿发送,在接收下降沿接受
    MCBSP_SPCR_DXENA_OFF,
    MCBSP_SPCR_RINTM_DEFAULT,
    MCBSP_SPCR_RSYNCERR_DEFAULT,
    MCBSP_SPCR_RRST_NO//MCBSP_SPCR_RRST_OF(0) //接收复位
    );


    pcr = MCBSP_PCR_RMK (
    MCBSP_PCR_XIOEN_SP,
    MCBSP_PCR_RIOEN_SP,
    //MCBSP_PCR_FSXM_OF(1),
    MCBSP_PCR_FSXM_INTERNAL,
    //MCBSP_PCR_FSRM_EXTERNAL,
    MCBSP_PCR_FSRM_INTERNAL,
    //MCBSP_PCR_CLKXM_OF(1), //设置CLKX引脚为输出
    MCBSP_PCR_CLKXM_INPUT,
    MCBSP_PCR_CLKRM_INPUT,
    MCBSP_PCR_CLKSSTAT_0,
    MCBSP_PCR_DXSTAT_0,
    //MCBSP_PCR_FSXP_OF(1), //设置FSX引脚为低电平有效
    MCBSP_PCR_FSXP_ACTIVELOW,
    //MCBSP_PCR_FSRP_ACTIVEHIGH,
    MCBSP_PCR_FSRP_ACTIVELOW,
    MCBSP_PCR_CLKXP_OF(1), //数据无延时
    MCBSP_PCR_CLKRP_FALLING
    );


    srgr = MCBSP_SRGR_RMK (
    MCBSP_SRGR_GSYNC_FREE,
    MCBSP_SRGR_CLKSP_RISING,
    MCBSP_SRGR_CLKSM_OF(1), //采样率发生器时钟源至CPU时钟
    MCBSP_SRGR_FSGM_OF(1), //在每个串行数据包传输期间FSX信号有效
    MCBSP_SRGR_FPER_DEFAULT,
    MCBSP_SRGR_FWID_DEFAULT,
    MCBSP_SRGR_CLKGDV_OF(0x02) //定义采样率发生器时钟的降频因子
    );


    xcr = MCBSP_XCR_RMK (
    MCBSP_XCR_XPHASE_SINGLE,
    MCBSP_XCR_XFRLEN2_DEFAULT,
    MCBSP_XCR_XWDLEN2_DEFAULT,
    MCBSP_XCR_XCOMPAND_DEFAULT,
    MCBSP_XCR_XFIG_YES,
    MCBSP_XCR_XDATDLY_1BIT, //提供正确FSX信号启动时间
    MCBSP_XCR_XFRLEN1_DEFAULT, //单相帧,一个数据元素
    MCBSP_XCR_XWDLEN1_8BIT, //几位数
    MCBSP_XCR_XWDREVRS_DISABLE
    );


    rcr = MCBSP_RCR_RMK (
    MCBSP_RCR_RPHASE_DEFAULT,//MCBSP_RCR_RPHASE_SINGLE,
    MCBSP_RCR_RFRLEN2_DEFAULT,
    MCBSP_RCR_RWDLEN2_DEFAULT,
    MCBSP_RCR_RCOMPAND_DEFAULT,
    MCBSP_RCR_RFIG_YES,
    MCBSP_RCR_RDATDLY_0BIT, //提供正确FSX信号启动时间
    MCBSP_RCR_RFRLEN1_DEFAULT, //单相帧,一个数据元素
    MCBSP_RCR_RWDLEN1_8BIT, //几位数
    MCBSP_RCR_RWDREVRS_DISABLE
    );

    mcr = MCBSP_MCR_DEFAULT;
    rcere0 = MCBSP_RCERE0_DEFAULT;
    xcere0 = MCBSP_XCERE0_DEFAULT;
    rcere1 = MCBSP_RCERE1_DEFAULT;
    xcere1 = MCBSP_XCERE1_DEFAULT;
    rcere2 = MCBSP_RCERE2_DEFAULT;
    xcere2 = MCBSP_XCERE2_DEFAULT;
    rcere3 = MCBSP_RCERE3_DEFAULT;
    xcere3 = MCBSP_XCERE3_DEFAULT;


    MCBSP_configArgs(hMcbsp1, spcr, rcr, xcr, srgr, mcr, rcere0, rcere1,rcere2, rcere3, xcere0, xcere1, xcere2, xcere3, pcr);

    MCBSP_enableSrgr(hMcbsp1);
    MCBSP_enableFsync(hMcbsp1);
    mDelaymS(10);
    IRQ_reset(IRQ_EVT_RINT1);
    IRQ_enable(IRQ_EVT_RINT1);
    IRQ_globalEnable();
    mDelaymS(10);
    MCBSP_enableRcv(hMcbsp1);
    MCBSP_enableXmt(hMcbsp1);
    mDelaymS(10);
    // memset(&config, 0x55, sizeof(config));
    // MCBSP_getConfig(hMcbsp1, &config);
    }

    其中如果将PCR中的FSXM和FSRM分别设置MCBSP_PCR_FSXM_INTERNAL, MCBSP_PCR_FSRM_INTERNAL,管脚上看到CLK和data信号正常,但是片选FSX不正常,高电平只有1.5V左右,但是每次程序启动时中断能接收一次,之后就不能接收。

    但是如果将PCR中的FSXM和FSRM分别设置MCBSP_PCR_FSXM_EXTERNAL, MCBSP_PCR_FSRM_EXTERNAL,管脚上的信号都是正常的,但是不能进中断,用轮询的方式

    while (!MCBSP_rrdy(hMcbsp1));
    x = MCBSP_read(hMcbsp1);

    也是不行,不知道是哪里出现了问题,请帮忙,盼复!