2016-10-15 13 views
-1

Я пытаюсь получить SPI, работающий на PIC32MX250F128D без большой удачи.PIC32 SPI не работает

Я пробовал в 8-битном режиме и 32-битном режиме, но я не получаю все данные или данные вообще.

Я пытаюсь использовать SPI 4 МГц для управления светодиодной подсветкой 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

Вы никогда не инициализируется j перед использованием его в main() означает, что вы, вероятно, посылая тарабарщину на первый. Также результат вашей тройной операции j = (j > 4)? 0 : j++; не определен, так как вы в основном говорите j = j++ в какой-то момент. Сделать это проще с:

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

Наконец, проверьте код инициализации SPI с регистром сдвига и кучей светодиодов, чтобы убедиться, что все хорошо. Логический анализатор также поможет понять, какие сигналы, если таковые имеются, отправляются MCU.

+0

Те, где действительно были ошибки кодирования, но они не исправили проблему. –

+0

Я использую логический анализатор, чтобы проверить, не выходит ли что-либо из ПОС, но ничего не отправляется. –

+0

@ LaurensWuyts Как я уже сказал, проверьте код инициализации SPI с помощью базовой схемы. Если он не работает, ищите примеры онлайн для своего ПОС. – TisteAndii

0

Попробуйте осциллограф и проверьте, не получаете ли вы сигналы CS и SCK, если SPI не инициализирован! Но с семьей ПИК существует много безболезненных способов написать 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 mode 0.

 Смежные вопросы

  • Нет связанных вопросов^_^