DSP

DSP28335 Mcbsp SPI实现软件片选

2019-07-13 11:17发布

class="markdown_views prism-atom-one-light"> 思路是把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); } 楼主是在配置编码器时用到这个功能,希望能帮到大家。