【问题标题】:PIC32 SPI not workingPIC32 SPI 不工作
【发布时间】:2016-10-15 19:22:32
【问题描述】:

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

目前没有任何东西从控制器中流出。 有谁知道怎么回事?

劳伦斯

【问题讨论】:

    标签: c pic microchip mplab pic32


    【解决方案1】:

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

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

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

    【讨论】:

    • 确实有一些编码错误,但他们没有解决问题。
    • 我正在使用逻辑分析仪检查 PIC 中是否有任何内容,但没有发送任何内容。
    • @LaurensWuyts 就像我说的,用基本电路检查你的 SPI 初始化代码。如果它不起作用,请为您的 PIC 在线查找示例。
    【解决方案2】:

    尝试使用示波器并检查是否收到 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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-16
      • 2011-09-22
      相关资源
      最近更新 更多