C 带SPI模式的微芯片起动器套件

C 带SPI模式的微芯片起动器套件,c,embedded,spi,microchip,pic32,C,Embedded,Spi,Microchip,Pic32,我想使用微控制器通过SPI进行数据通信。因此,我首先选择了具有PIC32MX470F512L的Microchip USB Starter Kit III模块。我尝试了几种方法对其SPI进行编码,但示波器上只能看到时钟信号SCK 然后,我用带有PIC32MX360F512L的Microchip Starter Kit i尝试了相同的代码(只是将一些代码行调整为新的PIC)。一切都很完美。所以,我不明白为什么USB Starter Kit III不能用于SPI通信 我提供了用于测试SPI SDO和/

我想使用微控制器通过SPI进行数据通信。因此,我首先选择了具有PIC32MX470F512L的Microchip USB Starter Kit III模块。我尝试了几种方法对其SPI进行编码,但示波器上只能看到时钟信号SCK

然后,我用带有PIC32MX360F512L的Microchip Starter Kit i尝试了相同的代码(只是将一些代码行调整为新的PIC)。一切都很完美。所以,我不明白为什么USB Starter Kit III不能用于SPI通信

我提供了用于测试SPI SDO和/或SS的代码

#define _SUPPRESS_PLIB_WARNING

#include <stdio.h>
#include <stdlib.h>
#include <plib.h>
#include <p32xxxx.h>
#include <xc.h>
#include <peripheral/spi.h>

// DEVCFG2
#pragma config FPLLIDIV = DIV_2        // PLL Input Divider (12x Divider)
#pragma config FPLLMUL = MUL_20         // PLL Multiplier (24x Multiplier)
#pragma config FPLLODIV = DIV_1       // System PLL Output Clock Divider (PLL Divide by 256)

// DEVCFG1
#pragma config FNOSC = PRIPLL           // Oscillator Selection Bits (Primary Osc w/PLL (XT+,HS+,EC+PLL))
#pragma config FSOSCEN = OFF            // Secondary Oscillator Enable (Disabled)
#pragma config IESO = ON                // Internal/External Switch Over (Enabled)
#pragma config POSCMOD = HS             // Primary Oscillator Configuration (HS osc mode)
#pragma config OSCIOFNC = OFF           // CLKO Output Signal Active on the OSCO Pin (Disabled)
#pragma config FPBDIV = DIV_1           // Peripheral Clock Divisor (Pb_Clk is Sys_Clk/8)
#pragma config FCKSM = CSDCMD           // Clock Switching and Monitor Selection (Clock Switch Disable, FSCM Disabled)
#pragma config WDTPS = PS1048576        // Watchdog Timer Postscaler (1:1048576)
#pragma config FWDTEN = OFF             // Watchdog Timer Enable (WDT Disabled (SWDTEN Bit Controls))

// DEVCFG0
#pragma config DEBUG = OFF               // Background Debugger Enable (Debugger is Enabled)
#pragma config ICESEL = ICS_PGx2        // ICE/ICD Comm Channel Select (Communicate on PGEC1/PGED1)
#pragma config PWP = OFF                // Program Flash Write Protect (Disable)
#pragma config BWP = OFF                // Boot Flash Write Protect bit (Protection Disabled)
#pragma config CP = OFF                 // Code Protect (Protection Disabled)


int main(void) {
  TRISGbits.TRISG6=0; //SCK2
  TRISGbits.TRISG7=1; //SDI2
  TRISGbits.TRISG8=0; //SDO2
  TRISGbits.TRISG9=0; //SS2
  OpenSPI2(SPI_MODE16_ON|SPI_SMP_ON|MASTER_ENABLE_ON|SEC_PRESCAL_5_1|PRI_PRESCAL_16_1, SPI_ENABLE);
  int data;
  PORTGbits.RG9 = 1;

  while(1)
  {
      PORTGbits.RG9 = 0;
      putcSPI2(0xaaaa);
      data=getcSPI2();
      PORTGbits.RG9 = 1;
  }
  return 0;
}
\define\u SUPPRESS\u PLIB\u警告
#包括
#包括
#包括
#包括
#包括
#包括
//DEVCFG2
#pragma config FPLLIDIV=DIV_2//PLL输入分频器(12倍分频器)
#pragma config FPLLMUL=MUL_20//PLL乘法器(24倍乘法器)
#pragma config FPLLODIV=DIV_1//系统PLL输出时钟分频器(PLL除以256)
//DEVCFG1
#pragma-config-FNOSC=PRIPLL//振荡器选择位(带PLL的主Osc(XT+,HS+,EC+PLL))
#pragma config FSOSCEN=OFF//辅助振荡器启用(禁用)
#pragma config IESO=ON//内部/外部切换(已启用)
#pragma config POSCMOD=HS//主振荡器配置(HS osc模式)
#pragma config OSCIOFNC=关闭//OSCO引脚上的CLKO输出信号激活(禁用)
#pragma config FPBDIV=DIV_1//外围时钟除数(Pb_Clk为系统时钟/8)
#pragma config FCKSM=CSDCMD//时钟切换和监视器选择(时钟切换禁用,FSCM禁用)
#pragma-config-WDTPS=PS1048576//Watchdog-Timer-Postscaler(1:1048576)
#pragma config FWDTEN=OFF//看门狗定时器启用(WDT禁用(SWDTEN位控制))
//DEVCFG0
#pragma config DEBUG=OFF//后台调试器启用(调试器已启用)
#pragma config ICESEL=ICS_PGx2//ICE/ICD通信信道选择(通过PGEC1/PGED1进行通信)
#pragma config PWP=OFF//程序闪存写保护(禁用)
#pragma config BWP=OFF//启动闪存写保护位(保护禁用)
#pragma config CP=OFF//代码保护(禁用保护)
内部主(空){
TRISGbits.TRISG6=0;//SCK2
TRISGbits.TRISG7=1;//SDI2
TRISGbits.TRISG8=0;//SDO2
TRISGbits.TRISG9=0;//SS2
OpenSPI2(SPI模式16开| SPI SMP开|主控|启用|备用|备用|备用|备用|备用|备用|备用|备用|备用|;
int数据;
PORTGbits.RG9=1;
而(1)
{
PORTGbits.RG9=0;
putcSPI2(0xaaaa);
data=getcSPI2();
PORTGbits.RG9=1;
}
返回0;
}

谢谢

引脚映射

你做引脚映射吗?它不会出现在您发布的代码上

您需要使用PPS(外围引脚选择)将引脚分配给SPI模块

OpenSPI是一个库函数,但它还需要使用引脚外围选择(PPS)进行引脚映射

第12.3.1点


引脚状态(模拟/数字)

检查您的pin码是否未处于(默认)模拟状态。如果该引脚还具有模拟(an)功能,则默认状态为模拟,您无法控制该引脚。您需要设置寄存器ANSELx(或AD1PCFG)来设置引脚

在芯片PIC32MX470F512L中,您使用的引脚(RG6-9)也具有模拟功能(AN):

第7页


模拟引脚第12.2.5节

大家好,谢谢你们的回复

多亏了你的帮助,我才发现了这个问题。引脚配置是必要的。下面是我为pin配置添加的代码

  // Mapping SPI1 & SPI2
  SDI1Rbits.SDI1R = 0xa; // SDI1 to C4
  RPD0Rbits.RPD0R = 0x8; // SDO1 to D0
  RPB2Rbits.RPB2R = 0x7; // SS1 to B2
  SDI2Rbits.SDI2R = 0x1; // SDI2 to G7
  RPG8Rbits.RPG8R = 0x6; // SDO2 to G8
  RPG9Rbits.RPG9R = 0x6; // SS2 to G9

您确定PIC32MX470F512L的引脚配置(alt功能等)吗?可能470上的预分频器有不同的配置,而360上的预分频器工作得很好。@LPs:我在两张图片上都使用默认的引脚配置。我在你回复后检查了一下,没有发现任何错误。这是我在PIC32MX470F512L上SPI1的配置位:{TRISDbits.TRISD10=0;//SCK1 TRISCbits.TRISC4=1;//SDI1 TRISDbits.TRISD0=0;//SDO1 TRISBbits.TRISB2=0;//SS1}在PIC32MX470F512L的数据表中,关于SPI通道的预分频器和配置,这表明pic可以支持25Mbps的SPI。我再次检查并尝试在不依赖“默认配置”的情况下配置引脚。现在,SPI也可以与PIC32MX470F512L配合使用!我认为在提到“PPS”的表格中,只有当我想定制我的配置管脚时才可以。但是这是必要的。@Dey:如果你解决了这个问题,你可以回答下面你自己的问题并接受答案。谢谢你的帮助,我一周前就解决了这个问题。这是一个pin配置问题。PIC32MX470F512L需要引脚配置,而PIC32MX360F512L不需要引脚配置进行SPI通信。这是我回答的第一部分
  // Mapping SPI1 & SPI2
  SDI1Rbits.SDI1R = 0xa; // SDI1 to C4
  RPD0Rbits.RPD0R = 0x8; // SDO1 to D0
  RPB2Rbits.RPB2R = 0x7; // SS1 to B2
  SDI2Rbits.SDI2R = 0x1; // SDI2 to G7
  RPG8Rbits.RPG8R = 0x6; // SDO2 to G8
  RPG9Rbits.RPG9R = 0x6; // SS2 to G9