📄 spi.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 + -