0

我有一个带有 µC PIC24FJ256GB106 的 MPLAB 入门套件板,通过 SPI 在 3 线 SPI 连接(未使用 SDO)中与连接的加速度计芯片 ADXL375 板通信(这似乎不是我的问题的原因)我配置了外设引脚选择激活 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
}

恕我直言,无法建立 SPI 传输和接收之间的不对称行为。

中断处理程序是:

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

然后我传输了一个数据字节

SPI1BUF = anyBytePattern;

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

unsigned int recvData = SPI1BUF;

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

我将我的代码嵌入到演示应用程序的适当位置,这应该不会干扰我的问题。
我尝试了很多带有延迟、生产者、社区的示例代码等的东西。
在调试会话中,没有观察到异常的寄存器值(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,物理上位于引脚 nr 43。
如何使用该芯片实现 3++ 线 SPI 解决方案?

如上所示,我使用 PPS 命令映射了这个信号和 SPI 时钟,参考 表 10-3: 可选择的输出源(将函数映射到输出):使用代码 7 的
函数SDO1(SPI1 数据输出)和函数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 仍然没有生成主读取的时钟周期。

怎么了?

如果有人可以提供帮助 - 在此先感谢!
托马斯

4

1 回答 1

1

这是 PPS 问题吗? PPS看起来不错

这个芯片如何实现3++线SPI解决方案? - 只需独立控制 CS 引脚即可。属性 CS 引脚用于从机模式。- SDA 用于 I2C 而不是 SPI。

输入映射呢? 输入完成如下:

_SDIxR=16;          //SDI

16 为 RP16 / RPi16,注意 de 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 那样驱动线路。如果芯片比平时发热更多或消耗更多功率,那就是一个迹象。将引脚设置为输入,您可以尝试向下/向上驱动点击线,看看是否有任何短路。如果您可以取消焊接引脚,您也可以。

于 2017-02-21T09:01:24.507 回答