PIC24 SPI主控制器拒绝接收时钟生成

时间:2014-11-20 16:27:55

标签: mode master spi pic24

我有一个带有μCICP24FJ256GB106的MPLAB入门工具包板,通过3线SPI连接中的SPI与连接的加速度计芯片ADXL375板(这似乎不是我的问题的原因)进行通信(不使用SDO) 我配置了外设引脚选择激活SPI模块1:

void MapSPIModulPins()
{
__builtin_write_OSCCONL(OSCCON&0xbf); //! PPSUnLock
RPOR1bits.RP3R = 8 ; //! Assign RP3 as Output Pin To SPI1 Clock Output.
RPOR2bits.RP4R = 7 ; //! Assign RP4 as Output Pin SPI1 Data Output.
//RPOR1bits.RP2R = 9 ; //! Assign RP2 as Output Pin Where is SPI1 Slave Select Output. SS1OUT
__builtin_write_OSCCONL(OSCCON|0x40);    //! PPSLock

//! Extra digital output as Chip Select
TRISDbits.TRISD8 = 0; // Thomas 18.11.2014
}

SPI配置为:

void SPIsetup1ForMasterMode()
{
IFS0bits.SPI1IF = 0; // Clear the Interrupt flag
IEC0bits.SPI1IE = 0; // Disable the interrupt

// SPI1CON1 Register Settings
SPI1STATbits.SPIEN  = 0; //! Thomas(THOMAHPS) 20.11.2014  Disable SPI module
SPI1CON1bits.DISSCK = 0; // Internal serial clock is enabled
SPI1CON1bits.DISSDO = 0; // SDOx pin is controlled by the module
SPI1CON1bits.MODE16 = 0;// Communication is byte-wide (8 bits) // Thomas 17.11.2014

SPI1CON1bits.MSTEN = 1; // Master mode enabled
SPI1CON1bits.SMP = 0; // Input data is sampled at the middle of data output time
SPI1CON1bits.CKE = 0; // Serial output data changes on transition from Idle clock state to active clock state

// Idle clock state to active clock state
SPI1CON1bits.CKP = 0; // Idle state for clock is a low level;

// active state is a high level
SPI1STATbits.SPIEN = 1; // Enable SPI module
SPI1STATbits.SPIROV = 0 ; //! Thomas 20.11.2014 Clear the SPIROV bit !

// Interrupt Controller Settings
IFS0bits.SPI1IF = 0; // Clear the Interrupt flag
IEC0bits.SPI1IE = 1; // Enable the interrupt
}

IMHO无法建立SPI传输和接收之间的不对称行为。

中断处理程序是:

void __attribute__((interrupt,no_auto_psv)) _SPI1Interrupt(void)
{
   IFS0bits.SPI1IF = 0;     //Clear Interrupt status of SPI1
}

然后我用

发送了一个数据字节
SPI1BUF = anyBytePattern;

我可以在示波器上与时钟一起观察。 可以触发接收数据(这里我省略了状态标志检查!)

unsigned int recvData = SPI1BUF;

无论是单次操作还是无限循环,信号线上都没有时钟!

我将我的代码嵌入到演示应用程序的适当位置,这应该不会干扰我的问题 我尝试了许多延迟,生产者的示例代码,社区等等 在调试会话中,没有观察到异常的寄存器值(SPI错误标志) 奴隶电子的分离在行为上没有区别。

这是PPS问题吗?

我偶然发现了制造商的SPI描述 在文档中 PIC24FJ256GB110系列数据表部分 15.0串行外设接口(SPI)已写入 “SPI串行接口由四个引脚组成:
 SDIx:串行数据输入
 SDOx:串行数据输出
 SCKx:移位时钟输入或输出
 SSx:低电平有效从动选择或帧同步I / O脉冲
SPI模块可配置为使用2,3或4个引脚进行操作。在3引脚模式下,不使用SSx。在里面 2引脚模式,不使用SDOx和SSx。“ 我的同一文件是64引脚芯片PIC24FJ256GB106的引脚排列,它只有一个SPI数据信号,称为SDA1,物理上位于引脚nr43上。
如何使用此芯片实现3 ++线SPI解决方案?

我使用PPS命令映射此信号和SPI时钟,如上所示 表10-3:可选择的输出源(输出的映射功能)
功能 SDO1 (SPI1数据输出),代码为7,功能 SCK1OUT (SPI1时钟输出)为8.

与我的SPI从设备的通信需要一个写 - 读周期,我告诉他寄存器nr,他用这个值回答了我。
这个PPS映射是否足以完成这项工作?

输入映射怎么样?

表10-2中:可选择的输入源(地图输入到功能)是带有
的线 功能 SCK1IN (SPI1时钟输入),寄存器RPINR20,位SCK1R(5:0)
SDI1 (SPI1数据输入),寄存器RPINR20,位SDI1R(5:0)

我将代码行添加到MapSPIModulPins():

RPINR20bits.SCK1R = 3 ; // because SCL1/RP“3“/PMCS2/CN55/RD10  
RPINR20bits.SDI1R = 4 ; // because DPLN/SDA1/RP“4“/CN54/RD9  

我的PIC24 SPI模块1仍未生成主读取的时钟周期。

有什么问题?

如果有人可以提供帮助 - 提前致谢!
托马斯

1 个答案:

答案 0 :(得分:1)

这是PPS问题吗? PPS似乎很好

如何使用此芯片实现3 ++线SPI解决方案? - 只需通过独立控制CS引脚即可。归属CS引脚用于从机模式。 - SDA用于I2C而非SPI。

输入映射怎么样? 输入完成如下:

_SDIxR=16;          //SDI

16是RP16 / RPi16,因为只能输入RPi引脚,所以不要在RPI(RPi)引脚上映射时钟,它不会工作。

在上面的代码中,我们看不到你设置SPI模块的时序,它可能太慢或太快。这是在SPIxCON1寄存器上完成的。

SPIxCON1bits.SPRE = 0b110; //secondary scale 111= prescale 1:1
SPIxCON1bits.PPRE = 0b00; // primary scale 10 = prescale 4:1
                          //  16 MIPS -> 4MIPS

进一步检查:

  • 如果引脚与多路复用(数据表上的引脚上的AN),请确保引脚不处于模拟模式。

  • 对于调试,您还需要确保主时钟正在运行,例如,您可以切换一个引脚并在其上运行探测。

  • 检查您的电子设备,确保没有像其他IC一样驱动线路。如果芯片比平时加热更多或消耗更多功率,那就是一个标志。将引脚设置为输入后,您可以尝试向下/向上驱动点击线,看看是否有任何短路。如果您可以取消焊接引脚,也可以。