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
相关产品推荐
相关产品推荐

