DSP28335 Mcbsp SPI实现软件片选

思路是把FSX(片选)引脚设置为GPIO脚,控制输出
具体代码如下
管脚初始化函数修改如下

InitMcbspbGpio(void)
{
    ……
    GpioCtrlRegs.GPAMUX2.bit.GPIO27 = 0;        // 把GPIO27设为GPIO脚
    GpioCtrlRegs.GPADIR.bit.GPIO27 = 1;         //引脚GPIO27改为GPIO脚,用代码控制输出
    ……
}

McBSP初始化函数修改如下

void init_mcbsp_spi()
{
     // McBSP-A register settings
    McbspbRegs.SPCR2.all=0x0000;         // Reset FS generator, sample rate generator & transmitter
    McbspbRegs.SPCR1.all=0x0000;         // Reset Receiver, Right justify word, Digital loopback dis.
    /*CLKXM bit of PCR :This bit determines whether CLKX is an input signal (McBSP as slave) or an output
    signal (McBSP as master).
    FSXM = 0 Transmit frame synchronization is supplied by an external source via the FSX pin.
    FSXM = 1 Transmit frame synchronization is supplied by the McBSP, as determined by the FSGM bit of SRGR2.*/
    McbspbRegs.PCR.all=0x0F08;           //(CLKXM=CLKRM=FSXM=FSRM= 1, FSXP = 1)
    McbspbRegs.SPCR1.bit.DLB = 0;   //数字回环模式(不开启)
    /*Low inactive state without delay: The McBSP transmits data on the rising edge of CLKX and
    receives data on the falling edge of MCLKR.*/
    McbspbRegs.SPCR1.bit.CLKSTP = 2;     // Together with CLKXP/CLKRP determines clocking scheme
    McbspbRegs.PCR.bit.CLKXP = 1;        // CPOL = 0, CPHA = 0 rising edge no delay
    McbspbRegs.PCR.bit.CLKRP = 0;
    McbspbRegs.RCR2.bit.RDATDLY = 01;      // FSX setup time 1 in master mode. 0 for slave mode (Receive)
    McbspbRegs.XCR2.bit.XDATDLY = 01;      // FSX setup time 1 in master mode. 0 for slave mode (Transmit)
    /*You must use a transmit frame length of 1 serial word (XCR1.XFRLEN1 = 0).
     * You must use a receive frame length of 1 serial word (RCR1.RFRLEN1 = 0).
     * You must use a single-phase transmit frame (XCR2.XPHASE = 0).
     * You must use a single-phase receive frame (RCR2.RPHASE = 0).*/

    //McbspbRegs.SRGR2.bit.FPER = 1;
    if(data_size == 8)             // Run a loopback test in 8-bit mode
    {
        McbspbRegs.RCR1.bit.RWDLEN1=0;     // 8-bit word
        McbspbRegs.XCR1.bit.XWDLEN1=0;     // 8-bit word
    }
    if(data_size == 16)            // Run a loopback test in 16-bit mode
    {
        McbspbRegs.RCR1.bit.RWDLEN1=2;      // 16-bit word
        McbspbRegs.XCR1.bit.XWDLEN1=2;      // 16-bit word
    }
    if(data_size == 32)            // Run a loopback test in 32-bit mode
    {
        McbspbRegs.RCR1.bit.RWDLEN1=5;     // 32-bit word
        McbspbRegs.XCR1.bit.XWDLEN1=5;     // 32-bit word
    }
    /*PCR.SCLKME = 0, SRGR.CLKSM = 1,Input Clock For Sample Rate Generator = LSPCLK
     * CLKG frequency = (Input clock frequency)/ (CLKGDV + 1)*/
    McbspbRegs.SRGR2.all=0x2000;         // CLKSM=1, FPER = 1 CLKG periodR
    McbspbRegs.SRGR1.all= 0x0004;        // Frame Width = 1 CLKG period, CLKGDV=16

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

    GpioDataRegs.GPASET.bit.GPIO27 = 1; //把FSX(CS)片选引脚拉高,空闲时片选都拉高
}

调用函数如下

void Example(void)   
{
    GpioDataRegs.GPATOGGLE.bit.GPIO27 = 1;

    mcbsp_xmit(0xB0);   //命令码
    mcbsp_xmit(0x83);   //操作码

    GpioDataRegs.GPATOGGLE.bit.GPIO27 = 1;

    DELAY_US(1);
}

楼主是在配置编码器时用到这个功能,希望能帮到大家。

猜你喜欢

转载自blog.csdn.net/qianshishangdi/article/details/82147191