打印

MCBSP工作在SPI模式下作为Master向ad9834写频率字,时序有问题

[复制链接]
3179|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 niuyuanhai 于 2014-4-16 21:19 编辑


MCBSP工作在SPI模式下作为Master向ad9834写频率字,时序有问题,CLKX(spi中的sck)正常,但是FSX(spi中的ss)不正常,下图是测试的时序图,


3号线是DX(数据),2号线是CLKX(时钟),1号线是FSX(帧同步)。正确的情况下帧同步信号是不是应该这样: 不发送数据是一直高电平,
发送数据时自动跳变到低电平,传输结束后自动跳回高电平?      但是我的FSX比较乱,传输数据过程中经常高点转换:(

请问各位高手,帮忙分析下,为什么我的FSX信号这个样子?十分感谢……

这是我的一个测试程序:
void trans(Uint16 con_word)
{   
  McbspbRegs.DXR1.all=con_word;
}

这是Mcbspb的配置代码:
void InitMcbspb(void)
{
    McbspbRegs.SPCR2.bit.XRST=0;

    McbspbRegs.SPCR1.bit.RRST=0;
        McbspbRegs.SPCR2.bit.GRST=0;

    McbspbRegs.SPCR1.bit.CLKSTP=11; //enable or diable the Clock Stop Mood
    McbspbRegs.PCR.bit.CLKXP=0; //set the transmit clock polarity
    McbspbRegs.PCR.bit.CLKRP=0;
    McbspbRegs.PCR.bit.CLKXM=1;
        delay_loop();
    McbspbRegs.PCR.bit.SCLKME=0;
    McbspbRegs.SRGR2.bit.CLKSM=1;
    McbspbRegs.SRGR1.bit.CLKGDV = CLKGDV_VAL; // CLKG frequency = LSPCLK/(CLKGDV+1)
    McbspbRegs.PCR.bit.FSXM=1;  //Transmit frame-synchronization mode
        McbspbRegs.SRGR2.bit.FSGM=0; //Sample rate generator transmit frame-synchronization mode
        McbspbRegs.PCR.bit.FSXP=1;  //Set the transmit frame-synchronization polarity
        McbspbRegs.XCR2.bit.XDATDLY=1; //Set the Transmit Data Delay
    McbspbRegs.RCR2.bit.RDATDLY=1;

        McbspbRegs.XCR2.bit.XPHASE=0;  //Choose one or two Phases for the Transmit Frame
    McbspbRegs.RCR2.bit.RPHASE=0;
        McbspbRegs.XCR1.bit.XFRLEN1=0;
        McbspbRegs.RCR1.bit.RFRLEN1=0;
    McbspbRegs.XCR1.bit.XWDLEN1=2;
    McbspbRegs.RCR1.bit.RWDLEN1=2;

    McbspbRegs.SPCR2.bit.GRST=1; // Enable the sample rate generator
        clkg_delay_loop();           // Wait at least 2 CLKG cycles
        McbspbRegs.SPCR2.bit.XRST=1; // Release TX from Reset
        McbspbRegs.SPCR1.bit.RRST=1; // Release RX from Reset
    clkg_delay_loop();
    McbspbRegs.SPCR2.bit.FRST=1; // Frame Sync Generator reset
}

这是两个延时函数:
void delay_loop(void)
{
    long      i;
    for (i = 0; i < MCBSP_INIT_DELAY; i++) {} //delay in McBsp init. must be at least 2 SRG cycles
}

void clkg_delay_loop(void)
{
    long      i;
    for (i = 0; i < MCBSP_CLKG_DELAY; i++) {} //delay in McBsp init. must be at least 2 SRG cycles
}


相关帖子

沙发
zhangmangui| | 2014-4-16 22:25 | 只看该作者
没配置过SPI    SPI有帧同步吗

使用特权

评论回复
板凳
niuyuanhai|  楼主 | 2014-4-17 08:25 | 只看该作者
zhangmangui 发表于 2014-4-16 22:25
没配置过SPI    SPI有帧同步吗

mcbsp工作在clock stop模式(spi协议),帧同步相当于spi中的ss信号

使用特权

评论回复
地板
niuyuanhai|  楼主 | 2014-4-17 09:42 | 只看该作者
zhangmangui 发表于 2014-4-16 22:25
没配置过SPI    SPI有帧同步吗

版主,帮忙把帖子往顶上挪挪呗,急需大神帮忙,O(∩_∩)O谢谢

使用特权

评论回复
5
zhangmangui| | 2014-4-17 22:56 | 只看该作者
niuyuanhai 发表于 2014-4-17 09:42
版主,帮忙把帖子往顶上挪挪呗,急需大神帮忙,O(∩_∩)O谢谢

你回复一下  就上去啦   
置顶不合适   望理解

使用特权

评论回复
6
niuyuanhai|  楼主 | 2014-4-18 11:18 | 只看该作者
zhangmangui 发表于 2014-4-17 22:56
你回复一下  就上去啦   
置顶不合适   望理解

已经发现问题了,我的帧同步引脚出了点问题,现在正常了谢谢版主:lol

使用特权

评论回复
7
zhangmangui| | 2014-4-18 22:43 | 只看该作者
niuyuanhai 发表于 2014-4-18 11:18
已经发现问题了,我的帧同步引脚出了点问题,现在正常了谢谢版主

解决了就好  

使用特权

评论回复
8
kangyin4545| | 2014-7-4 22:14 | 只看该作者
怎么解决的呢,我也用mcbsp模拟SPI发送数据到74HC164,在数码管上显示,现在数码管总是没反应,头大

使用特权

评论回复
9
kangyin4545| | 2014-7-8 15:32 | 只看该作者
void init_mcbsp_spi()
{
     // McBSP-A register settings
    McbspaRegs.SPCR2.all=0x0000;                 // Reset FS generator, sample rate generator & transmitter
        McbspaRegs.SPCR1.all=0x0000;                 // Reset Receiver, Right justify word, Digital loopback dis.
    McbspaRegs.PCR.all=0x0F08;           //(CLKXM=CLKRM=FSXM=FSRM= 1, FSXP = 1低电平有效)帧同步由DXR拷贝到XSR驱动
    McbspaRegs.SPCR1.bit.DLB = 0;
    McbspaRegs.SPCR1.bit.CLKSTP = 2;     // 时钟停止模式Together with CLKXP/CLKRP determines clocking scheme
        McbspaRegs.PCR.bit.CLKXP = 0;                 // CPOL = 0, CPHA = 0 rising edge no delay
        McbspaRegs.PCR.bit.CLKRP = 0;        //上升沿发送,下降沿接受
    McbspaRegs.RCR2.bit.RDATDLY=01;      // FSX setup time 1 in master mode. 0 for slave mode (Receive)
    McbspaRegs.XCR2.bit.XDATDLY=01;      // FSX setup time 1 in master mode. 0 for slave mode (Transmit)

    McbspbRegs.XCR2.bit.XPHASE=0;         //单相,每帧一个字,每字16位
    McbspbRegs.RCR2.bit.RPHASE=0;
    McbspbRegs.XCR1.bit.XFRLEN1=0;
    McbspbRegs.RCR1.bit.RFRLEN1=0;
   
        McbspaRegs.RCR1.bit.RWDLEN1=2;     // 16-bit word
    McbspaRegs.XCR1.bit.XWDLEN1=2;     // 16-bit word
   
    McbspaRegs.XCR2.bit.XFIG=0;        //帧同步脉冲是否忽略,1=忽略
    McbspaRegs.RCR2.bit.RFIG=0;
   
    McbspaRegs.SRGR2.all=0x2013;                   // CLKSM=1,时钟来源于CPU,FSGM=0, 帧同步触发,FPER = 20 CLKG periods
    McbspaRegs.SRGR1.all=0x0038;             // Frame Width = 1 CLKG period, CLKGDV=16

    McbspaRegs.SPCR2.bit.GRST=1;         // Enable the sample rate generator
        delay_loop();                        // Wait at least 2 SRG clock cycles
        McbspaRegs.SPCR2.bit.XRST=1;         // Release TX from Reset
        McbspaRegs.SPCR1.bit.RRST=1;         // Release RX from Reset
        delay_loop();
    McbspaRegs.SPCR2.bit.FRST=1;         // Frame Sync Generator reset
}

void mcbsp_xmit(int a)
{
   
    McbspaRegs.DXR1.all=a;
}
for(;;)
{
while( McbspaRegs.SPCR2.bit.XRDY == 0 ) {}        
               mcbsp_xmit(table[i]);
               while( McbspaRegs.SPCR2.bit.XRDY == 0 ) {}
            
               while( McbspaRegs.SPCR2.bit.XEMPTY == 1 ) {}   
}

使用特权

评论回复
10
kangyin4545| | 2014-7-8 15:33 | 只看该作者
谁能帮我看看我上面的程序哪里有错误没有呢,为什么数据总是发不出去,我这也没有示波器,看不到时钟频率和帧同步是不是正确的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

12

帖子

0

粉丝