c - Arduino和PIC(8位微 Controller )之间的SPI信号转换

标签 c arduino pic spi

我正在测试 Arduino UNO 和 PIC16F1(PC16F1827) 之间的 SPI 通信。

这是我的接线和源代码:

MPLAB X IDE 3.55/XC8 v1.4.1(免费)

#include <xc.h>

#pragma config FOSC = INTOSC    // Inner clock
#pragma config WDTE = OFF       // Watchdog timer
#pragma config PWRTE = OFF      // Power-Up timer
#pragma config MCLRE = ON       // MCLR pin
#pragma config CP = OFF         // Code protection
#pragma config CPD = OFF        // Memory protection
#pragma config BOREN = ON       // Brown-out Reset
#pragma config CLKOUTEN = OFF   // Outer clock
#pragma config IESO = OFF       // Oscillator switchover
#pragma config FCMEN = OFF      // Fail-Safe clockmonitor

#pragma config WRT = OFF        // Power-up Timer
#pragma config PLLEN = ON       // Use 4xPLL
#pragma config STVREN = OFF     // Reset when stack error
#pragma config LVP = OFF        // Low voltage program

#define _XTAL_FREQ 32000000 // 32MHz

void main(void)
{
    // PIC initialization
    OSCCON = 0b00110100; // Inner clock = 4Mhz

    ANSELA = 0b00000000; // All RA are digital
    TRISA = 0b00000001; // RA0 is input
    PORTA = 0b00000000; // Initialize RA

    // SPI initalization
    SDO1SEL = 0; // RB2 sets to SDO pin
    SSP1CON1 = 0b00100101; // Slave mode(Unuse SS)
    SSP1STAT = 0b01000000; // Slave mode(Clock phase is LOW)

    SSP1BUF = 0;

    unsigned char read_data; // Current is dummy
    unsigned char count = 255;
    while(1){
        // Read byte from master
        read_data = SSP1BUF;       
        while(!SSP1STATbits.BF);

        // Write byte to master
        if(count == 255) count = 0; else count++;
        SSP1BUF = count;
        while(!SSPSTATbits.BF);
    }
}

Arduino IDE 1.8.1

#include <SPI.h>

void setup()
{
  Serial.begin(9600);

  SPI.begin() ;
  SPI.setBitOrder(MSBFIRST) ;
  SPI.setDataMode(SPI_MODE1) ;

  delay(1500) ;
}

void loop()
{
  char msg[100];
  byte i, n;

  for (i = 0 ; i < 10 ; i++) {
    n = SPI.transfer(i) ;

    sprintf(msg, "%d/%d,", n, i);
    Serial.print(msg);
  }

  Serial.print("\n");
}

Wiring image

我的理想是Arduino接收0-255的值(我忽略了SPI的频率,因为这是一个编程测试)。但 SPI.transfer() 返回的值是 i(0-9)。

我担心我应该修复哪里,因为网络上这些 IC 的技术信息很少。有人知道好方法吗?

最佳答案

我查看了 PIC 16F1826 数据表来检查您的连接。

用于从 SPI1 传输数据的引脚(名为 SDO1)可以是 RA6 或 RB2(来自数据表第 12 页 [表 1-2])。

假设您将 0 写入 SDO1SEL(复位时已为 0),SDO1 似乎位于 RB2 上。事实上,您连接的是 RB2,而不是 RA6。

但是您没有清除相应的 TRISB 位以使 RB2 成为输出,如第 236 页(第 25.2.2 章)所述。您当前的程序无法从 RB2/SDO1 传输数据。

也许还有其他错误,可能是在设置寄存器时。我建议仔细阅读数据表并修改 PIC 端的所有设置。然后,如果您仍然有问题,请更新您的问题,我将更新我的答案(发表评论叫醒我)。例如,我没有检查 RB2 的连接是否连接到 Arduino 的正确位置(我看到它连接到引脚 11,但我没有检查它是否正确:像某些编译器一样,我在第一个错误时停止) .

关于c - Arduino和PIC(8位微 Controller )之间的SPI信号转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42826405/

相关文章:

c++ - Arduino RP2040 Pico 唯一 ID

计数器的C程序

c - 如何在代码 .h 文件中组织声明和函数并包含以实现最佳代码重用

c - 为什么首先中断发生在注册时?

将三个数组复制到 C 中的 2 个暗数组

c - 如何检查 `malloc.h` 在 C 中是否可用?

c - 我的双变量的输出值在 Arduino Uno 上不正确

c++ - Arduino/C++ 交叉函数变量

c - stdarg.h 不处理字符指针

c - 如何为使用不同参数调用的给定函数实现单独的静态变量