1、PIC32MZ芯片SPI接口引脚配置
PIC32MZ芯片有6路SPI接口,在项目中利用SPI2。

SPI2的SCK是固定引脚,不可变动;SDI2/SDO2/SS2是通过端口映射来配置。
//SI4438 SPI管脚选择 PLIB_PORTS_PinModePerPortSelect(PORTS_ID_0,PORT_CHANNEL_G,PORTS_BIT_POS_1,PORTS_PIN_MODE_DIGITAL);//SDO2 PLIB_PORTS_PinModePerPortSelect(PORTS_ID_0,PORT_CHANNEL_B,PORTS_BIT_POS_3,PORTS_PIN_MODE_DIGITAL);//SDI2 PLIB_PORTS_PinModePerPortSelect(PORTS_ID_0,PORT_CHANNEL_G,PORTS_BIT_POS_6,PORTS_PIN_MODE_DIGITAL);//SCK2 PLIB_PORTS_ChangeNoticePullUpPerPortEnable( PORTS_ID_0, PORT_CHANNEL_B, PORTS_BIT_POS_3 ); // PLIB_PORTS_RemapOutput(PORTS_ID_0,OTPUT_FUNC_REFCLKO3,OUTPUT_PIN_RPG6); / PPS Input Remapping / SDI2R=8;//RPB3 SDI2 / PPS Output Remapping / RPG1R = 6;// RPG1 SDO2 PLIB_PORTS_PinDirectionOutputSet( PORTS_ID_0, PORT_CHANNEL_G, PORTS_BIT_POS_1 );//SCK2 PLIB_PORTS_PinDirectionOutputSet( PORTS_ID_0, PORT_CHANNEL_G, PORTS_BIT_POS_6 );//SDO2 PLIB_PORTS_PinSet( PORTS_ID_0, PORT_CHANNEL_B, PORTS_BIT_POS_2 );//SI4438 SS2 PLIB_PORTS_PinDirectionOutputSet( PORTS_ID_0, PORT_CHANNEL_B, PORTS_BIT_POS_2 );// SS2
2、PIC32MZ芯片SPI模块时钟选择
CPU内部任何一个模块都须要时钟才能事情,须要给SPI模块配置时钟源。项目中芯片的系统时钟是120M,利用PBCLK2作为SPI的时钟源。
/ usart、I2C、PMP use clock PBCLK2 set this to sys clk/ PLIB_OSC_PBClockDivisorSet(OSC_ID_0, OSC_PERIPHERAL_BUS_2, 2 );
SPIxCON: SPI Control Register
3、PIC32MZ芯片SPI模块参数配置
SPI参数初始化比较大略,没有利用中断收发,根据功能寄存器进行参数配置即可。SPI的通信模式须要和SI4438匹配,这个通信模式一定要精确,否则无法通信。
void SPI2_Initialize ( void ){ uint32_t rdata; / STOP and Reset the SPI / SPI2CON = 0; / Clear the Receiver buffer / rdata = SPI2BUF; rdata = rdata; / BAUD Rate register Setup / SPI2BRG = 3; / CLear the Overflow / SPI2STATCLR = _SPI2STAT_SPIROV_MASK; / MSTEN = 1 CKP = 0 CKE = 1 MODE<32,16> = 0 ENHBUF = 1 MSSEN = 0 MCLKSEL = 0 / SPI2CON=0x8020|SPI_CLOCK_PHASE_LEADING_EDGE|_SPI2CON_ENHBUF_MASK; // SPI ON, 8 bits transfer, SMP=0, Master mode}
4、PIC32MZ芯片SPI模块收发驱动
这里收发函数分开是为了方便阅读,实际上,由于和SI4438进行SPI通信时是半双工,收发完备可以写到一个函数里。
bool SPI2_Write(void pTransmitData, size_t txSize){ uint32_t i; uint32_t rdata; for( i=0;i<txSize;i++) { SPI2BUF = ((uint8_t)pTransmitData + i); while((SPI2STAT & _SPI2STAT_SRMT_MASK) == 0); while ((bool)(SPI2STAT & _SPI2STAT_SPIRBE_MASK) == true); rdata = SPI2BUF; }}bool SPI2_Read(void pReceiveData, size_t rxSize){ uint32_t i; for( i=0;i<rxSize;i++) { SPI2BUF = 0xFF; while((SPI2STAT & _SPI2STAT_SRMT_MASK) == 0); while ((bool)(SPI2STAT & _SPI2STAT_SPIRBE_MASK) == true); ((uint8_t)pReceiveData+i) = SPI2BUF; }}
总结
在产品开拓中,SPI功能用的非常多,逻辑相对大略,虽然每颗芯片的配置都不一样,但是总体上都是要从管脚配置、时钟选择、寄存器初始化、收发驱动这些方面动手。
芯片手册下载地址:
Section 23. Serial Peripheral Interface (SPI):http://ww1.microchip.com/downloads/en/DeviceDoc/61106G.pdf
PIC32MZ EF Family Datasheet_DS60001320G:http://ww1.microchip.com/downloads/en/DeviceDoc/PIC32MZ%20EF%20Family%20Datasheet_DS60001320G.pdf










