會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客





PIC18F4520 之 SPI 無法進行資料接收與傳送
新會員
註冊日期:
5月26日 16:29:24
所屬群組:
註冊會員
文章: 3
等級: 1; EXP: 10
HP : 0 / 2
MP : 1 / 4
離線
專案目地:
使用兩個PIC18F4520建立主從式架構,
透過Slave的AN腳位量測電壓值,在經由SPI將資料傳到Master
在由Master接收Slave的資料~
由於剛學習SPI,請各位前輩給我一些意見,以下是我的程式

Master/////////////////////////////////////
#include <p18f4520.h>
#include <adc.h>
#include <delays.h>
#include <math.h>
#include <reset.h>
#include <spi.h>
#include <i2c.h>
#include <timers.h>

#pragma config OSC = HS
#pragma config WDT = OFF
#pragma config PWRT = OFF
#pragma config BOREN = OFF
#pragma config LVP = OFF
#pragma config CPD = OFF

#define TMR1_VAL 49152
#define Master_SS LATAbits.LATA5
#define LED1 LATDbits.LATD0

void timer1_isr(void);//////////////////一秒中斷

#pragma code high_vector = 0x08

void high_interrupt() {
_asm GOTO timer1_isr _endasm
}
#pragma code

#pragma interruptlow timer1_isr

void timer1_isr() {

PIR1bits.TMR1IF = 0;
WriteTimer1(TMR1_VAL);
LED1 = 1;
Flag_500ms = 1;

}


void main(void) {

TRISDbits.TRISD0 = 0;
TRISAbits.TRISA5 = 0; //SS
TRISCbits.TRISC3 = 0; //SCK
TRISCbits.TRISC4 = 1; //SDI
TRISCbits.TRISC5 = 0; //SDO

RCONbits.IPEN = 1;
INTCONbits.GIEL = 1;
INTCONbits.GIEH = 1;
INTCONbits.PEIE = 1;

PIE1bits.TMR1IE = 1;
PIR1bits.TMR1IF = 0;
IPR1bits.TMR1IP = 1;

OpenSPI(SPI_FOSC_64, MODE_00, SMPMID);

T1CON = 0b00001011;
WriteTimer1(TMR1_VAL);

while (1) {
if (Flag_500ms) {
Flag_500ms=0;
Delay100TCYx(1);
LED1 = 0;
}


Master_SS = 0;
Delay100TCYx(25);
SSPBUF=0x28;
if(DataRdySPI()){
SPI_Data[0]=ReadSPI();
}
Delay100TCYx(25);
Master_SS = 1;
Delay10KTCYx(25);

}

}


Slave//////////////////////////////////
#include <p18f4520.h>
#include <adc.h>
#include <delays.h>
#include <math.h>
#include <reset.h>
#include <spi.h>
#include <i2c.h>
#include <timers.h>

#pragma config OSC = HS
#pragma config WDT = OFF
#pragma config PWRT = OFF
#pragma config BOREN = OFF
#pragma config LVP = OFF
#pragma config CPD = OFF

#define TMR1_VAL 49152
#define LED1 LATDbits.LATD0

char Flag_500ms = 0, SPI_Data[4] = {0};

void timer1_isr(void);///////////////一秒中斷

#pragma code high_vector = 0x08

void high_interrupt() {
_asm GOTO timer1_isr _endasm
}
#pragma code

#pragma interrupt timer1_isr

void timer1_isr() {

PIR1bits.TMR1IF = 0;
WriteTimer1(TMR1_VAL);
LED1 = 1;
Flag_500ms = 1;

}


void main(void) {
TRISDbits.TRISD1 = 0;
TRISDbits.TRISD0 = 0;

TRISAbits.TRISA5 = 1; //SS
TRISCbits.TRISC3 = 1; //SCK
TRISCbits.TRISC4 = 1; //SDI
TRISCbits.TRISC5 = 0; //SDO


RCONbits.IPEN = 1;
INTCONbits.GIEL = 1;
INTCONbits.GIEH = 1;
INTCONbits.PEIE = 1;

PIE1bits.TMR1IE = 0;
PIR1bits.TMR1IF = 0;
IPR1bits.TMR1IP = 1;

T1CON = 0b00001011;
WriteTimer1(TMR1_VAL);

OpenSPI(SLV_SSON, MODE_00, SMPMID);
ADCON1 = 0x0F;

while (1) {

if (Flag_500ms) {
Flag_500ms = 0;
Delay100TCYx(100);
LED1 = 0;
Delay100TCYx(100);

}

if(DataRdySPI()){
SPI_Data[0]=ReadSPI();
}

}

}

12月05日 10:35:54

jopqr1256 於 2017年12月05日 11:30:29
轉換PDF檔 列印






無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
Microchip連結

網頁捷徑
2017 Summer Elite 報名
教育訓練
其它網站連結
電話: 02-25000405
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project