⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spi.c

📁 LCD 控制源代码
💻 C
字号:
#include <string.h>
#include "2410addr.h"
#include "2410lib.h"
#include "spi.h"
#include "def.h"

#define spi_count 0x80
#define SPI_BUFFER _NONCACHE_STARTADDRESS

void __irq Spi_Int(void);
//void __irq Spi_M_Rx_Int(void);
//void __irq Spi_S_Tx_Int(void);
void __irq Dma1Tx_Int(void);
void __irq Dma1Rx_Int(void);

volatile char *spiTxStr,*spiRxStr;
volatile int endSpiTx;
volatile int tx_dma1Done;
volatile int rx_dma1Done;
unsigned int spi_rGPECON,spi_rGPEDAT,spi_rGPEUP;
unsigned int spi_rGPGCON,spi_rGPGDAT,spi_rGPGUP;


/****************************************************************
 *	             SMDK2400 SPI configuration                 *
 *  GPG2=nSS0, GPE11=SPIMISO0, GPE12=SPIMOSI0, GPE13=SPICLK0     *
 *  GPG3=nSS1, GPG5 =SPIMISO1, GPG6 =SPIMOSI1, GPG7 =SPICLK1      *
 *  SPI1 is tested by OS(WINCE). So, Only SPI0 is tested by this code          *               
 ****************************************************************/

void SPI_Port_Init(int MASorSLV)
{
    spi_rGPECON=rGPECON;
    spi_rGPEDAT=rGPEDAT;
    spi_rGPEUP=rGPEUP;
    rGPEUP&=~(0x3800);
    rGPEUP|=0x2000;
    rGPECON=((rGPECON&0xf03fffff)|0xa800000);

    spi_rGPGCON=rGPGCON;
    spi_rGPGDAT=rGPGDAT;
    spi_rGPGUP=rGPGUP;
    rGPGUP|=0x4;
    if(MASorSLV==1)
    {
        rGPGCON=((rGPGCON&0xffffffcf)|0x10); // Master(GPIO_Output)
        rGPGDAT|=0x4; // Activate nSS 
    }
    else
    	rGPGCON=((rGPGCON&0xffffffcf)|0x30); // Slave(nSS)
}

void SPI_Port_Return(void)
{
    rGPECON=spi_rGPECON;
    rGPEDAT=spi_rGPEDAT;
    rGPEUP=spi_rGPEUP;

    rGPGCON=spi_rGPGCON;
    rGPGDAT=spi_rGPGDAT;
    rGPGUP=spi_rGPGUP;
}


//////////////////////////////////////////////////
// Depends on the LTV350QV-F02(320x240) TFT LCD //
//////////////////////////////////////////////////
void cs_high(void)
{
	rGPGDAT |= 0x8;
	
}

void cs_low(void)
{
	rGPGDAT &= ~0x8;
}

void n_reset(void)
{

	rGPGDAT &= ~0x4;
	Delay(100);				// 100 us
	rGPGDAT |= 0x4;
    Delay(100);				// 100 us
 
	rGPGDAT &= ~0x4;
	Delay(100);				// 100 us
	rGPGDAT |= 0x4;
}

void spi_tx(unsigned char index, unsigned short data)
{
	int i=0, j; char tmp[6];

	// INDEX
	tmp[0]=0x74;
	tmp[1]=0x0;
	tmp[2]=(unsigned char)index;
	tmp[3]=0x76;
	tmp[4]=(unsigned char)((data&0xff00)>>8);
	tmp[5]=(unsigned char)((data&0x00ff)>>0);
	
	//SEND INDEX
	cs_low();
	for(i=0; i<6; i++) {
		rSPTDAT1=tmp[i];
		while(!(rSPSTA1&0x1)) ;
		if(i==2) {
			cs_high();
			//rSPCON1 &= ~(1<<4);	//dis-SCK
			Delay(5000);
			
			cs_low();
			//rSPCON1 |= (1<<4);	//dis-SCK
		}
	Uart_Printf("rSPTDAT1=0x%x\n",rSPTDAT1);
		
	}

	cs_high();
}


void SPI_LCD_Port_Init(void)
{
    spi_rGPGCON=rGPGCON;
    spi_rGPGDAT=rGPGDAT;
    spi_rGPGUP=rGPGUP;

	rGPGCON=((rGPGCON&0xffffffcf)|0x10); // Master(GPIO_Output)
	rGPGDAT|=0xc;    
    rGPGCON =((rGPGCON&0xffffff0f)|0x50);   //GPG3 CS, GPG2 RESET
}


void Tcon_Init(unsigned short data)
{
//Power On 
    //Delay(5000);
	//n_reset();
	//Delay(5000);
	
    spi_tx(0x07, 0x0000);
                     
    Delay(5000);                 
                     
    spi_tx(0x11, 0x000B);
    spi_tx(0x12, 0x0048);
    spi_tx(0x13, 0x7AFC);
                   
    spi_tx(0x10, 0x300C);
    spi_tx(0x11, 0x222B);
   
    Delay(5000);
                     
    spi_tx(0x12, 0x1968);
                     
    spi_tx(0x01, 0x021D);
    spi_tx(0x02, 0x0300);
    spi_tx(0x03, 0xF000);    //0xF000-- Enable(DE) Mode  0xF040-- WITHOUT Enable(DE) Mode
    spi_tx(0x08, 0x0006);
    spi_tx(0x09, 0x0018);
    spi_tx(0x0B, 0x0700);
                     
    spi_tx(0x0C, 0x0000);
    spi_tx(0x0D, 0x0000);
    spi_tx(0x0E, 0x0000);
    spi_tx(0x14, 0x0000);
    spi_tx(0x15, 0x0000);
    spi_tx(0x16, 0x0000);
    spi_tx(0x30, 0x0300);
    spi_tx(0x31, 0x0007);
    spi_tx(0x32, 0x0202);
    spi_tx(0x33, 0x0000);
    spi_tx(0x34, 0x0704);
    spi_tx(0x35, 0x0204);
    spi_tx(0x36, 0x0707);
    spi_tx(0x37, 0x0000);
    spi_tx(0x38, 0x1803);
    spi_tx(0x39, 0x1402);

 //Display On
    Delay(5000);
    spi_tx(0x07, 0x0001);
    Delay(5000);
    
    spi_tx(0x07, 0x0101);
    Delay(5000);
    
    spi_tx(0x07, 0x0103);
 
}


/*
void Tcon_Init(unsigned short data)
{
	n_reset();
	Delay(150);

	spi_tx(0x09, 0x0000);
	Delay(200);
	spi_tx(0x09, 0x4000);
	spi_tx(0x0a, 0x2000);
	Delay(10);
	spi_tx(0x09, 0x4055);
	Delay(1000);
	spi_tx(0x01, 0x409D);		// Sync Mode
	spi_tx(0x02, 0x0204);
	spi_tx(0x03, 0x0100);
	spi_tx(0x04, 0x3000);
	spi_tx(0x05, 0x4003);
	spi_tx(0x06, data);
	spi_tx(0x07, 0x0018);
	spi_tx(0x08, 0x0C00);
	spi_tx(0x10, 0x0103);
	spi_tx(0x11, 0x0301);
	spi_tx(0x12, 0x1F0F);
	spi_tx(0x13, 0x1F0F);
	spi_tx(0x14, 0x0707);
	spi_tx(0x15, 0x0307);
	spi_tx(0x16, 0x0707);
	spi_tx(0x17, 0x0000);
	spi_tx(0x18, 0x0004);
	spi_tx(0x19, 0x0000);
	Delay(1000);
	spi_tx(0x09, 0x4A55);
	spi_tx(0x05, 0x5003);
}
*/
void Spi_Lcd_Init(void)
{
	int i,j,k;
	char *txStr,*rxStr;
	char tmp[6];

	SPI_LCD_Port_Init(); 
	Uart_Printf("[SPI Polling TFT LCD TCON Initialize]\n");

	endSpiTx=0;

	spiTxStr= tmp+0;
	spiRxStr=(char *) SPI_BUFFER;
	txStr=(char *)spiTxStr;
	rxStr=(char *)spiRxStr;

	rSPPRE1=0x10;	//if PCLK=50Mhz,SPICLK=1.47Mhz
	rSPCON1=(0<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(0<<0);//Polling,en-SCK,master,low,A,normal
	rSPPIN1=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release

     Uart_Printf("111111111111111111\n");
  
	Tcon_Init(0x8);
	Delay(150);
	
	Uart_Printf("2222222222222222222\n");

	rSPCON1 &= ~(1<<4);	//dis-SCK

	SPI_Port_Return();

}
///////////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -