高級會員
Joined
: 2004/5/20 15:15 最後登入時間
: 2023/2/10 14:04
From 新北市
Group:
註冊會員
Level : 8 HP : 0 / 193 MP : 31 / 11269 EXP : 73
|
請教一下, 最近小弟在學PIC的SPI傳輸, 目前想完成的工作為: 將一顆18f4620的SPI設為Master (已成功,有用示波器看到訊號為正確), 另一顆18f4620設定為Slave, 但是一直無法收到訊號 (我是設定收到SPI值後由USART丟出), 請各位MCHP的高手給點建議!!
我的程式碼如下:
#include "p18f4620.h" #include "USART.h" #include "delays.h" (巨集設定與函式宣告省略...)
// Master與Slave程式由下面定義來決定, // Master mode已經可以跑, // Slave仍為失敗!!
//#define MASTER #define SLAVE
void main() { unsigned char i=0;
TRISAbits.TRISA0=0; // Light TRISAbits.TRISA1=0; // Light SSPCON1bits.SSPEN=0; // SPI initial SCK= 0; // SCK,RC3, SDI= 1; // SDI,RC4 SDO= 0; // SDO,RC5 usart_init();
// ----------- MASTER ------------------ #ifdef MASTER CS=0; // CS, RA5 SSPSTAT = 0b00000000; // CKE=0; SSPCON1 = 0b00110010; // CKP=1 LATCbits.LATC3 = 0; // SCK LATCbits.LATC5 = 0; // SDO LATAbits.LATA5 = 1; // CS= high
// Signal Light for debug LED1=0; LED2=1; while(1) { //-----------Master i=usart_Rx(); Delay10TCYx(20); LATAbits.LATA5=0; SPIPut(i); LATAbits.LATA5=1; LED1=!LED1; LED2=!LED2; Delay10TCYx(20); usart_putch(i); } #endif // ----------- SLAVE ------------------ #ifdef SLAVE CS=1; // CS, RA5 input SDI= 1; // SDI,RC4 TRISAbits.TRISA5=1; SSPSTAT = 0b00000000; // CKE=0; SSPCON1 = 0b00110100; // CKP=1,SS(RA5) enable LATCbits.LATC3 = 0; // SCK //LATCbits.LATC4 = 0; // SDI LATCbits.LATC5 = 0; // SDO //LATAbits.LATA5 = 0; // CS
// Signal Light for debug LED1=1; LED2=0;
while(1) { //-----------Slave if(LATAbits.LATA5==0) { i=SPIGet(); // SPI Get LED1=!LED1; LED2=!LED2; Delay10TCYx(20); usart_putch(i); Delay10KTCYx(20); } //----------- } // end of while #endif
} // end of main
// ---------------------------
void SPIPut(BYTE v) { SSPIF_BIT = 0; do { WCOL_BIT = 0; SSPBUF_REG = v; } while(WCOL_BIT); while(SSPIF_BIT == 0); }
BYTE SPIGet(void) { SPIPut(0x00); // Trigger return SSPBUF_REG; } // ---------------------------
發表於: 2008/7/23 23:32
|