我有一个带有μ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仍未生成主读取的时钟周期。
有什么问题?
如果有人可以提供帮助 - 提前致谢!
托马斯
答案 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一样驱动线路。如果芯片比平时加热更多或消耗更多功率,那就是一个标志。将引脚设置为输入后,您可以尝试向下/向上驱动点击线,看看是否有任何短路。如果您可以取消焊接引脚,也可以。