在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引脚问题,它锁定在我没有编写的代码的另一部分。我不知道这种功能
发布于 2017-05-16 21:22:14
我没有在从模式下使用SPI的经验,但是在一般情况下,在16位和32位图片MCU上设置中断的优先级不是可选的,必须设置它,否则中断不会触发,至少这是我的经验。设置与您使用的外围设备相关的IPCx位。
尝试找到一个定义中断函数的代码片段,并将其用作模板。对于每一个外围设备,它通常都是非常相似的。UART和SPI模块也可能有一个单独的发送和接收中断向量,两者都必须定义。
在主函数的某个位置,启用中断并设置优先级(至少非零IIRC):
IEC0bits.AD1IE = 1; // Enable adc interrupt
IPC3bits.AD1IP = 4; // set priority above that of the serial port.对于ADC,我使用它来定义中断。您只需要更改_ADC1Interrupt部分。有关正确的函数名,请参阅数据表和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
}https://stackoverflow.com/questions/43955017
复制相似问题