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.

TMS320F28388D: 无法对SpiaRegs赋值

Part Number: TMS320F28388D
Other Parts Discussed in Thread: C2000WARE

你好,我在调试的时候发现我写的初始化程序无法对SPI寄存器赋值,但GPIO的寄存器却可以正常写入。使用的开发板是28388CotrolCARD,附上我的初始化程序代码。非常感谢您能为我提供一些思路!


#include "f2838x_device.h"
#include "f2838x_examples.h"
#include "f2838x_globalprototypes.h"
#include "rtwtypes.h"

#define Fs_Set GpioDataRegs.GPBSET.bit.GPIO35 = 1 //FS Pin
#define Fs_Clr GpioDataRegs.GPBCLEAR.bit.GPIO35 = 1
#define Load_Set GpioDataRegs.GPBSET.bit.GPIO37 = 1 //Load Pin
#define Load_Clr GpioDataRegs.GPBCLEAR.bit.GPIO37 = 1

void init_SPI_GPIO(void) //GPIO Configuration Spia:GPIO16,17,18
{
EALLOW;
GpioCtrlRegs.GPAGMUX2.bit.GPIO16=0; //configure GPIO16 as SPIASIMO
GpioCtrlRegs.GPAMUX2.bit.GPIO16=1;

GpioCtrlRegs.GPAGMUX2.bit.GPIO17=0; //configure GPIO17 as SPIASOMI
GpioCtrlRegs.GPAMUX2.bit.GPIO17=1;

GpioCtrlRegs.GPAGMUX2.bit.GPIO18=0; //configure GPIO18 as SPISCK
GpioCtrlRegs.GPAMUX2.bit.GPIO18=1;

GpioCtrlRegs.GPBGMUX1.bit.GPIO35=0; //configure GPIO35 as GPIO(siganl FS)
GpioCtrlRegs.GPBMUX1.bit.GPIO35=0;

GpioCtrlRegs.GPBGMUX1.bit.GPIO37=0; //configure GPIO37 as GPIO(signal LOAD)
GpioCtrlRegs.GPBMUX1.bit.GPIO37=0;
EDIS;
}

void init_SPI_A(void)
{
EALLOW;
SpiaRegs.SPICCR.bit.SPISWRESET=0;

SpiaRegs.SPICTL.bit.MASTER_SLAVE=1; //Master Mode
SpiaRegs.SPICCR.bit.CLKPOLARITY=1;
SpiaRegs.SPICTL.bit.CLK_PHASE=0;
SpiaRegs.SPICCR.bit.SPICHAR=15; //16bit SPI
SpiaRegs.SPIBRR.bit.SPI_BIT_RATE=39; //Set baud Rate

SpiaRegs.SPICTL.bit.TALK=1; //Enable transmit
SpiaRegs.SPIPRI.bit.FREE=1;

SpiaRegs.SPICCR.bit.SPISWRESET=1;
EDIS;
}

  • 你好,是单步运行还是连续运行的情况下没有写入寄存器?

    有没有看过程序有没有运行到初始化代码中?

  • 程序能进入初始化代码,单步运行与连续运行在watch window中寄存器对应bit的值都没有发生变化

  • 此外,我还运行了C2000Ware中spi_ex5_external_loopback程序,调试例程时可以正常写入,由于例程是库函数的开发形式,我将ex5例程的一部分进行修改移植到我的程序中,在watch window中寄存器的数值也没有发生变化。移植后的程序如下:

    另外的话我的这一部分代码是作为SimulinkC2000代码生成的外接初始化程序。

    #include "driverlib.h"
    #include "device.h"
    #include "f2838x_device.h"
    //#include "f2838x_examples.h"
    //#include "f2838x_globalprototypes.h"
    #include "rtwtypes.h"
    
    
    void init_SPI_GPIO(void)   					//GPIO Configuration Spia:GPIO16,17,18
    {
    	EALLOW;
    	GpioCtrlRegs.GPAGMUX2.bit.GPIO16=0;         //configure GPIO16 as SPIASIMO
    	GpioCtrlRegs.GPAMUX2.bit.GPIO16=1;
    
    	GpioCtrlRegs.GPAGMUX2.bit.GPIO17=0;			//configure GPIO17 as SPIASOMI
    	GpioCtrlRegs.GPAMUX2.bit.GPIO17=1;
    	
    	GpioCtrlRegs.GPAGMUX2.bit.GPIO18=0;			//configure GPIO18 as SPISCK
    	GpioCtrlRegs.GPAMUX2.bit.GPIO18=1;
    	
    	GpioCtrlRegs.GPBGMUX1.bit.GPIO35=0;          //configure GPIO35 as GPIO(siganl FS)
    	GpioCtrlRegs.GPBMUX1.bit.GPIO35=0;
    	
    	GpioCtrlRegs.GPBGMUX1.bit.GPIO37=0;          //configure GPIO37 as GPIO(signal LOAD)
    	GpioCtrlRegs.GPBMUX1.bit.GPIO37=0;
    	EDIS;
    }
    
    void init_SPI_A(void)
    {
    /*	
    	EALLOW;
    	SpiaRegs.SPICCR.bit.SPISWRESET=0;
    	
    	SpiaRegs.SPICTL.bit.MASTER_SLAVE=1;              //Master Mode
    	SpiaRegs.SPICCR.bit.CLKPOLARITY=1;
    	SpiaRegs.SPICTL.bit.CLK_PHASE=0;
    	SpiaRegs.SPICCR.bit.SPICHAR=15;      	         //16bit SPI
    	SpiaRegs.SPIBRR.bit.SPI_BIT_RATE=39;            //Set baud Rate
    	
    	SpiaRegs.SPICTL.bit.TALK=1;	                     //Enable transmit
    	SpiaRegs.SPIPRI.bit.FREE=1;
    
    	SpiaRegs.SPICCR.bit.SPISWRESET=1;
    	EDIS;
    
    */
        SPI_disableModule(SPIA_BASE);									    // Must put SPI into reset before configuring it
    
        SPI_setConfig(SPIA_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA0,		    // SPI configuration. Use a 500kHz SPICLK and 16-bit word size.
                      SPI_MODE_MASTER, 500000, 16);
    
        SPI_disableLoopback(SPIA_BASE);
        SPI_setEmulationMode(SPIA_BASE, SPI_EMULATION_FREE_RUN);
    
    
        SPI_enableModule(SPIA_BASE);				    // Configuration complete. Enable the module.
    
    }

  • 你看一下程序中有没有使能SPI的时钟?

  • 我的程序中没有使能SPI时钟,但是我看C2000Ware的SPI例程ex5与官方的芯片使用指南(章节37.4.2 Configuring the SPI)都没有提到使能SPI时钟

  • 我在我的初始化程序中对Epwm的寄存器赋值,在watch window中发现也无法正常写入( EPwm1Regs.TBCTL.bit.CTRMODE=2;)。而将该语句放到官方例程ex5的环境中执行可以写入。另外,可否告诉我一下如何使能SPI的时钟,我对这一块并不了解,非常感谢您的帮助!

  • 使能了SPI时钟(增加了一句CpuSysRegs.PCLKCR8.bit.SPI_A = 1;   另外试了下例程ex5中的函数InitsysCtrl();函数,也失败了)但watch window中可以看都SPI_A的对应位已经附上值变1了。

  • 解决了,还得加一句  DevCfgRegs.CPUSEL6.bit.SPI_A = 0;