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);
}

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

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DSP28335SPI收发配置可以通过以下代码实现: ```c void SPI_Init() { SpiaRegs.SPICCR.all = 0x0007; // Reset off, rising edge, 8-bit char bits SpiaRegs.SPICTL.all = 0x000e; // Enable master mode, delayed phase, enable talk, SPI int disabled SpiaRegs.SPIBRR = 0x0063; // 波特率设置为375000 SpiaRegs.SPISTS.all = 0x0000; // 清标志 SpiaRegs.SPICCR.all = 0x0087; // Relinquish SPI from Reset SpiaRegs.SPIPRI.bit.FREE = 0x0001; // Transmission not affected by emulator SpiaRegs.SPICCR.bit.SPISWRESET = 1; // SPI软复位 } ``` 这段代码配置了DSP28335McBspSPI接口,并通过DMA实现数据的收发操作。具体配置了SPI控制器的相关寄存器,包括控制寄存器(`SPICCR`)、控制寄存器(`SPICTL`)、波特率分频寄存器(`SPIBRR`)和状态寄存器(`SPISTS`)。其中,控制寄存器和状态寄存器的设置主要是根据需求进行配置。SPI的波特率设置为375000。 需要注意的是,虽然SPI配置为8位收发,但是DSP的收发数据为16位,且在发送数据时高位有效,在接收数据时低位有效。因此,在使用SPI进行数据收发时,需要根据芯片的要求进行相应的位操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [DSP28335McBsp配置为SPI接口的DMA的收发配置程序.docx](https://download.csdn.net/download/u010457177/12846223)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [DSP28335spi的配置------mcbsp配置&自带的spi配置](https://blog.csdn.net/kunkliu/article/details/114136552)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值