// TI File $Revision: /main/1 $ // Checkin $Date: August 18, 2006 13:46:44 $ //########################################################################### // // FILE: DSP2833x_Spi.c // // TITLE: DSP2833x SPI Initialization & Support Functions. // //########################################################################### // $TI Release: DSP2833x/DSP2823x C/C++ Header Files V1.31 $ // $Release Date: August 4, 2009 $ //########################################################################### #include "DSP2833x_Device.h" // DSP2833x Headerfile Include File #include "DSP2833x_Examples.h" // DSP2833x Examples Include File #include "GlobalDef.h" #define LEN_SPIDATA 32 int Rcvbuf[LEN_SPIDATA]; unsigned int test; unsigned char RcvDataBuf[32], SndDataBuf[LEN_SPIDATA] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}; unsigned char TempDataBuf[9]; static unsigned int m_ucDataNum = LEN_SPIDATA, m_ucDataPart = 0; //--------------------------------------------------------------------------- // Example: InitSpiGpio: //--------------------------------------------------------------------------- // This function initializes GPIO pins to function as SPI pins // // Each GPIO pin can be configured as a GPIO pin or up to 3 different // peripheral functional pins. By default all pins come up as GPIO // inputs after reset. // // Caution: // For each SPI peripheral // Only one GPIO pin should be enabled for SPISOMO operation. // Only one GPIO pin should be enabled for SPISOMI operation. // Only one GPIO pin should be enabled for SPICLKA operation. // Only one GPIO pin should be enabled for SPISTEA operation. // Comment out other unwanted lines. void InitSpiGpio(void) { InitSpiaGpio(); } void InitSpiaGpio(void) { EALLOW; /* Enable internal pull-up for the selected pins */ // Pull-ups can be enabled or disabled by the user. // This will enable the pullups for the specified pins. // Comment out other unwanted lines. // GpioCtrlRegs.GPAPUD.bit.GPIO16 = 0; // Enable pull-up on GPIO16 (SPISIMOA) // GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0; // Enable pull-up on GPIO17 (SPISOMIA) // GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0; // Enable pull-up on GPIO18 (SPICLKA) // GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0; // Enable pull-up on GPIO19 (SPISTEA) GpioCtrlRegs.GPBPUD.bit.GPIO54 = 0; // Enable pull-up on GPIO54 (SPISIMOA) GpioCtrlRegs.GPBPUD.bit.GPIO55 = 0; // Enable pull-up on GPIO55 (SPISOMIA) GpioCtrlRegs.GPBPUD.bit.GPIO56 = 0; // Enable pull-up on GPIO56 (SPICLKA) GpioCtrlRegs.GPBPUD.bit.GPIO57 = 0; // Enable pull-up on GPIO57 (SPISTEA) /* Set qualification for selected pins to asynch only */ // This will select asynch (no qualification) for the selected pins. // Comment out other unwanted lines. // GpioCtrlRegs.GPAQSEL2.bit.GPIO16 = 3; // Asynch input GPIO16 (SPISIMOA) // GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3; // Asynch input GPIO17 (SPISOMIA) // GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3; // Asynch input GPIO18 (SPICLKA) // GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3; // Asynch input GPIO19 (SPISTEA) GpioCtrlRegs.GPBQSEL2.bit.GPIO54 = 3; // Asynch input GPIO16 (SPISIMOA) GpioCtrlRegs.GPBQSEL2.bit.GPIO55 = 3; // Asynch input GPIO17 (SPISOMIA) GpioCtrlRegs.GPBQSEL2.bit.GPIO56 = 3; // Asynch input GPIO18 (SPICLKA) GpioCtrlRegs.GPBQSEL2.bit.GPIO57 = 3; // Asynch input GPIO19 (SPISTEA) /* Configure SPI-A pins using GPIO regs*/ // This specifies which of the possible GPIO pins will be SPI functional pins. // Comment out other unwanted lines. // GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1; // Configure GPIO16 as SPISIMOA // GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1; // Configure GPIO17 as SPISOMIA // GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1; // Configure GPIO18 as SPICLKA // GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1; // Configure GPIO19 as SPISTEA GpioCtrlRegs.GPBMUX2.bit.GPIO54 = 1; // Configure GPIO54 as SPISIMOA GpioCtrlRegs.GPBMUX2.bit.GPIO55 = 1; // Configure GPIO55 as SPISOMIA GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 1; // Configure GPIO56 as SPICLKA GpioCtrlRegs.GPBMUX2.bit.GPIO57 = 1; // Configure GPIO57 as SPISTEA EDIS; } void InitSpi(void) { SpiaRegs.SPICCR.all = 0x000f; SpiaRegs.SPICTL.all = 0x000e; //master/slaver SpiaRegs.SPIBRR = 0x004f; //波特率 SpiaRegs.SPIFFRX.all = 0x204f; SpiaRegs.SPIFFTX.all = 0xE040; SpiaRegs.SPIFFCT.all = 0x007f; SpiaRegs.SPICCR.bit.SPISWRESET = 1; SpiaRegs.SPIPRI.bit.FREE = 1; } void InitVKINT(void) { EALLOW; // GPIO41作为中断2的入口 GpioCtrlRegs.GPBMUX1.bit.GPIO41 = 0; // Configure GPIO57 as GPIO GpioCtrlRegs.GPBDIR.bit.GPIO41 = 0; // input GpioCtrlRegs.GPBQSEL1.bit.GPIO41= 0; // Synch to SYSCLKOUT GpioCtrlRegs.GPBMUX1.bit.GPIO40 = 0; GpioCtrlRegs.GPBDIR.bit.GPIO40 = 1; //output, VK3224--Reset GpioDataRegs.GPBCLEAR.bit.GPIO40 = 1; delay(0xffff); GpioDataRegs.GPBSET.bit.GPIO40 = 1; GpioIntRegs.GPIOXINT3SEL.bit.GPIOSEL = 41; // 中断3选择GPIO41 EDIS; XIntruptRegs.XINT3CR.bit.POLARITY = 0; // 触发模式为下降沿触发 XIntruptRegs.XINT3CR.bit.ENABLE = 1; // 使能中断 } unsigned char send(unsigned char data1,unsigned char data2) { unsigned int temp1, i; unsigned char temp2; temp1 = data1 * 256 + data2; SpiaRegs.SPITXBUF=temp1; while(SpiaRegs.SPIFFRX.bit.RXFFST <= 0); temp2 = SpiaRegs.SPIRXBUF & 0xff; return temp2; } unsigned char write_reg(unsigned char port,unsigned char reg,unsigned char data) { return send(0x60+port*32+reg*2,data); } //写寄存器,port为子串口的路数,reg为寄存器的地址,dat为写入寄存器的数据 //************************************************************************* //************************************************************************* unsigned char read_reg(unsigned char port,unsigned char reg) { return send(((port-1)<<5)+(reg<<1),0x00); } //读寄存器,port为子串口的路数,reg为寄存器的地址,返回寄存器的值 //*************************************************************************** void InitVK3224(void) { unsigned int data; write_reg(1, GIR, 0xf0); //使能子串口中断 write_reg(1, SCTLR, 0x18); //使能子串口,设置子串口的波特率,具体参看数据手册中,子串口波特率设置 write_reg(1, SFOCR, 0x3f); //子串口FIFO设置 write_reg(1, SIER, 0x01); //子串口中断控制,使能发送、接收FIFO触点中断 } void delay(unsigned int delaydata) { unsigned int tempdata = delaydata; while(tempdata) { tempdata = tempdata - 1; } } void ProcSpi(void) //主程序发送数据 { unsigned char temp; while( SpiaRegs.SPIFFTX.bit.TXFFST < 10 && m_ucDataPart < m_ucDataNum) { write_reg(1, SFDR, SndDataBuf[m_ucDataPart++]); if(m_ucDataPart >= m_ucDataNum) { m_ucDataPart = 0; } } } interrupt void XINT3_VK3224(void) //芯片VK3224接收中断处理程序 { unsigned int i, j; unsigned char Flag_ISR, Flag_TS, temp, temp1, temp2, temp3, TEMP1, TEMP2, TEMP3; TEMP1 = read_reg(1, GIR); TEMP2 = read_reg(1, GIR); temp1 = TEMP1 & 0x01; temp2 = TEMP2 & 0x01; if(temp2 == temp1) { Flag_ISR = temp2; } else { TEMP3 = read_reg(1, GIR); temp3 = TEMP3 & 0x01; if(temp3 == temp1) Flag_ISR = temp1; else if(temp3 == temp2) Flag_ISR = temp2; else Flag_ISR = temp3; } if(Flag_ISR) { Flag_TS = read_reg(1, SIFR) & 0x01; switch(Flag_TS) { case 1: for(i = 0; i <= 13; i++) RcvDataBuf[i] = read_reg(1, SFDR) & 0xff; break; default: break; } } else { temp = read_reg(1, GIR) & 0x01; for(i = 0; i <= 13; i++) { RcvDataBuf[i] = read_reg(1, SFDR) & 0xff; } } PieCtrlRegs.PIEACK.all = PIEACK_GROUP12; } //=========================================================================== // End of file. //===========================================================================