首页
学习
活动
专区
圈层
工具
发布

SPI从DSPIC
EN

Stack Overflow用户
提问于 2017-05-13 15:47:01
回答 1查看 909关注 0票数 0

在DSPIC33FJ128MC804上工作

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

--我尝试了启用和禁用SSEN的,以及许多其他配置.时钟存在并由Arduino Uno作为主时钟产生,已检查了3次引脚映射。此设备不受此家族的SPI从CSn错误的约束。

,有人看到我做错了什么吗?或者让一个工作示例作为从属程序?

代码语言:javascript
复制
// 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引脚问题,它锁定在我没有编写的代码的另一部分。我不知道这种功能

EN

回答 1

Stack Overflow用户

发布于 2017-05-16 21:22:14

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

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

在主函数的某个位置,启用中断并设置优先级(至少非零IIRC):

代码语言:javascript
复制
IEC0bits.AD1IE = 1; // Enable adc interrupt
IPC3bits.AD1IP = 4; // set priority above that of the serial port.

对于ADC,我使用它来定义中断。您只需要更改_ADC1Interrupt部分。有关正确的函数名,请参阅数据表和XC16文档。

代码语言:javascript
复制
// 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
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43955017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档