You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PIC16F1503单向SPI主设备发送后阻塞,BF flag未置位问题排查

问题分析与修复方案

1. 从设备SPI模式配置错误

你的从设备SSP1CON1初始化值完全错误,导致从设备未工作在SPI Slave模式:

  • 当前使用的00110001B中,SSPM3:SSPM0位为0001,对应I2C Slave模式,而非SPI Slave模式。
  • 正确的SPI Slave模式(SS引脚使能)配置应为00110100B,解析如下:
    • bit5 (SPEN): 1(启用同步串口)
    • bit4 (CKP): 1(时钟空闲状态为高,与主设备匹配)
    • bit3-bit0 (SSPM3:SSPM0): 0100(SPI Slave模式,SS引脚使能)

修改从设备初始化代码:

; 原错误代码
; movlw       00110001B
; 修改后的正确代码
movlw       00110100B
           ;0-------    WCOL write collision bit - no collision
           ;-0------    SSPOV receive overflow indicator bit - no OF
           ;--1-----    SPEN enable synchronous serial port
           ;---1----    CKP clock polarity, idle state for clock is high
           ;----0100    SPI Slave mode, SS enabled
movwf       SSP1CON1

2. 主设备引脚方向未配置

PIC引脚默认是输入模式,你未配置SPI相关引脚为输出,导致无法发送时钟和数据:

  • 主设备需要配置:
    • RA4(SDO,已通过APFCON重映射):设为输出
    • RC3(SCK,主设备SPI时钟引脚):设为输出
    • RC2(SS,手动控制时):设为输出

在主设备SPI_init中,banksel TRISC后添加引脚方向配置:

SPI_init:
    clrf    INTCON        ; Disable all interrupts
    banksel TRISC
    ; 配置SPI引脚方向
    bcf TRISC, TRISC_RC3_POSN ; RC3 (SCK) 设为输出
    bcf TRISC, TRISC_RC2_POSN ; RC2 (SS) 设为输出
    banksel TRISA
    bcf TRISA, TRISA_RA4_POSN ; RA4 (SDO) 设为输出
    
    ; set alternative SDO pin
    banksel APFCON
    bsf APFCON, APFCON_SDOSEL_POSN  ; SDO function is on RA4
    
    ; 后续代码不变...

3. SS线控制的必要性

对于SPI Slave模式(SS引脚使能),主设备必须正确控制SS线:

  • 发送数据前拉低SS,发送完成后拉高SS,告知从设备何时接收数据。
  • 你当前注释了SS控制代码,导致从设备无法触发接收流程。

恢复主设备SPI_write中的SS控制代码:

SPI_write:
    movlw   10101010B
    
    ; pull SS low
    banksel LATC
    bcf LATC, LATC_LATC2_POSN ; 使用RC2作为SS引脚,避免与SCK(RC3)冲突
    
    ; write the value to SPI transmit buffer
    banksel SSP1BUF
    movwf   SSP1BUF
    
    ; wait till BF flag goes high
    banksel SSP1STAT
    btfss   SSP1STAT, SSP1STAT_BF_POSN
    goto    $-1

    ; clear the BF flag by reading SSP1BUF
    banksel SSP1BUF
    movf    SSP1BUF, w
   
    ; set SS high
    banksel LATC
    bsf LATC, LATC_LATC2_POSN

    return

4. 模拟器局限性说明

PIC模拟器对SPI外设的模拟可能存在偏差,尤其是涉及多设备交互时。建议优先在硬件上测试修复后的代码,模拟器仅作为单设备配置验证工具。

额外验证点

  • 确认主从设备的SSP1STAT配置一致:SMP=0、CKE=1,当前配置正确无需修改。
  • 检查硬件连线:主设备SDO(RA4)接从设备SDI(RC4),主设备SCK(RC3)接从设备SCK(RC3),主设备SS(RC2)接从设备SS(RC2),确保GND共地。

内容的提问来源于stack exchange,提问作者NomadAU

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 11:05:00