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.

新手,MCBSP 配置IIS 很久了,都不正常,求助

Other Parts Discussed in Thread: PCM4201, TMS320VC5509A

ADC芯片是24bit的PCM4201,配置MCBSP 都不能正常工作,于是求助,搞了好几天了,新手。

DSP型号:TMS320VC5509A MCBSP通过CLKX1引脚向MCBSP1提供25MHZ时钟。

原理图:

PCM4201接法:(从器件  SCKI =25MHZ; CLKX1,FSX1由DSP提供)

DSP MCBSP配置:

MCBSP_Config Mcbsp_config1 =
{
MCBSP_SPCR1_RMK(
MCBSP_SPCR1_DLB_OFF, /* DLB = 0,禁止自闭环方式 */
MCBSP_SPCR1_RJUST_LZF, /* RJUST = 2 */
MCBSP_SPCR1_CLKSTP_DISABLE, /* CLKSTP = 0 */
MCBSP_SPCR1_DXENA_OFF, /* DXENA = 1 */
0, /* ABIS = 0 */
MCBSP_SPCR1_RINTM_RRDY, /* RINTM = 0 */
MCBSP_SPCR1_RSYNCERR_NO, /* RSYNCER = 0 */
MCBSP_SPCR1_RRST_DISABLE /* RRST = 0 */
),
MCBSP_SPCR2_RMK(
MCBSP_SPCR2_FREE_NO, /* FREE = 0 */
MCBSP_SPCR2_SOFT_NO, /* SOFT = 0 */
MCBSP_SPCR2_FRST_FSG, /* FRST = 0*/
MCBSP_SPCR2_GRST_CLKG, /* GRST = 0 */
MCBSP_SPCR2_XINTM_XRDY, /* XINTM = 0 */
MCBSP_SPCR2_XSYNCERR_NO, /* XSYNCER = N/A */
MCBSP_SPCR2_XRST_DISABLE /* XRST = 0 */
),


MCBSP_RCR1_RMK(
MCBSP_RCR1_RFRLEN1_OF(3), // RFRLEN1 = 1 //
MCBSP_RCR1_RWDLEN1_32BIT // RWDLEN1 = 2 //
),

MCBSP_RCR2_RMK(
MCBSP_RCR2_RPHASE_SINGLE, // RPHASE = 0 //
MCBSP_RCR2_RFRLEN2_OF(3), // RFRLEN2 = 0 //
MCBSP_RCR2_RWDLEN2_32BIT, // RWDLEN2 = 0 //
MCBSP_RCR2_RCOMPAND_MSB, // RCOMPAND = 0 //
MCBSP_RCR2_RFIG_NO, // RFIG = 0//
MCBSP_RCR2_RDATDLY_1BIT // RDATDLY = 1 //
),

MCBSP_XCR1_RMK(
MCBSP_XCR1_XFRLEN1_OF(3), //XFRLEN1 = 1 //
MCBSP_XCR1_XWDLEN1_32BIT //XWDLEN1 = 2 //

),
MCBSP_XCR2_RMK(
MCBSP_XCR2_XPHASE_SINGLE, // XPHASE = 0 //
MCBSP_XCR2_XFRLEN2_OF(3), // XFRLEN2 = 0//
MCBSP_XCR2_XWDLEN2_32BIT, // XWDLEN2 = 0 //
MCBSP_XCR2_XCOMPAND_MSB, // XCOMPAND = 0 //
MCBSP_XCR2_XFIG_NO, // XFIG = 0 //
MCBSP_XCR2_XDATDLY_1BIT // XDATDLY = 1 //
),

MCBSP_SRGR1_RMK(
63,
3 // WHEN CLKSM=0 39 WHEN CLKSM=1
),
MCBSP_SRGR2_RMK(
127, //fper
MCBSP_SRGR2_FSGM_FSG,// FSGM=1 FSR BY MCBSP
MCBSP_SRGR2_CLKSM_INTERNAL,// CLKSM=0
0,
MCBSP_SRGR2_GSYNC_FREE// IF GSYNC=0 FSG=FOER+1
),
MCBSP_MCR1_DEFAULT,
MCBSP_MCR2_DEFAULT,

MCBSP_PCR_RMK(
MCBSP_PCR_IDLEEN_RESET, // IDLEEN = 0
MCBSP_PCR_XIOEN_SP, // XIOEN = 0
MCBSP_PCR_RIOEN_SP, //RIOEN = 0
MCBSP_PCR_FSXM_INTERNAL, // FSXM =1
MCBSP_PCR_FSRM_INTERNAL, // FSRM = 1
0, // DXSTAT = N/A
MCBSP_PCR_CLKXM_OUTPUT, // CLKXM = 1
MCBSP_PCR_CLKRM_OUTPUT, // CLKRM = 1
MCBSP_PCR_SCLKME_BCLK, // SCLKME =1
MCBSP_PCR_FSXP_ACTIVEHIGH, // FSXP = 0
MCBSP_PCR_FSRP_ACTIVEHIGH, // FSRP = 0
MCBSP_PCR_CLKXP_FALLING, // CLKXP = 0
MCBSP_PCR_CLKRP_FALLING// CLKRP =0
),
MCBSP_RCERA_DEFAULT,
MCBSP_RCERB_DEFAULT,
MCBSP_RCERC_DEFAULT,
MCBSP_RCERD_DEFAULT,
MCBSP_RCERE_DEFAULT,
MCBSP_RCERF_DEFAULT,
MCBSP_RCERG_DEFAULT,
MCBSP_RCERH_DEFAULT,
MCBSP_XCERA_DEFAULT,
MCBSP_XCERB_DEFAULT,
MCBSP_XCERC_DEFAULT,
MCBSP_XCERD_DEFAULT,
MCBSP_XCERE_DEFAULT,
MCBSP_XCERF_DEFAULT,
MCBSP_XCERG_DEFAULT,
MCBSP_XCERH_DEFAULT
};

初始化:


//配置寄存器和启动发送 IIS模式 主设备
hMcbsp1 = MCBSP_open(MCBSP_PORT1, MCBSP_OPEN_RESET);
MCBSP_config(hMcbsp1,&Mcbsp_config1);
delay_ms(1);
MCBSP_start(hMcbsp1, MCBSP_RCV_START | MCBSP_XMIT_START, 0);
MCBSP_getConfig(hMcbsp1,&Mcbsp_config1test);

//复位PCM4201
asm(" BCLR XF");
delay_ms(1);
asm(" BSET XF");
}

简单的读写IIS
void IIS_process(void)
{

while(!MCBSP_xrdy(hMcbsp1));
MCBSP_write32(hMcbsp1,0);

}

问题描述:按照上面的配置IIS时序中的FSX/R 时序不正常

异常时序图:第2行时序不正常,第一行为CLKX=6.25MHZ,第二行为FSX/R 应该为48K左右

测试别人程序的时序(我没有这个程序例子,CLKX=6.25MHZ  FSX/R=48.8K  CLKX=128*FSX/R;FSX/R宽度=64CLKX时钟)

  • McBSP RPHRASE要配成dual phase。

    DSP做slave的话,SRGR不用配置。

    另外, CLKRM, CLKXM, FSRM, FSXR要设成0,作为输入管脚。

    你可以根据下面文档第9上的表检查一下配置,C5000跟C6000类似。
    Table 4. Bit-Field Values for McBSP Registers
    http://www.ti.com/lit/an/spra595/spra595.pdf 

  • 谢谢指导。

    我已经按照sprs595.pdf中所说的修改了,但是器件自己还是产生不了同步信号,

    如果用CPU查询方式,运行以下代码,DSP产生了帧同步,但是同步信号的周期和宽度都不是64和32 

    while(!MCBSP_xrdy(hMcbsp1)) ;
    MCBSP_write32(hMcbsp1,0x0);

    因为PCM4201已经是用了slave的接法,故要DSP提供CLKX串行时钟和FSX/R帧同步信号。

    图片中第二行是帧同步信号

    还有我想问的是,DSP有没有可能配置成MASTER器件之后,它自己一直产生帧同步信号,而不是要不断的MCBSP_write32(hMcbsp1,0x0)才能产生?

  • PCM4201接法:(从器件  SCKI =25MHZ; CLKX1,FSX1由DSP提供)

    这句话看上去两者矛盾啊。SCKI和DSP CLKX1/CLKR1相连的, 那这CLKX1/CLKR1是由SCKI提供还是DSP自己产生?

  • 不好意思呀,表达的不好拉,新手,呵呵。

    上图说明时钟以及连接:

    PCM4201 作为从器件,其SCK1由图中的CLKOUT提供,该时钟CLKOUT(有源晶振VCXO:25MHZ)同时为DSP和MCBSP1采样率发生器提供时钟信号。

    PCM4201中的BCLK来自DSP的CLKR1引脚(图中网络标号写成了DSP CLKX1 ),FSYNC来自DSP的FSX/FSR两个引脚(FSX,FSR两个引脚与FSYNC连接在一起),

    DSP的连接图:

    MCBSP1 的采样率发生器通过CLKX1引脚提供

    根据PCM4201文档所述  BCLK串行时钟频率=FSYNC帧同步频率*128,其中FSYNC的高电平脉宽为50%,故现将FSYNC帧同步信号设置成48.8KHZ,BCLK=6.25MHZ,FSYNC信号=128*CLKG(采样率设置寄存器SRGR位段FRED=127,FWID=63)。

    软件配置的数据帧格式为:双相,每相一个数据,每个数据长度为32BIT.

    现在的情况是:

    MCBSP1从CLKR1引脚向PCM4201的BCLK送出了6.25MHZ信号,但是从DSP的FSX/FSR引脚输出的FSYNC帧同步信号一直不正常(其宽度只有4个BCLK脉冲周期)。正常的情况应该是一个FYNC周期内有128个BCLK周期,脉冲宽度应该为64个BCLK周期。见下图异常时序:

    求助的问题是:

    一:如果我不进行一次写MCBSP的操作,DSP就无法输出FSYNC帧同步信号。有没有什么方法通过配置DSP让其自己输出正确的FSYNC帧同步信号而不用CPU查询写操作?

    二:如果一定要通过查询并写MCBSP才能从FSR/FSX 引脚输出FSYNC帧同步信号,那么软件要怎么样写呢?

  • 1. DSP做master的话,一定要空写一次来触发。

    2. 空写操作就是往dxr寄存器里随便写个数据。