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; }
调试中,定时器中断能正常触发,我不确定我代码的配置哪一块出了问题