PIC32 SPI无法正常工作

时间:2016-10-15 19:22:33

标签: c pic microchip mplab pic32

我正试图让SPI在PIC32MX250F128D上工作而没有太多运气。

我尝试了8位模式和32位模式,但我没有获得所有数据或根本没有数据。

我正在尝试使用4MHz SPI驱动WS2812 ledstrip。

这是我的代码:

#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;
}

目前控制器没有任何东西出来。 你们中有谁知道什么是错的吗?

Laurens的

2 个答案:

答案 0 :(得分:0)

j中使用它之前,您从未初始化main(),这意味着您最初可能会发出乱码。此外,您的三元操作j = (j > 4)? 0 : j++;的结果尚未明确定义,因为您在某个时候基本上都在说j = j++。使用以下内容简化:

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

最后,使用移位寄存器和一堆LED测试SPI初始化代码,以确保它一切顺利。逻辑分析仪还可以帮助查看MCU发出的信号(如果有的话)。

答案 1 :(得分:0)

尝试示波器并检查是否获得CS和SCK信号,如果不是SPI未初始化!但是对于PIC系列,有许多无痛的方法可以编写SPI:

  • 最简单的方法是使用编译器提供的SPI.h。
  • 您也可以使用MCC(MPLAB代码配置器)插件编写SPI驱动程序
  • 使用bit banging,如下所示:

    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。