2017-03-07 3 views
3

SPI로 데이터를 통신하기 위해 마이크로 컨트롤러를 사용하고 싶습니다. 그래서, 우선 PIC32MX470F512L을 가진 마이크로 칩 USB 스타터 키트 III 모듈을 선택했습니다. 필자는 SPI를 코딩하는 몇 가지 방법을 시도했지만 오실로스코프에서는 SCK 만 볼 수 있습니다.SPI 모드를 사용하는 마이크로 칩 스타터 키트

그런 다음 PIC32MX360F512L이있는 마이크로 칩 스타터 키트 I에서 동일한 코드 (새로운 PIC로 약간의 코드 라인을 조정)를 시도했습니다. 그리고 모두 완벽하게 실행됩니다. 그래서 SPI 통신을 위해 USB 스타터 키트 III가 작동하지 않는 이유를 모르겠습니다.

SPI SDO &/SS를 테스트하는 데 사용되는 코드를 제공합니다.

#define _SUPPRESS_PLIB_WARNING 

#include <stdio.h> 
#include <stdlib.h> 
#include <plib.h> 
#include <p32xxxx.h> 
#include <xc.h> 
#include <peripheral/spi.h> 

// DEVCFG2 
#pragma config FPLLIDIV = DIV_2  // PLL Input Divider (12x Divider) 
#pragma config FPLLMUL = MUL_20   // PLL Multiplier (24x Multiplier) 
#pragma config FPLLODIV = DIV_1  // System PLL Output Clock Divider (PLL Divide by 256) 

// DEVCFG1 
#pragma config FNOSC = PRIPLL   // Oscillator Selection Bits (Primary Osc w/PLL (XT+,HS+,EC+PLL)) 
#pragma config FSOSCEN = OFF   // Secondary Oscillator Enable (Disabled) 
#pragma config IESO = ON    // Internal/External Switch Over (Enabled) 
#pragma config POSCMOD = HS    // Primary Oscillator Configuration (HS osc mode) 
#pragma config OSCIOFNC = OFF   // CLKO Output Signal Active on the OSCO Pin (Disabled) 
#pragma config FPBDIV = DIV_1   // Peripheral Clock Divisor (Pb_Clk is Sys_Clk/8) 
#pragma config FCKSM = CSDCMD   // Clock Switching and Monitor Selection (Clock Switch Disable, FSCM Disabled) 
#pragma config WDTPS = PS1048576  // Watchdog Timer Postscaler (1:1048576) 
#pragma config FWDTEN = OFF    // Watchdog Timer Enable (WDT Disabled (SWDTEN Bit Controls)) 

// DEVCFG0 
#pragma config DEBUG = OFF    // Background Debugger Enable (Debugger is Enabled) 
#pragma config ICESEL = ICS_PGx2  // ICE/ICD Comm Channel Select (Communicate on PGEC1/PGED1) 
#pragma config PWP = OFF    // Program Flash Write Protect (Disable) 
#pragma config BWP = OFF    // Boot Flash Write Protect bit (Protection Disabled) 
#pragma config CP = OFF     // Code Protect (Protection Disabled) 


int main(void) { 
    TRISGbits.TRISG6=0; //SCK2 
    TRISGbits.TRISG7=1; //SDI2 
    TRISGbits.TRISG8=0; //SDO2 
    TRISGbits.TRISG9=0; //SS2 
    OpenSPI2(SPI_MODE16_ON|SPI_SMP_ON|MASTER_ENABLE_ON|SEC_PRESCAL_5_1|PRI_PRESCAL_16_1, SPI_ENABLE); 
    int data; 
    PORTGbits.RG9 = 1; 

    while(1) 
    { 
     PORTGbits.RG9 = 0; 
     putcSPI2(0xaaaa); 
     data=getcSPI2(); 
     PORTGbits.RG9 = 1; 
    } 
    return 0; 
} 

감사

+0

PIC32MX470F512L의 핀 구성 (alt 기능 등)은 확실합니까? 아마 prescalers는 360에서 잘 작동하는 동안 470에 다른 구성을 가지고 있습니다. – LPs

+0

@LPs : 두 PIC에서 기본 핀 구성을 사용합니다. 귀하의 회신을 확인했는데 오류가 없습니다. 이것은 PIC32MX470F512L의 SPI1에 대한 구성 비트입니다. {TRISDbits.TRISD10 = 0; // SCK1 TRISCbits.TRISC4 = 1; // SDI1 TRISDbits.TRISD0 = 0; // SDO1 TRISBbits.TRISB2 = 0; // SS1} PIC32MX470F512L의 데이터 시트에서 SPI 채널의 프리스케일러 및 구성과 관련하여 그림은 25Mbps SPI까지 지원할 수 있음을 나타냅니다. – Dey

+0

다시 확인하고 "기본 구성"에 의존하지 않고 핀을 구성하려고했습니다. 이제 SPI는 PIC32MX470F512L에서도 잘 작동합니다! 나는 "PPS"를 언급하는 테이블에서, 나는 단지 내 구성 핀을 사용자 정의하고 싶다고 생각했다. 그러나 그것은 필수적이었다. – Dey

답변

0

핀 매핑

당신은 핀 매핑을합니까? 게시 된 코드에는 나타나지 않습니다.

PPS (주변 핀 선택)를 사용하여 SPI 모듈에 핀을 지정해야합니다.

OpenSPI는 라이브러리 함수이지만, 또한 주변 선택 핀 (PPS)

포인트 12.3.1 http://ww1.microchip.com/downloads/en/DeviceDoc/60001120F.pdf


핀 상태와 핀 매핑을 할 필요가있어 (아날로그/디지털)

핀이 (기본값) 아날로그 상태가 아닌지 확인하십시오. 핀에 아날로그 (AN) 기능이있는 경우 기본 상태는 아날로그이므로 해당 핀을 제어 할 수 없습니다. 핀을 설정하려면 레지스터 ANSELx (또는 AD1PCFG)를 설정해야합니다. 칩 PIC32MX470F512L에서

사용하는 핀 (RG6-9)도 갖는다 아날로그 기능 (AN)

10 AN16/C1IND/RPG6/SCK2/PMA5/RG6 
11 AN17/C1INC/RPG7/PMA4/RG7 
12 AN18/C2IND/RPG8/PMA3/RG8 
14 AN19/C2INC/RPG9/PMA2/RG9 

페이지 7 http://ww1.microchip.com/downloads/en/DeviceDoc/60001185F.pdf

아날로그 핀부 12.2.5 http://ww1.microchip.com/downloads/en/DeviceDoc/60001120F.pdf

+0

도움을 주셔서 감사합니다. 1 주일 전에 문제가 해결되었습니다. 핀 구성 문제였습니다. PIC32MX470F512L은 핀 구성이 필요하지만 PIC32MX360F512L은 SPI 통신을 위해 필요하지 않습니다. – Dey

+0

내 대답의 첫 번째 부분이었습니다. – Damien

0

여러분 안녕하세요. 답장을 보내 주셔서 감사합니다.

귀하의 도움 덕분에, 그 문제를 발견했습니다. 핀 구성이 필요했습니다. 아래 코드는 핀 구성을 위해 추가되었습니다.

// Mapping SPI1 & SPI2 
    SDI1Rbits.SDI1R = 0xa; // SDI1 to C4 
    RPD0Rbits.RPD0R = 0x8; // SDO1 to D0 
    RPB2Rbits.RPB2R = 0x7; // SS1 to B2 
    SDI2Rbits.SDI2R = 0x1; // SDI2 to G7 
    RPG8Rbits.RPG8R = 0x6; // SDO2 to G8 
    RPG9Rbits.RPG9R = 0x6; // SS2 to G9 
관련 문제