📄 spi.c
字号:
SPI_Port_Init(0); // Slave (nSS)
Uart_Printf("[SPI DMA1 Slave Tx test]\n");
Uart_Printf("This test should be configured two boards\nStart Tx first.\n");
tx_ptr=(U8 *) SPI_BUFFER;
for(i=0; i<spi_count; i++)
*(tx_ptr+i)=i;
tx_dma1Done=0;
pISR_DMA1 = (unsigned)Dma1Tx_Int;
rINTMSK=~(BIT_DMA1);
//Step1. SPI init
rSPPRE0=0x0; //if PCLK=50Mhz,SPICLK=25Mhz
rSPCON0=(2<<5)|(0<<4)|(0<<3)|(1<<2)|(0<<1)|(0<<0);//DMA1,dis-SCK,slave,low,A,normal
// rSPCON0=(2<<5)|(0<<4)|(0<<3)|(1<<2)|(1<<1)|(0<<0);//DMA1,dis-SCK,slave,low,B,normal
rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
//Step2. DMA1 init
rDISRC1=(unsigned)tx_ptr; //Address of Memory
rDISRCC1=(0<<1)|(0); //AHB(Memory), inc
rDIDST1=(unsigned)0x59000010;//Address of SPTDAT Register
rDIDSTC1=(1<<1)|(1); //APB(SPI), fix
rDCON1=(1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(3<<24)|(1<<23)|(1<<22)|(0<<20)|(spi_count);
//handshake, sync PCLK, TC int, single tx, single service, SPI, H/W request,
//off-reload, byte, 128Bytes
rDMASKTRIG1=(0<<2)|(1<<1)|(0); //run, DMA1 channel on, no-sw trigger
while(tx_dma1Done==0);
while(!(rSPSTA0&0x1)); // Tx is done
rSPCON0=(0<<5)|(0<<4)|(0<<3)|(1<<2)|(0<<1)|(0<<0);//poll,dis-SCK,slave,low,A,normal
// rSPCON0=(0<<5)|(0<<4)|(0<<3)|(1<<2)|(1<<1)|(0<<0);//poll,dis-SCK,slave,low,B,normal
Uart_Printf("\nDMA1 transfer end\n");
for(i=0; i<spi_count; i++)
Uart_Printf("0x%02x,",*tx_ptr++);
SPI_Port_Return();
}
void Test_Spi_M_Int(void)
{
char *rxStr,*txStr;
SPI_Port_Init(1); // Master
Uart_Printf("[SPI Interrupt Master Rx test]\n");
Uart_Printf("This test should be configured two boards\nStart Tx first.\n");
pISR_SPI0=(unsigned)Spi_Int;
endSpiTx=0;
spiTxStr="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
spiRxStr=(char *) SPI_BUFFER;
txStr=(char *)spiTxStr;
rxStr=(char *)spiRxStr;
rSPPRE0=0x1; //if PCLK=50Mhz,SPICLK=12.5Mhz
rSPCON0=(1<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//int,en-SCK,master,low,A,normal
// rSPCON0=(1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(0<<0);//int,en-SCK,master,low,B,normal
rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
rGPGDAT&=0xfffffffb; // Activate nSS
rINTMSK=~(BIT_SPI0);
while(endSpiTx==0);
rGPGDAT|=0x4; // Deactivate nSS
rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
// rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(1<<1)|(0<<0);//Poll,dis-SCK,master,low,B,normal
*spiRxStr='\0';//attach End of String(Null)
Uart_Printf("Tx Strings:%s\n",txStr);
Uart_Printf("Rx Strings:%s :",rxStr+1);//remove first dummy data
if(strcmp((rxStr+1),txStr)==0)
Uart_Printf("O.K.\n");
else
Uart_Printf("ERROR!!!\n");
SPI_Port_Return();
}
void Test_Spi_S_Int(void)
{
char *rxStr,*txStr;
SPI_Port_Init(0); // Slave (nSS)
Uart_Printf("[SPI Interrupt Slave Tx test]\n");
Uart_Printf("This test should be configured two boards\nStart Tx first.\n");
pISR_SPI0=(unsigned)Spi_Int;
endSpiTx=0;
spiTxStr="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
spiRxStr=(char *) SPI_BUFFER;
txStr=(char *)spiTxStr;
rxStr=(char *)spiRxStr;
rSPPRE0=0x0; //if PCLK=50Mhz,SPICLK=25Mhz
rSPCON0=(1<<5)|(0<<4)|(0<<3)|(1<<2)|(0<<1)|(0<<0);//int,dis-SCK,slave,low,A,normal
// rSPCON0=(1<<5)|(0<<4)|(0<<3)|(1<<2)|(1<<1)|(0<<0);//int,dis-SCK,slave,low,B,normal
rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
rINTMSK=~(BIT_SPI0);
while(endSpiTx==0);
rSPCON0=(0<<5)|(0<<4)|(0<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
// rSPCON0=(0<<5)|(0<<4)|(0<<3)|(1<<2)|(1<<1)|(0<<0);//Poll,dis-SCK,master,low,B,normal
*spiRxStr='\0';//attach End of String(Null)
Uart_Printf("Tx Strings:%s\n",txStr);
Uart_Printf("Rx Strings:%s :",rxStr+1);//remove first dummy data
if(strcmp((rxStr+1),txStr)==0)
Uart_Printf("O.K.\n");
else
Uart_Printf("ERROR!!!\n");
SPI_Port_Return();
}
/*
void __irq Spi_S_Tx_Int(void)
{
unsigned int status;
ClearPending(BIT_SPI0);
status=rSPSTA0;
if(rSPSTA0&0x6)
Uart_Printf("Data Collision or Multi Master Error(0x%x)!!!\n", status);
while(!(status&0x1)); //Check ready state
*spiRxStr++=rSPRDAT0; //First Rx data is garbage data
if(*spiTxStr!='\0')
rSPTDAT0=*spiTxStr++;
else
{
rINTMSK|=BIT_SPI0;
endSpiTx=1;
}
}
*/
/*
void Test_SPImaRX_POLL(void)
{
int i, poll_end=0;
unsigned int save_E,save_G;
unsigned char *rx_ptr;
save_E=rPECON;
save_G=rPGCON;
rPECON |= 0xc;
rPGCON = (rPGCON&0x3fff)|0xa8000;
Uart_Printf("[SPI POLL Master Rx Test]\n");
Uart_Printf("This test should be configured two boards\nStart Tx first.\n");
rx_ptr=(unsigned char *)0xd000000;
for(i=0;i<0x500;i++)
*(rx_ptr+i)=0x0;
//Step3. SPI init
rSPCON=(0<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(1<<0);//poll,en-pre,master,low,B,TAGD
rSPPRE=0x0; //if PCLK=50Mhz,SPICLK=25Mhz
rSPPIN=(0<<2)|(0<<1)|(0<<0);//dis-ENMUL,select,release
//Step5 ~ 9. wait Rx end
while(poll_end==0)
{
if((rSPSTA&0x1))
{
*rx_ptr++=rSPRDAT;
if((int)rx_ptr==0xd000080)
poll_end=1;
}
}
rSPPIN=0x2;//deselect
//Step 10~11
rSPCON=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(1<<1)|(0<<0);//poll,dis-pre,master,low,B,normal
while(!(rSPSTA&0x1));//wait ready state
*rx_ptr=rSPRDAT;//read the last data
rx_ptr=(unsigned char *)0xd000001;
for(i=0;i<0x80;i++)
Uart_Printf("0x%02x,",*rx_ptr++);
Uart_Printf("\nPOLL receive end");
rPECON=save_E;
rPGCON=save_G;
}
*/
//////////////////////////////////////////////////
// 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(1); // 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
cs_low();
rSPCON1 |= (1<<4); //dis-SCK
}
for(j=0; j<0x100; j++);
}
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)
{
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=67.5Mhz,SPICLK=16.875Mhz
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
Tcon_Init(0x8);
Delay(150);
rSPCON1 &= ~(1<<4); //dis-SCK
SPI_Port_Return();
}
///////////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -