Embedded SPI slaveon DSPIC

Embedded SPI slaveon DSPIC,embedded,microcontroller,pic,spi,microchip,Embedded,Microcontroller,Pic,Spi,Microchip,在DSPIC33FJ128MC804上工作 问题: 我完全无法将SPI配置为从属。SPI中断从不触发if(SPI2STATbits.SPIRBF | | SPI2STATbits.SPIROV)也总是被计算为false 我试过了 启用和禁用SSEN以及许多其他配置。。。 时钟存在并由Arduino Uno作为主时钟生成,引脚映射已检查3次。本设备不受本系列SPI从属CSn勘误表的约束 有人知道我做错了什么吗?或者有一个可用的示例作为从机? // Setup hardware I/Os confi

在DSPIC33FJ128MC804上工作

问题: 我完全无法将SPI配置为从属。SPI中断从不触发
if(SPI2STATbits.SPIRBF | | SPI2STATbits.SPIROV)
也总是被计算为false

我试过了 启用和禁用SSEN以及许多其他配置。。。 时钟存在并由Arduino Uno作为主时钟生成,引脚映射已检查3次。本设备不受本系列SPI从属CSn勘误表的约束

有人知道我做错了什么吗?或者有一个可用的示例作为从机?

// Setup hardware I/Os configuration
SPI_SLAVE_CSN_TRIS = 1; //input
SPI_SLAVE_CLK_TRIS = 1;
SPI_SLAVE_MOSI_TRIS = 1;
SPI_SLAVE_MISO_TRIS = 0; //output

// Setup remapable pins
SPI_SLAVE_MISO_RPN  = _RPOUT_SDO2; // configure RP output
RPINR22bits.SDI2R   = SPI_SLAVE_MOSI_RP_NUMBER; //configure inputs
RPINR22bits.SCK2R   = SPI_SLAVE_CLK_RP_NUMBER;
RPINR23bits.SS2R    = SPI_SLAVE_CSN_RP_NUMBER;

IFS2bits.SPI2IF = 0; // Clear interrupt flag
IEC2bits.SPI2IE = 0; // Disable interrupt

// Baudrate configuration (unused in slave mode )
SPI2CON1bits.PPRE   = 0b11; //TODO needed in slave mode ?
SPI2CON1bits.SPRE   = 0b110;

SPI2CON1bits.DISSCK = 0; // Internal serial clock
SPI2CON1bits.DISSDO = 0; // SDOx is controlled by the module
SPI2CON1bits.MODE16 = 0; // 8 bit mode  //TODO check if 16 bit fit's better

SPI2CON1bits.SMP    = 0; // 0 when slave
SPI2CON1bits.CKE    = 1; // Emits SDO on SCK falling edge (slave samples on rising)  
SPI2CON1bits.CKP    = 0; // SCK idle state is LOW level
SPI2CON1bits.SSEN   = 1;// CSN  pin used for slave mode
SPI2CON1bits.MSTEN  = 0; // Slave mode is enabled

//SPI2CON2bits.SPIFSD = 1; //we are not in framed mode

SPI2STATbits.SPIEN = 1; // Enable SPI module

//TODO ISR priority 
// Write the SPIx Interrupt Priority Control (SPIxIP) bits in the respective IPCx register to set the interrupt priority
SPI2BUF         = 0xf3; // Clear data to be transmitted => for test 
IFS2bits.SPI2IF = 0; // Clear interrupt flag
IEC2bits.SPI2IE = 1; // Enable interrupt
已解决 RPN pin功能锁定在我未编写的代码的另一部分。
我不知道这种功能性

我没有在从属模式下使用SPI的经验,但一般来说,在16位和32位pic MCU上设置中断优先级不是可选的,必须进行设置,否则中断不会触发,至少这是我的经验。设置与您使用的外围设备相关的IPCx位

尝试查找定义了中断函数的代码段,并将其用作模板。一般来说,每个外围设备都非常相似。UART和SPI模块也可能有单独的发送和接收中断向量,两者都必须定义

在主功能的某个位置,启用中断并设置优先级,至少非零IIRC:

IEC0bits.AD1IE = 1; // Enable adc interrupt
IPC3bits.AD1IP = 4; // set priority above that of the serial port.
对于ADC,我使用它来定义中断。您只需更改_adc1中断部分。有关正确的函数名,请参阅数据表和XC16文档

// ADC1 interrupt vector
void __attribute__((__interrupt__(auto_psv))) _ADC1Interrupt(void)
{
    if( IFS0bits.AD1IF ) // Check interrupt flag
    {
    }
    IFS0bits.AD1IF = 0; // clear interrupt flag to prevent endless interrupts
}

安装MPLAB XIDE和MPLAB代码配置器插件并运行它。进行MCPU配置,之后您将获得有用的C配置文件。