2016-10-15 6 views
-1

SPI를 PIC32MX250F128D에서 작동 시키려면 많은 노력이 필요합니다.PIC32 SPI가 작동하지 않습니다.

8 비트 모드와 32 비트 모드로 시도했지만 데이터가 전혀 없거나 데이터가 전혀 없습니다.

4MHz SPI를 사용하여 WS2812 리드 스트립을 구동하려고합니다. 컨트롤러에서 나오는 것이없는

#include <xc.h> 
#include <peripheral/system.h> 
#include "config.h" 

void settings(void); 
char Send_SPI(unsigned char); 

int main(void) { 
    int i, j; 
    unsigned char scrapdata; 
    unsigned char buffer[6] = {0x12, 0x34, 0x56, 0x78, 0x90, 0x01}; 

    settings(); 

    while(1) { 
     Send_SPI(buffer[j]); 
     j = (j > 4)? 0 : j++; 
     for(i = 0; i < 300; i++); 
    } 

    return 0; 
} 

void settings(void) { 
    SYSTEMConfigPerformance(SYS_FREQ); 
    TRISB &= 0xFFFB; 
    RPB2R = 0x3; 

    SPI1STAT = 0; 
    SPI1CON = 0; 
    unsigned int rData = SPI1BUF; 

    // => 4MHz = 48MHz/(2 * (5 + 1)) 
    SPI1BRG = 5; 
    SPI1STATCLR = 0x40; // clear the Overflow 
    SPI1CON = 0x00008230; 
} 

char Send_SPI(unsigned char buffer) { 
    //while(!(SPI1STAT & 0x2)); 
    SPI1BUF = buffer; 
    while(!(SPI1STAT & 0x1)); // wait transfer complete 
    char scrapdata = SPI1BUF; //read to clear SPI2BUF before reload 
    return scrapdata; 
} 

순간 :

는 내가 가지고있는 코드입니다. 누구의 잘못인지 알고 있습니까?

로렌스는

답변

0

당신은 당신이 아마 처음에는 횡설수설을 보내는 의미 main()에서 사용하기 전에 j를 초기화하지 않습니다. 또한 세 번째 작업 j = (j > 4)? 0 : j++;의 결과는 기본적으로 어떤 시점에서 j = j++이라고 말하기 때문에 명확하게 정의되지 않았습니다. 와는 간단합니다 : 마지막으로

if (j > 4) j = 0; 
else j++; 

, 모든 좋은 확인하기 위해 시프트 레지스터 및 LED의 무리와 SPI 초기화 코드를 테스트합니다. 로직 애널라이저는 MCU가 어떤 신호를 전송했는지 확인하는데도 도움이됩니다.

+0

실제로 코딩 오류는 있지만 문제를 해결하지 못했던 부분입니다. –

+0

로직 애널라이저를 사용하여 PIC에서 아무것도 나오지 않았는지 확인하지만 아무것도 보내지 않습니다. –

+0

@LaurensWuyts 내가 말했듯이 기본 회로로 SPI 초기화 코드를 확인하십시오. 작동하지 않는다면 온라인 PIC 용 예제를 찾아보십시오. – TisteAndii

0

오실로스코프를 사용해보고 CS 및 SCK 신호를 받는지 확인하십시오 (SPI가 초기화되지 않은 경우). 하지만 PIC 제품군에는 SPI를 작성하는 데 많은 어려움이 없습니다.

  • 가장 쉬운 방법은 컴파일러에서 제공 한 SPI.h를 사용하는 것입니다.
  • 당신은 또한 MCC (MPLAB 코드 구성 프로그램)을 사용할 수있는 플러그인
  • 사용이이 같은 두드리는 비트 SPI를 드라이버 작성 :

    char SPI_BB(char byte8) { 
        char counter; 
        for (counter = 8; counter; counter--) { 
         if (byte8 & 0x80) 
          MOSI=1; 
         else 
          MOSI=0; 
         byte8 <<= 1; 
         SCK=1; /* a slave latches input data bit */ 
         if ((MIS0)) 
          byte8 |= 0x01; 
         SCK=0; /* a slave shifts out next output data bit */ 
        } 
        return byte8; 
    } 
    

위의 코드는 SPI에에게 모드 0입니다.