?? spi.c
字號:
while(rx_dma1Done==0);
rSPCON0=(0<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//poll,dis-SCK,master,low,A,normal
// rSPCON0=(0<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(0<<0);//poll,dis-SCK,master,low,B,normal
while(!rSPSTA0&0x1);
*(rx_ptr+spi_count)=rSPRDAT0;
rx_ptr=(unsigned char *)SPI_BUFFER;
rGPGDAT|=0x4; // Deactivate nSS
for(i=1;i<(spi_count+1);i++)
Uart_Printf("0x%02x,",*(rx_ptr+i));//to remove first dummy data
Uart_Printf("\nDMA1 receive end");
SPI_Port_Return();
}
void Test_Spi_S_Tx_DMA1(void)
{
int i;
unsigned char *tx_ptr;
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 Slave 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
Uart_Printf("Current address :0x%x\n",spiRxStr);
*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 Slave 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
Uart_Printf("Current address :0x%x\n",spiRxStr);
*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();
}
///////////////////////// 2004.05.14 added by junon
static void __irq Eint1(void)
{
U8 ui8ScanCode;
getsFromKBCTL(&ui8ScanCode, 1);
ClearPending(BIT_EINT1);
Uart_Printf("keybd interrupt asserted -> scancode = 0x%x\n", ui8ScanCode);
}
void SPIKBD_Port_Init()
{
spikbd_rGPBCON = rGPBCON;
spikbd_rGPBDAT = rGPBDAT;
spikbd_rGPBUP = rGPBUP;
spikbd_rGPDCON = rGPDCON;
spikbd_rGPDDAT = rGPDDAT;
spikbd_rGPDUP = rGPDUP;
spikbd_rGPFCON = rGPFCON;
spikbd_rGPFDAT = rGPFDAT;
spikbd_rGPFUP = rGPFUP;
spikbd_rGPGCON = rGPGCON;
spikbd_rGPGDAT = rGPGDAT;
spikbd_rGPGUP = rGPGUP;
// Setup IO port for SPI interface & Keyboard
// Setup EINT1 (KBDINT)
rGPFCON &= ~(0x3 << 2); // Clear GPF1
rGPFCON |= (0x2 << 2); // Set GPF1 to EINT1 for Keyboard interrupt
rEXTINT0 &= ~(0x7 << 4); // Clear EINT1
rEXTINT0 |= (0x2 << 4); // fallig edge triggered for EINT1
// setup SPI interface
// GPG5 : SPIMISO (KBDSPIMISO)
// GPG6 : SPIMOSI (KBDSPIMOSI)
// GPG7 : SPICLK (KBDSPICLK)
rGPGCON &= ~((0x3 << 10) | (0x3 << 12) | (0x3 << 14)); // Clear GPG5,6,7
rGPGCON |= ((0x3 << 10) | (0x3 << 12) | (0x3 << 14));
// setup _SS signal(nSS_KBD)
rGPBCON &= ~(0x3 << 12); // Clear GPB6
rGPBCON |= (ONEBIT << 12); // Set Port GPB6 to output for nSS signal
// setup _PWR_OK signal (KEYBOARD)
rGPBCON &= ~(0x3 << 0); // Clear GPB0
rGPBCON |= (ONEBIT << 0); // Set Port GPB0 to output for _PWR_OK signal
rGPDDAT &=~(ONEBIT << 0); // set _PWR_OK to 0
}
void SPIKBD_Port_Return(void)
{
rGPBCON = spikbd_rGPBCON;
rGPBDAT = spikbd_rGPBDAT;
rGPBUP = spikbd_rGPBUP;
rGPDCON = spikbd_rGPDCON;
rGPDDAT = spikbd_rGPDDAT;
rGPDUP = spikbd_rGPDUP;
rGPFCON = spikbd_rGPFCON;
rGPFDAT = spikbd_rGPFDAT;
rGPFUP = spikbd_rGPFUP;
rGPGCON = spikbd_rGPGCON;
rGPGDAT = spikbd_rGPGDAT;
rGPGUP = spikbd_rGPGUP;
}
int putcToKBCTL(U8 c)
{
U32 i;
rGPBDAT &= ~(ONEBIT << 6); //Set _SS signal to low (Slave Select)
while((rSPSTA1 & ONEBIT)==0); // wait while busy
rSPTDAT1 = c; // write left justified data
while((rSPSTA1 & ONEBIT)==0); // wait while busy
rGPBDAT |= (ONEBIT << 6); //Set _SS signal to high (Slave Select)
i = rSPRDAT1;
return(i);
}
void getsFromKBCTL(U8 *m, int cnt)
{
int i, j;
volatile tmp = 1;
for(j = 0; j < 3; j++)
tmp += tmp;
for(j = 0; j < 250 * 30; j++)
tmp += tmp;
for(i = 0; i < cnt; i++)
{
m[i] = putcToKBCTL(0xFF);
for(j = 0; j < 400; j++)
tmp+= tmp;
}
}
void putsToKBCTL(U8 *m, int cnt)
{
int i, j, x;
volatile tmp = 1;
for(j = 0; j < 3; j++)
x = j;
for(j = 0; j < 3; j++)
tmp += tmp;
for(j = 0; j < 250 * 30; j++)
tmp += tmp;
for(i = 0; i < cnt; i++) {
j = putcToKBCTL(m[i]);
for(j = 0; j < 400; j++)
tmp+= tmp;
for(j = 0; j < 400; j++)
x = j;
}
}
char lrc(U8 *buffer, int count)
{
char lrc;
int n;
lrc = buffer[0] ^ buffer[1];
for (n = 2; n < count; n++)
{
lrc ^= buffer[n];
}
if (lrc & 0x80)
lrc ^= 0xC0;
return lrc;
}
int USAR_WriteRegister(int reg, int data)
{
U8 cmd_buffer[4];
cmd_buffer[0] = 0x1b; //USAR_PH_WR;
cmd_buffer[1] = (unsigned char)reg;
cmd_buffer[2] = (unsigned char)data;
cmd_buffer[3] = lrc((U8 *)cmd_buffer,3);
putsToKBCTL((U8 *)cmd_buffer,4);
return TRUE;
}
void Kbd_PowerOn(void)
{
U8 msg[5];
int t;
char dummy = (char)0xff;
SPIKBD_Port_Init();
// Setup SPI registers
// Interrupt mode, prescaler enable, master mode, active high clock, format B, normal mode
rSPCON1 = (ONEBIT<<5)|(ONEBIT<<4)|(ONEBIT<<3)|(0x0<<2)|(ONEBIT<<1);
// Developer MUST change the value of prescaler properly whenever value of PCLK is changed.
rSPPRE1 = 255;// 99.121K = 203M/4/2/(255+1) PCLK=50.75Mhz FCLK=203Mhz SPICLK=99.121Khz
for(t=0;t<20000; t++); // delay
msg[0] = (char)0x1b; msg[1] = (char)0xa0; msg[2] = (char)0x7b; msg[3] = (char)0; // Initialize USAR
for(t=0; t < 10; t++) {
dummy = putcToKBCTL(0xff);
}
for(t=0; t<10; t++) { // wait for a while
putsToKBCTL(msg,3);
for(t=0;t<20000; t++);
}
t = 100;
while(t--) {
if((rGPFDAT & 0x2)==0) { // Read _ATN (KBDINT) GPF1
break;
}
} //check _ATN
if(t != 0) {
getsFromKBCTL(msg,3);
}
t=100000;
while(t--); // delay
msg[0] = (char)0x1b; msg[1] = (char)0xa1; msg[2] = (char)0x7a; msg[3] = (char)0; //Initialization complete
putsToKBCTL(msg,3);
Uart_Printf("KeybdPowerOn\n");
}
void Test_Spikbd_keyscan(void)
{
Uart_Printf("[SPIKBD Test keyscan] start.\n");
Kbd_PowerOn();
rEXTINT0 = (rEXTINT0 & ~(7<<4)) | (2<<4); // falling edge
pISR_EINT1=(U32)Eint1;
rSRCPND = BIT_EINT1;
rINTPND = BIT_EINT1;
rINTMSK=~(BIT_EINT1);
Uart_Getch();
rINTMSK = BIT_ALLMSK;
Uart_Printf("[SPIKBD Test keyscan] end.\n");
SPIKBD_Port_Return();
}
void SPIKBD_Port_Init_IO()
{
spikbd_rGPBCON = rGPBCON;
spikbd_rGPBDAT = rGPBDAT;
spikbd_rGPBUP = rGPBUP;
spikbd_rGPDCON = rGPDCON;
spikbd_rGPDDAT = rGPDDAT;
spikbd_rGPDUP = rGPDUP;
spikbd_rGPFCON = rGPFCON;
spikbd_rGPFDAT = rGPFDAT;
spikbd_rGPFUP = rGPFUP;
spikbd_rGPGCON = rGPGCON;
spikbd_rGPGDAT = rGPGDAT;
spikbd_rGPGUP = rGPGUP;
// Setup IO port for SPI interface & Keyboard
// Setup KBDINT as output
rGPFCON &= ~(0x3 << 2); // Clear GPF1
rGPFCON |= (0x1 << 2); // Set GPF1 to EINT1 for Keyboard interrupt
// setup SPI interface
// GPG5 : SPIMISO (KBDSPIMISO)
// GPG6 : SPIMOSI (KBDSPIMOSI)
// GPG7 : SPICLK (KBDSPICLK)
rGPGCON &= ~((0x3 << 10) | (0x3 << 12) | (0x3 << 14)); // Clear GPG5,6,7
rGPGCON |= ((0x1 << 10) | (0x1 << 12) | (0x1 << 14));
// setup _SS signal(nSS_KBD)
rGPBCON &= ~(0x3 << 12); // Clear GPB6
rGPBCON |= (ONEBIT << 12); // Set Port GPB6 to output for nSS signal
// setup _PWR_OK signal (KEYBOARD)
rGPBCON &= ~(0x3 << 0); // Clear GPB0
rGPBCON |= (ONEBIT << 0); // Set Port GPB0 to output for _PWR_OK signal
}
void Test_Spikbd_IO(void)
{
int i = 0;
Uart_Printf("[SPIKBD IO-Test] start\n");
SPIKBD_Port_Init_IO();
do
{
Uart_Printf("test loop going - %d\n", i);
i++;
if (i%2)
{
rGPFDAT &= ~(1<<1); // GPF1 KBDINT
rGPBDAT &= ~(1<<6); // GPB6
rGPBDAT &= ~(1<<0); // GPB0
rGPGDAT &= ~(7<<5); // GPG5,6,7 (SPIMISO,SPIMOSI,SPICLK)
}
else
{
rGPFDAT |= (1<<1); // GPF1 KBDINT
rGPBDAT |= (1<<6); // GPB6
rGPBDAT |= (1<<0); // GPB0
rGPGDAT |= (7<<5); // GPG5,6,7 (SPIMISO,SPIMOSI,SPICLK)
}
} while(Uart_GetKey() == 0);
Uart_Printf("[SPIKBD IO-Test] end\n");
SPIKBD_Port_Return();
}
//////////////////////////////////
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -