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.

关于C6455 McBSP配置成SPI一些问题

Other Parts Discussed in Thread: TMS320C6455

mcbsp配置成SPI 时我把  字宽度设置为8bIt  一帧中包含2个字,如图片上信息, ss(FSX)应该是信号1 所示,但是我抓出来的波形是信号2。

我函数操作是

spi_transmit_data(0x60);
spi_transmit_data(0xfe);

也就是说发了两下,但是我配置的帧长度是2, 那发出去的ss信号不应该连续的低两个8bit吗?怎么中间高了一下

  • 上图中两个信号: 第一个是信号1(想要得到的ss波形),

    下面的是实际测得SS波形

  • 型号不对啊,是c6455吧?

  • mcbsp配置成SPI模式的话,要求single phase, one element per frame。

  • 是6455,打错字了。您说的什么意思我把那位设置成0,对吗 

  • 对的,(R/X)PHASE和(R/X)FRLEN都要设成0,这在McBSP文档第59页上有说明。
     http://www.ti.com/lit/ug/spru580g/spru580g.pdf

  • 我可能没说清楚,我想要的是这种波形输出

  • 但实际是这种波形,SS在每字完之后就会拉高一下,如图上红色的标注

  • 你要的时钟连续,mcbsp是实现不了的。

    McBSP配成clock stop mode来实现SPI协议,clock stop mode就是时钟停止模式。

  • 就像时钟可以停止,但是SS信号(在MCBSB中是FSX信号)连续的就行,

    我看的MCBSP的数据手册中有这种波形配置方式如下 图,我是从数据手册27页截图出来的,我要配置成SPI模式

  • 27页的截图是mcbsp作为普通的同步串口,SPI模式输出不了这样的波形。

    你要2个8bit之间的ss连续的话,把element设成16bit。

  • 标准的SPI时序就是图中下面这个,有的SPI接口支持的force模式可以实现图中上面的SS信号,但是这个McBSP的clock stop mode实现的SPI不能输出这种波形。

  • 我从网上查《使用C6000上McBSP实现SPI接口的方法研究》中介绍的好像是可以实现这种spi模式,下面是截图,截图中上半部分是实现的时序,下面是程序

  • 可是上面的图是根据SPI flash/EEPROM画出来的,不是测出来的。而且实际上SPI flash不要求CS一定要连续。

    而McBSP是不能产生这种连接的CS的。

    Figure 51 is the timing diagram when CLKSTP = 11b. Data transfer begins before the transition of the

    serial clock. Therefore, the transition of the slave enable signal FSX/SS from high to low, instead of the
    transition of the serial clock, marks the beginning of transfer in this SPI transfer format. In SPI master
    mode, as well as SPI slave mode, the McBSP requires an FSX/SS edge for each transfer. This means the
    FSX/SS signal must toggle for each word. The McBSP clock stop mode requires single-phase frames
    ((R/X)PHASE = 0) and one element per frame ((R/X)FRLEN = 0).

  • 6455外设时钟是怎么设置,我在pll文档中没有找到相应说明,比如mcsbp  我在mcbsp的文档中找到一句话是说:mcbsp的时钟输入是

    • · CPU/4 clock for C64x DSP
    但是I2CDE 时钟输入时CPU的多少分频是固定的吗?所有外设时钟输入都是固定的吗?

    pllDiv4    PLL的文档值说明了分频系数怎么设,并没有说 PLLDIVn对应哪个外设

  • McBSP是1/6 CPU clock。在user guide上有说明。
     
    The C645x DSP uses the CPU/6 clock as the internal clock source to the sample rate

    generator.

  • I2C也是1/6 CPU clock, 和mcbsp都是用SYSCLK3。见数据手册第133页的PLL说明。

    SYSCLK3 clocks the PCI, HPI, UTOPIA, McBSP, GPIO, TIMER, and I2C peripherals, as well as the
    configuration bus of the PLL2 Controller.

    http://www.ti.com/lit/ds/symlink/tms320c6455.pdf 

  • 在mcbsp 技术手册中有这样一段话,我用的是6455,说是CPU的1/4.我想知道 这个CPU 是系统时钟吗?我用的50Mhz倍频20倍到1Ghz。

    但是在实际应用中我测得 CLKX的输出时钟,是 经过系统时钟的1/36  分频出来的(好像是经过两次6倍分频)。也就是说   在MCBSP中SRGR 寄存器中的CLKGDV 设置为0x1a(26)正好得到的是CLKX的输出时钟是1Mhz。  1000MHZ  ÷ 36 ÷26 ≈1Mhz

  • 前面说了是1/6的CPU clock。

    CPU clock是1GHz

    clkx时钟如果选择由SRG产生的话,应该是1000MHz/6/(1+26)=6.4MHz左右。

  • CLKX0  但是我量出来的时钟确实是1MHZ左右。下面是我的初始化代码

    我特意在主函数里读了一下CPU倍频值, PLL1_PLLM      值为0x13 (20x)

    #define PLL1_PLLM      ( *(int*)(0x029A0110))


    SPCR0 = SPCR0 & 0xFFFEFFFE;
    c = SPCR0;

    a = RCR0;

    PCR0 = 0x00000b0e;           //0x00000b0c; //CLKXP =1
    SRGR0= 0x2000001a;        //                 f=CPUCLK/166; a6

    RCR0 = 0x00010080;          //RDATDLY=1 //24 bit
    XCR0 = 0x00010080;          //XDATDLY=1

    SPCR0 = (SPCR0 | 0x00001000) & 0xFFFFF7FF;                     //CLKSTP BIT12=1,BIT11=0 CLKSTP=10

    for(i=0;i<2048;i++);
    SPCR0 = SPCR0 | 0x400000;
    for(i=0;i<2048;i++);
    SPCR0 = SPCR0 | 0x10001;

    /*

    #define DRR0 ( *(int*)(0x028C0000))//McBSP0 Data Receive Register via Configuration Bus
    #define DXR0 ( *(int*)(0x028C0004))//McBSP0 Data Transmit Register via Configuration Bus
    #define SPCR0 ( *(int*)(0x028C0008))//McBSP0 Serial Port Control Register
    #define RCR0 ( *(int*)(0x028C000C))//McBSP0 Receive Control Register
    #define XCR0 ( *(int*)(0x028C0010))//McBSP0 Transmit Control Register
    #define SRGR0 ( *(int*)(0x028C0014))//McBSP0 Sample Rate Generator register
    #define MCR0 ( *(int*)(0x028C0018))//McBSP0 Multichannel Control Register
    #define RCERE00 ( *(int*)(0x028C001C))//McBSP0 Enhanced Receive Channel Enable
    #define XCERE00 ( *(int*)(0x028C0020))//McBSP0 Enhanced Transmit Channel Enable
    #define RCERE10 ( *(int*)(0x028C0028))//McBSP0 Enhanced Receive Channel Enable
    #define XCERE10 ( *(int*)(0x028C002C))//McBSP0 Enhanced Transmit Channel Enable
    #define RCERE20 ( *(int*)(0x028C0030))//McBSP0 Enhanced Receive Channel Enable
    #define XCERE20 ( *(int*)(0x028C0034))//McBSP0 Enhanced Transmit Channel Enable
    #define RCERE30 ( *(int*)(0x028C0038))//McBSP0 Enhanced Receive Channel Enable
    #define XCERE30 ( *(int*)(0x028C003C))//McBSP0 Enhanced Transmit Channel Enable
    #define PCR0 ( *(int*)(0x028C0024))//McBSP0 Pin Control Register

  • C6455是C64+ 的核的DSP,不是C64x的。

  • 我吧mcbsp作为普通单通道串口 也是得不到上面的波形呢,发送的时候FSX每次还是有一个一个高电平

  • dajia li 说:
    我吧mcbsp作为普通单通道串口 也是得不到上面的波形呢,发送的时候FSX每次还是有一个一个高电平

    前面不是讨论过了McBSP做为SPI,只能是一个同步(CS)一个数据,不能在数据之间保持CS为低了吗?

    也说了SPI EEPROM手册中的图对这个SPI_CS在数据之间保持为低不是必须的。

    你所观察到的是正确的,也只能得到这样的波形。