具有 SPI 模式的 Microchip 入门工具包
Microchip Starter Kits with SPI mode
我想使用微控制器通过 SPI 进行数据通信。因此,我首先选择了带有 PIC32MX470F512L 的 Microchip USB Starter Kit III 模块。我尝试了几种方法对其SPI进行编码,但在示波器上只能看到时钟信号SCK。
然后,我使用带有 PIC32MX360F512L 的 Microchip 入门工具包 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;
}
谢谢
引脚映射
你做管脚映射吗?它不会出现在您发布的代码中。
您需要使用 PPS(外围引脚 select)将引脚分配给 SPI 模块。
OpenSPI是一个库函数,但还需要它与pin peripheral做pin mapping select (PPS)
要点 12.3.1 http://ww1.microchip.com/downloads/en/DeviceDoc/60001120F.pdf
引脚状态(模拟/数字)
检查您的引脚是否处于(默认)模拟状态。如果该引脚还具有模拟 (AN) 功能,则默认状态为模拟,您无法控制该引脚。需要设置寄存器ANSELx(或AD1PCFG)来设置管脚。
在芯片PIC32MX470F512L中你使用的管脚(RG6-9)也有模拟功能(AN):
10 AN16/C1IND/RPG6/SCK2/PMA5/RG6
11 AN17/C1INC/RPG7/PMA4/RG7
12 AN18/C2IND/RPG8/PMA3/RG8
14 AN19/C2INC/RPG9/PMA2/RG9
第 7 页http://ww1.microchip.com/downloads/en/DeviceDoc/60001185F.pdf
模拟引脚第 12.2.5 节http://ww1.microchip.com/downloads/en/DeviceDoc/60001120F.pdf
大家好,感谢您的回复!
感谢您的帮助,我发现了这个问题。引脚配置是必要的。在我为引脚配置添加的代码下方。
// 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
我想使用微控制器通过 SPI 进行数据通信。因此,我首先选择了带有 PIC32MX470F512L 的 Microchip USB Starter Kit III 模块。我尝试了几种方法对其SPI进行编码,但在示波器上只能看到时钟信号SCK。
然后,我使用带有 PIC32MX360F512L 的 Microchip 入门工具包 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;
}
谢谢
引脚映射
你做管脚映射吗?它不会出现在您发布的代码中。
您需要使用 PPS(外围引脚 select)将引脚分配给 SPI 模块。
OpenSPI是一个库函数,但还需要它与pin peripheral做pin mapping select (PPS)
要点 12.3.1 http://ww1.microchip.com/downloads/en/DeviceDoc/60001120F.pdf
引脚状态(模拟/数字)
检查您的引脚是否处于(默认)模拟状态。如果该引脚还具有模拟 (AN) 功能,则默认状态为模拟,您无法控制该引脚。需要设置寄存器ANSELx(或AD1PCFG)来设置管脚。
在芯片PIC32MX470F512L中你使用的管脚(RG6-9)也有模拟功能(AN):
10 AN16/C1IND/RPG6/SCK2/PMA5/RG6
11 AN17/C1INC/RPG7/PMA4/RG7
12 AN18/C2IND/RPG8/PMA3/RG8
14 AN19/C2INC/RPG9/PMA2/RG9
第 7 页http://ww1.microchip.com/downloads/en/DeviceDoc/60001185F.pdf
模拟引脚第 12.2.5 节http://ww1.microchip.com/downloads/en/DeviceDoc/60001120F.pdf
大家好,感谢您的回复!
感谢您的帮助,我发现了这个问题。引脚配置是必要的。在我为引脚配置添加的代码下方。
// 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