?? spi.c
字號:
#if 0 // Total
void Test_Spi0_Loopback_poll(void)
{
char *txStr,*rxStr;
printf("[SPI Polling Tx/Rx Self-Test]\n");
printf("Connect SPIMOSI 0 into SPIMISO 0.\n");
endSpi0Tx=0;
spi0TxStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; // Tx Data to send
spi0RxStr=(char *) SPI_BUFFER0; // Rx Buffer to receive
txStr=(char *)spi0TxStr;
rxStr=(char *)spi0RxStr;
SPI_Port_Init(CH0_POLL_MSTR_TX);
SPI_Baud_Rate_Set(0, 25000000); // SPI Channel 0, 25MHz
SPI_Ch_Set(CH0_POLL_MSTR_TX, ACTL_A); // Active L, Format A
rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
while(endSpi0Tx==0)
{
if(REDY0) //Check Tx ready state
{
if(*spi0TxStr!='\0')
rSPTDAT0=*spi0TxStr++;
else {
endSpi0Tx=1;
break;
}
while(!(REDY0_org)); //Check Rx ready state
*spi0RxStr++=rSPRDATB0;
}
}
*spi0RxStr='\0'; // attach End of String(Null)
printf("Tx Strings:%s\n",txStr);
printf("Rx Strings:%s :",rxStr);
if(strcmp(rxStr,txStr)==0) printf("O.K.\n");
else printf("ERROR!!!\n");
SPI_Port_Return(0);
}
void Test_Spi1_Loopback_poll(void)
{
U32 i;
char *txStr,*rxStr;
printf("[SPI Polling Tx/Rx Self-Test]\n");
printf("Connect SPIMOSI 1 into SPIMISO 1.\n");
endSpi1Tx=0;
spi1TxStr="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // Tx Data to send
spi1RxStr=(char *) SPI_BUFFER1; // Rx Buffer to receive
txStr=(char *)spi1TxStr;
rxStr=(char *)spi1RxStr;
SPI_Port_Init(CH1_POLL_MSTR_TX);
SPI_Baud_Rate_Set(1, 25000000); // SPI Channel 0, 1MHz
SPI_Ch_Set(CH1_POLL_MSTR_TX, ACTL_A); // Active L, Format A
rSPPIN1=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
while(endSpi1Tx==0)
{
if(REDY1) //Check Tx ready state
{
if(*spi1TxStr!='\0')
rSPTDAT1=*spi1TxStr++;
else {
endSpi1Tx=1;
break;
}
while(!(REDY1_org)); //Check Rx ready state
*spi1RxStr++=rSPRDATB1;
}
}
*spi1RxStr='\0'; // attach End of String(Null)
printf("Tx Strings:%s\n",txStr);
printf("Rx Strings:%s :",rxStr);
if(strcmp(rxStr,txStr)==0) printf("O.K.\n");
else printf("ERROR!!!\n");
SPI_Port_Return(1);
}
void Test_Spi0_Loopback_int(void)
{
char *txStr,*rxStr;
printf("[SPI Interrupt Tx/Rx Self-Test]\n");
printf("Connect SPIMOSI 0 into SPIMISO 0.\n");
endSpi0Tx=0;
spi0TxStr="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // Tx Data to send
spi0RxStr=(char *) SPI_BUFFER0; // Rx Buffer to receive
txStr=(char *)spi0TxStr;
rxStr=(char *)spi0RxStr;
SPI_Port_Init(CH0_INT_MSTR_TX);
SPI_Baud_Rate_Set(0, 25000000); // SPI Channel 0, 25MHz
SPI_Ch_Set(CH0_INT_MSTR_TX, ACTL_A); // Active L, Format A
rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
pISR_SPI0=(unsigned)Spi0_Int;
rINTMSK&=~(BIT_SPI0);
while(endSpi0Tx==0);
*spi0RxStr='\0'; // attach End of String(Null)
printf("Tx Strings:%s\n",txStr);
printf("Rx Strings:%s :",rxStr);
if(strcmp(rxStr,txStr)==0) printf("O.K.\n");
else printf("ERROR!!!\n");
SPI_Port_Return(0);
}
void Test_Spi1_Loopback_int(void)
{
char *txStr,*rxStr;
printf("[SPI Interrupt Tx/Rx Self-Test]\n");
printf("Connect SPIMOSI 1 into SPIMISO 1.\n");
endSpi1Tx=0;
spi1TxStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; // Tx Data to send
spi1RxStr=(char *) SPI_BUFFER1; // Rx Buffer to receive
txStr=(char *)spi1TxStr;
rxStr=(char *)spi1RxStr;
SPI_Port_Init(CH1_INT_MSTR_TX);
SPI_Baud_Rate_Set(1, 25000000); // SPI Channel 0, 25MHz
SPI_Ch_Set(CH1_INT_MSTR_TX, ACTL_A); // Active L, Format A
rSPPIN1=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
pISR_SPI1=(unsigned)Spi1_Int;
rINTMSK&=~(BIT_SPI1);
while(endSpi1Tx==0);
*spi1RxStr='\0'; // attach End of String(Null)
printf("Tx Strings:%s\n",txStr);
printf("Rx Strings:%s :",rxStr);
if(strcmp(rxStr,txStr)==0) printf("O.K.\n");
else printf("ERROR!!!\n");
SPI_Port_Return(1);
}
void __irq Spi0_Int(void)
{
rINTMSK|=BIT_SPI0;
ClearPending(BIT_SPI0);
if(rSPSTA0&0x4||rSPPIN0&0x4)
printf("Data Collision or Multi Master Error!!!\n");
if(*spi0TxStr!='\0') {
rSPTDAT0=*spi0TxStr++;
rINTMSK&=~BIT_SPI0;
}
else {
endSpi0Tx=1;
return;
}
while(!(REDY0_org)); //Check ready state
*spi0RxStr++=rSPRDATB0; //First Rx data is garbage data
}
void __irq Spi1_Int(void)
{
rINTMSK|=BIT_SPI1;
ClearPending(BIT_SPI1);
if(rSPSTA1&0x4||rSPPIN1&0x4)
printf("Data Collision or Multi Master Error!!!\n");
if(*spi1TxStr!='\0') {
rSPTDAT1=*spi1TxStr++;
rINTMSK&=~BIT_SPI1;
}
else {
endSpi1Tx=1;
return;
}
while(!(REDY1_org)); //Check ready state
*spi1RxStr++=rSPRDATB1; //First Rx data is garbage data
}
#if 1
void Test_Spi01_MS_Int(void)
{
char *rx0Str,*tx0Str;
char *rx1Str,*tx1Str;
printf("[SPI0(Master), SPI1(Slave) Interrupt Rx/Tx test in 1 Board]\n");
endSpi0Tx=0;
endSpi1Tx=0;
spi0TxStr="!@#$%^&*()_+|<>?:~ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
spi1TxStr="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+|<>?:~";
spi0RxStr=(char *) SPI_BUFFER0;
spi1RxStr=(char *) SPI_BUFFER1;
tx0Str=(char *)spi0TxStr;
rx0Str=(char *)spi0RxStr;
tx1Str=(char *)spi1TxStr;
rx1Str=(char *)spi1RxStr;
SPI_Port_Init(CH0_INT_MSTR_TX);
SPI_Port_Init(CH1_INT_SLV_RX);
SPI_Baud_Rate_Set(0, 1000000); // SPI Channel 0, 25MHz
SPI_Baud_Rate_Set(1, 1000000); // SPI Channel 1, 25MHz
SPI_Ch_Set(CH1_INT_SLV_RX, ACTL_A); // Active L, Format B
rSPPIN1=(0<<2)|(1<<1)|(1<<0);//dis-ENMUL,SBO,release
printf("Slave setting end\n");
SPI_Ch_Set(CH0_INT_MSTR_TX, ACTL_A); // Active L, Format B
rSPPIN0=(0<<2)|(1<<1)|(1<<0);//dis-ENMUL,SBO,release
printf("Master setting end\n");
pISR_SPI0=(unsigned)Spi01_M_Int;
pISR_SPI1=(unsigned)Spi01_S_Int;
Master_nSS_Con0(0); // Activate nSS
// rINTMSK&=~(BIT_SPI0|BIT_SPI1);
// rSPPIN0 &= ~(1<<1);
rINTMSK&=~(BIT_SPI1);
rINTMSK&=~(BIT_SPI0);
while((endSpi1Tx==0)||(endSpi0Tx==0))
{
if(Uart_GetKey()) {
Master_nSS_Con0(1);
return;
}
}
Master_nSS_Con0(1);
// rSPPIN0 |= (1<<1);
rINTMSK |=(BIT_SPI0|BIT_SPI1);
*spi0RxStr='\0';//attach End of String(Null)
*spi1RxStr='\0';//attach End of String(Null)
printf("SPI0Tx Strings:%s\n",tx0Str);
printf("SPI0Rx Strings:%s\n",rx0Str+1);//remove first dummy data
printf("SPI1Tx Strings:%s\n",tx1Str);
printf("SPI1Rx Strings:%s\n",rx1Str+1);//remove first dummy data
if(strcmp((rx1Str+1),tx0Str)==0)
printf("SPI0 test O.K !!!\n");
if(strcmp((rx0Str+1),tx1Str)==0)
printf("SPI1 test O.K !!!\n");
else
printf("ERROR!!!\n");
SPI_Port_Return(0);
SPI_Port_Return(1);
}
void __irq Spi01_M_Int(void)
{
rINTMSK|=BIT_SPI0;
ClearPending(BIT_SPI0);
if(*spi0TxStr!='\0')
rSPTDAT0=*spi0TxStr++;
else {
// while(!REDY0_org); //Check ready state
*spi0RxStr++=rSPRDATB0; //First Rx data is garbage data
endSpi0Tx=1;
return;
}
if(rSPSTA0&0x4||rSPPIN0&0x4)
printf("Data Collision or Multi Master Error!!!\n");
// while(!REDY0_org); //Check ready state
*spi0RxStr++=rSPRDATB0; //First Rx data is garbage data
rINTMSK&=~(BIT_SPI1);
printf("M");
// printf("spi0 %s\n",spi0TxStr);
}
void __irq Spi01_S_Int(void)
{
rINTMSK|=BIT_SPI1;
ClearPending(BIT_SPI1);
if(rSPSTA1&0x4||rSPPIN1&0x4)
printf("Data Collision or Multi Master Error!!!\n");
// while(!REDY1_org); //Check ready state
*spi1RxStr++=rSPRDATB1; //First Rx data is garbage data
if(*spi1TxStr!='\0')
rSPTDAT1=*spi1TxStr++;
else {
endSpi1Tx=1;
return;
}
rINTMSK&=~(BIT_SPI0);
printf("S");
// printf("spi1 %s\n",spi1TxStr);
}
#else
void Test_Spi01_MS_Int(void)
{
char *rx0Str,*tx0Str;
char *rx1Str,*tx1Str;
printf("[SPI0(Master), SPI1(Slave) Interrupt Rx/Tx test in 1 Board]\n");
endSpi0Tx=0;
endSpi1Tx=0;
spi0TxStr="!@#$%^&*()_+|<>?:~ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
spi1TxStr="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+|<>?:~";
spi0RxStr=(char *) SPI_BUFFER0;
spi1RxStr=(char *) SPI_BUFFER1;
tx0Str=(char *)spi0TxStr;
rx0Str=(char *)spi0RxStr;
tx1Str=(char *)spi1TxStr;
rx1Str=(char *)spi1RxStr;
SPI_Port_Init(CH0_INT_MSTR_TX);
SPI_Port_Init(CH1_INT_SLV_RX);
SPI_Baud_Rate_Set(0, 5000000); // SPI Channel 0, 25MHz
SPI_Baud_Rate_Set(1, 5000000); // SPI Channel 0, 25MHz
SPI_Ch_Set(CH1_INT_SLV_RX, ACTL_A); // Active L, Format A
rSPPIN1=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
printf("Slave setting end\n");
SPI_Ch_Set(CH0_INT_MSTR_TX, ACTL_A); // Active L, Format A
rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
printf("Master setting end\n");
pISR_SPI0=(unsigned)Spi01_M_Int;
// pISR_SPI1=(unsigned)Spi01_S_Int;
Master_nSS_Con0(0); // Activate nSS
// rINTMSK&=~(BIT_SPI0|BIT_SPI1);
// rINTMSK&=~(BIT_SPI1);
rINTMSK&=~(BIT_SPI0);
while((endSpi1Tx==0)||(endSpi0Tx==0))
{
if(Uart_GetKey()) {
Master_nSS_Con0(1);
return;
}
}
Master_nSS_Con0(1);
// rINTMSK |=(BIT_SPI0|BIT_SPI1);
rINTMSK |=(BIT_SPI0);
*spi0RxStr='\0';//attach End of String(Null)
*spi1RxStr='\0';//attach End of String(Null)
printf("SPI0Tx Strings:%s\n",tx0Str);
printf("SPI0Rx Strings:%s\n",rx0Str+1);//remove first dummy data
printf("SPI1Tx Strings:%s\n",tx1Str);
printf("SPI1Rx Strings:%s\n",rx1Str+1);//remove first dummy data
if(strcmp((rx1Str+1),tx0Str)==0)
printf("SPI0 test O.K !!!\n");
if(strcmp((rx0Str+1),tx1Str)==0)
printf("SPI1 test O.K !!!\n");
else
printf("ERROR!!!\n");
SPI_Port_Return(0);
SPI_Port_Return(1);
}
void __irq Spi01_M_Int(void)
{
rINTMSK|=BIT_SPI0;
ClearPending(BIT_SPI0);
if(*spi0TxStr!='\0')
rSPTDAT0=*spi0TxStr++;
else {
while(!REDY0_org); //Check ready state
*spi0RxStr++=rSPRDATB0; //First Rx data is garbage data
endSpi0Tx=1;
return;
}
if(rSPSTA0&0x4||rSPPIN0&0x4)
printf("Data Collision or Multi Master Error!!!\n");
while(!REDY0_org); //Check ready state
*spi0RxStr++=rSPRDATB0; //First Rx data is garbage data
rINTMSK&=~(BIT_SPI1);
}
#endif
void SPI_Ch_Set(U32 mode, U32 format)
{
U32 SMOD,ENSCK,MSSEL,TAGD,CPOL,CPHA;
if(mode&0x100) SMOD=0; // Polling
else if(mode&0x200) SMOD=1; // Interrupt
else if(mode&0x400) SMOD=2; // Buffer DMA using TXFIFO
else SMOD=3; // Buffer DMA using RXFIFO
if(mode&0x10) { // Master
ENSCK=1;
MSSEL = 1;
if(mode&0x1) { TAGD=0; }
else { TAGD=1; } // Master Rx Auto Garbage Mode
}
else { // Slave
ENSCK=0;
MSSEL = 0;
TAGD=0;
}
#if 0
switch(format) {
case ACTL_A :
CPOL=1;
CPHA=0;
break;
case ACTL_B :
CPOL=1;
CPHA=1;
break;
case ACTH_A :
CPOL=0;
CPHA=0;
break;
case ACTH_B :
CPOL=0;
CPHA=1;
break;
}
#else
if (format==ACTL_A) {
CPOL=1;
CPHA=0;
}
else if (format==ACTL_B) {
CPOL=1;
CPHA=1;
}
else if (format==ACTH_A) {
CPOL=0;
CPHA=0;
}
else {
CPOL=0;
CPHA=1;
}
#endif
if(mode&0x1000) {// Channel 0
rSPCON0 &= ~(0x7f);
rSPCON0 |= (SMOD<<5)|(ENSCK<<4)|(MSSEL<<3)|(CPOL<<2)|(CPHA<<1)|(TAGD);
printf("rSPCON0 [0x%08x]\n",rSPCON0);
}
else { // Channel 1
rSPCON1 &= ~(0x7f);
rSPCON1 |= (SMOD<<5)|(ENSCK<<4)|(MSSEL<<3)|(CPOL<<2)|(CPHA<<1)|(TAGD);
printf("rSPCON1 [0x%08x]\n",rSPCON1);
}
}
void SPI_Baud_Rate_Set(U32 ch, float BaudRate)
{
U32 PrescalerVal;
if(BaudRate>25000000) {
printf("SPI Baud Rate is too big (<25MHz)\n");
while(1);
}
SystemCLK();
PrescalerVal = (U32)(PCLK/2/BaudRate-1);
if(ch) {
rSPPRE1 = PrescalerVal;
printf("rSPPRE1 [0x%08x]\n",rSPPRE1);
}
else {
rSPPRE0 = PrescalerVal;
printf("rSPPRE0 [0x%08x]\n",rSPPRE0);
}
}
void SPI_Port_Init(U32 mode)
{
if (mode&0x2000) {
spi1_rGPGCON=rGPGCON;
spi1_rGPGDAT=rGPGDAT;
spi1_rGPGDN=rGPGDN;
rGPGCON |= (0x3f<<10); // GPG7,6,5 = SPICLK1,SPIMOSI1,SPIMISO1
rGPGDN |= (0x7<<5); // Pull-down Disable
if (mode&0x10) { // Master
rGPGDAT=rGPGDAT&~(1<<3)|(1<<3);
rGPGCON &= ~(0x3<<6);
rGPGCON |= (0x1<<6); // GPG3 = Output fot chip select pin
// rGPGCON |= (0x3<<6); // GPG3 = Output fot chip select pin
}
else { // Slave
rGPGCON &= ~(0x3<<6);
rGPGCON |= (0x3<<6); // GPG3 = nSS1 when SPI1 is in slave mode
}
}
else {
spi0_rGPECON=rGPECON;
spi0_rGPEDAT=rGPEDAT;
spi0_rGPEDN=rGPEDN;
rGPECON &= ~(0x3f<<22);
rGPECON |= (0x2a<<22); // GPE13,12,11 = SPICLK0,SPIMOSI0,SPIMISO0
rGPEDN |= (0x7<<11); // Pull-down Disable
if (mode&0x10) { // Master
rGPGDAT=rGPGDAT&~(1<<2)|(1<<2);
rGPGCON &= ~(0x3<<4);
rGPGCON |= (0x1<<4); // GPG2 = Output fot chip select pin
// rGPGCON |= (0x3<<4); // GPG2 = nSS0 fot chip select pin
}
else { // Slave
rGPGCON &= ~(0x3<<4);
rGPGCON |= (0x3<<4); // GPG2 = nSS0 when SPI0 is in slave mode
}
}
if (mode&0x2000) {
printf("mode [0x%08x]\n",mode);
printf("rGPGCON [0x%08x]\n",rGPGCON);
printf("rGPGDAT [0x%08x]\n",rGPGDAT);
}
else {
printf("mode [0x%08x]\n",mode);
printf("rGPECON [0x%08x]\n",rGPECON);
printf("rGPEDAT [0x%08x]\n",rGPEDAT);
}
rSPCON0 = 0;
rSPPIN0 = 0x2;
rSPPRE0 = 0;
rSPCON1 = 0;
rSPPIN1 = 0x2;
rSPPRE1 = 0;
}
void SPI_Port_Return(U32 ch)
{
if (ch) {
rGPGCON=spi1_rGPGCON;
rGPGDAT=spi1_rGPGDAT;
rGPGDN=spi1_rGPGDN;
}
else {
rGPECON=spi0_rGPECON;
rGPEDAT=spi0_rGPEDAT;
rGPEDN=spi0_rGPEDN;
}
}
void Master_nSS_Con0(int Set)
{
rGPGDAT=rGPGDAT&~(1<<2)|(Set<<2);
printf("Chip Select nSS0 [%d]\n",Set);
}
void Master_nSS_Con1(int Set)
{
rGPGDAT=rGPGDAT&~(1<<3)|(Set<<3);
printf("Chip Select nSS1 [%d]\n",Set);
}
#endif // Total
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -