-1

我试图让 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;
}

目前没有任何东西从控制器中流出。你们中有人知道出了什么问题吗?

劳伦斯

4

2 回答 2

0

尝试使用示波器,检查是否收到 CS 和 SCK 信号,如果没有,则 SPI 未初始化!但是对于 PIC 系列,有许多轻松编写 SPI 的方法:

  • 最简单的方法是使用编译器给出的 SPI.h。
  • 您还可以使用 MCC(MPLAB code configurator) 插件编写 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。

于 2017-04-13T17:25:58.043 回答
0

j您在使用它之前从未初始化,这main()意味着您一开始可能会发出胡言乱语。此外,您的三元运算的结果j = (j > 4)? 0 : j++;也没有明确定义,因为您基本上是j = j++在某个时候说的。通过以下方式使其更简单:

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

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

于 2016-10-15T23:21:35.763 回答