我有一个带有 µ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 仍然没有生成主读取的时钟周期。
怎么了?
如果有人可以提供帮助 - 在此先感谢!
托马斯