首页 文章

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

提问于
浏览
0

我有一个带有μCICP24FJ256GB106的MPLAB入门工具包板,通过3线SPI连接中的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传输和接收之间的不对称行为无法 Build .

中断处理程序是:

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

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

SPI1BUF = anyBytePattern;

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

unsigned int recvData = SPI1BUF;

Neither in single operation nor in an endless loop, there is NO CLOCK on the signal line!

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

Is this a PPS issue?

我偶然发现了制造商的SPI描述 .
文档PIC24FJ256GB110系列数据手册第15.0节串行外设接口(SPI)编写
“SPI串行接口由四个引脚组成:
SDIx:串行数据输入
SDOx:串行数据输出
SCKx:移位时钟输入或输出
SSx:低电平有效从动选择或帧同步I / O脉冲
SPI模块可配置为使用2,3或4个引脚进行操作 . 在3引脚模式下,不使用SSx . 在2引脚模式下,不使用SDOx和SSx . “
我同样的文件是64引脚芯片PIC24FJ256GB106的引脚排列,它只有 one SPI-Data Signal ,称为SDA1,物理上位于引脚nr 43上 .
How can a 3++ wire SPI solution be realized with this Chip?

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

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

What about the input mapping?

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

I added the code lines to MapSPIModulPins():

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

The clock cycles on a master read were still NOT generated by my PIC24 SPI module 1.

怎么了?

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

1 回答

  • 0

    Is this a PPS issue? PPS似乎很好

    How can a 3++ wire SPI solution be realized with this Chip? - 只需单独控制CS引脚即可 . 归属CS引脚用于从机模式 . - SDA用于I2C而非SPI .

    What about the input mapping? 输入完成如下:

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

相关问题