Hi,我打算在SPI的LoopBack例程的基础上修改得到一个28388与SPIDAC芯片通信的程序,但遇到了一些问题,配置完后SPIA和SIMO两个管脚均没有输出。
下面是我程序的一些配置,程序利用了定时器中断,在每一秒的定时器中断中通过SPI输出一个固定的数。
void main(void)
{
InitSysCtrl();
InitGpio();
init_SPI_A();
init_SPI_GPIO();
DINT; // Disable CPU interrupts
InitPieCtrl(); // Initialize the PIE control registers to their default state.
IER = 0x0000; // Disable CPU interrupts and clear all CPU interrupt flags
IFR = 0x0000;
InitPieVectTable(); // Initialize the PIE vector table with pointers to the shell Interrupt
EALLOW;
PieVectTable.TIMER0_INT = &cpuTimer0ISR; // Map ISR functions
EDIS;
InitCpuTimers(); // Initialize the Device Peripheral. For this example, only initialize the Cpu Timers.
ConfigCpuTimer(&CpuTimer0, 200, 1000000); // Configure CPU-Timer 0: 200MHz CPU Freq, 1 second Period (in uSeconds)
//
// To ensure precise timing, use write-only instructions to write to the
// entire register. Therefore, if any of the configuration bits are changed
// in ConfigCpuTimer and InitCpuTimers, the below settings must also be
// be updated.
//
CpuTimer0Regs.TCR.all = 0x4000;
IER |= M_INT1; // Enable CPU int1 which is connected to CPU-Timer 0
PieCtrlRegs.PIEIER1.bit.INTx7 = 1; // Enable TINT0 in the PIE: Group 1 interrupt 7
EINT; // Enable global Interrupts
ERTM; //Enable higher priority real-time debug events
while(1);
}
__interrupt void cpuTimer0ISR(void)
{
CpuTimer0.InterruptCount++;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Acknowledge this interrupt to receive more interrupts from group 1
DacOutData(0xaaaa);
}
void DacOutData(uint16_t data)
{
SpiaRegs.SPITXBUF = (data);
(void)SpiaRegs.SPIRXBUF;
SpiaRegs.SPITXBUF = (data<<8);
(void)SpiaRegs.SPIRXBUF;
}
void init_SPI_GPIO(void)
{
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO16=0; //Enables the Pull-up Resister
GpioCtrlRegs.GPAGMUX2.bit.GPIO16=0; //configure GPIO16 as SPIASIMO
GpioCtrlRegs.GPAMUX2.bit.GPIO16=1;
GpioCtrlRegs.GPAPUD.bit.GPIO17=0;
GpioCtrlRegs.GPAGMUX2.bit.GPIO17=0;
GpioCtrlRegs.GPAMUX2.bit.GPIO17=1; //configure GPIO17 as SPIASOMI
GpioCtrlRegs.GPAPUD.bit.GPIO18=0;
GpioCtrlRegs.GPAGMUX2.bit.GPIO18=0;
GpioCtrlRegs.GPAMUX2.bit.GPIO18=1; //configure GPIO18 as SPISCK
GpioCtrlRegs.GPBPUD.bit.GPIO35=0;
GpioCtrlRegs.GPBGMUX1.bit.GPIO35=0; //configure GPIO35 as GPIO (signal /LOAD)
GpioCtrlRegs.GPBMUX1.bit.GPIO35=0;
GpioCtrlRegs.GPBDIR.bit.GPIO35 = 1;
GpioCtrlRegs.GPBPUD.bit.GPIO37=0;
GpioCtrlRegs.GPBGMUX1.bit.GPIO37=0; //configure GPIO37 as GPIO (signal /FRE)
GpioCtrlRegs.GPBMUX1.bit.GPIO37=0;
GpioCtrlRegs.GPBDIR.bit.GPIO37 = 1;
GpioDataRegs.GPBSET.bit.GPIO37 = 1; //Pull up /FRE
GpioCtrlRegs.GPBPUD.bit.GPIO60=0;
GpioCtrlRegs.GPBGMUX2.bit.GPIO60=0; //configure GPIO60 as GPIO (signal FS)
GpioCtrlRegs.GPBMUX2.bit.GPIO60=0;
GpioCtrlRegs.GPBDIR.bit.GPIO60 = 1;
EDIS;
}
// SPI moduleA initialization
void init_SPI_A(void)
{
EALLOW;
DevCfgRegs.CPUSEL6.bit.SPI_A = 0; //Connect SPIA to CPU1,The code generation will default SPIA to CPU2 and fail to initialize.More information See 28388 UserGuide Page 424
CpuSysRegs.PCLKCR8.bit.SPI_A = 1;
EDIS;
EALLOW;
//InitSysCtrl();
SpiaRegs.SPIFFTX.all = 0xE040; //FIFO
SpiaRegs.SPIFFCT.all = 0x0;
SpiaRegs.SPICCR.bit.SPISWRESET=0;
SpiaRegs.SPICTL.bit.MASTER_SLAVE=1; //Master Mode
SpiaRegs.SPICCR.bit.CLKPOLARITY=0;
SpiaRegs.SPICTL.bit.CLK_PHASE=0;
SpiaRegs.SPICCR.bit.SPICHAR=7; //16 bit SPI
SpiaRegs.SPIBRR.bit.SPI_BIT_RATE=0x7f; //Set baud Rate
SpiaRegs.SPICTL.bit.TALK=1; //Enable transmit
SpiaRegs.SPIPRI.bit.FREE=1;
SpiaRegs.SPICCR.bit.SPISWRESET=1;
EDIS;
}
调试中,定时器中断能正常触发,我不确定我代码的配置哪一块出了问题
