Embedded SPI slaveon DSPIC
在DSPIC33FJ128MC804上工作 问题: 我完全无法将SPI配置为从属。SPI中断从不触发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
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配置文件。