ATtiny1626 SPI中断无限触发问题求助
ATtiny1626 SPI中断无限触发问题排查与解决
核心原因与对应解决方法
SPI中断标志位清除方式错误
ATtiny1626的SPIF(SPI传输完成)标志位无法通过直接写入SPSR |= (1 << SPIF)或SPSR &= ~(1 << SPIF)清除,必须遵循先读取SPSR寄存器,再读取SPDR寄存器的顺序才能有效清除标志。仅手动写0的操作完全无效,会导致标志位持续置位,中断无限触发。
修正后的ISR示例:ISR(SPI_STC_vect) { // 强制清除SPIF标志的固定步骤 uint8_t dummy = SPSR; dummy = SPDR; // 你的业务代码(比如计数器更新、后续数据发送等) }初始化阶段未提前清除残留标志
你在SPI_init中发送第一个字节后,若直接开启SPI中断,此时SPIF标志可能已经因为传输完成而置位,导致中断立刻触发且无法停止。
解决:在开启SPI中断前,先手动执行一次标志清除操作:void SPI_init() { // 引脚配置、SPI模式/时钟等初始化代码 SPDR = 0x00; // 发送初始字节 // 提前清除可能已置位的SPIF标志 uint8_t dummy = SPSR; dummy = SPDR; // 最后再开启SPI中断 SPCR |= (1 << SPIE); }主机模式下SS引脚配置异常
ATtiny1626作为SPI主机时,若SS引脚被拉低(无论硬件还是误配置),会自动切换为从机模式,导致SPI传输逻辑混乱,SPIF标志异常置位。
解决:将SS引脚配置为输出并保持高电平:// 假设SS引脚为PB0,根据你的硬件调整引脚号 DDRB |= (1 << PB0); PORTB |= (1 << PB0);中断向量名错误
若ISR的向量名写错(比如误写为SPI_INT_vect),中断处理函数不会被正确调用,SPIF标志永远无法清除,最终导致无限触发。
解决:核对ATtiny1626的头文件定义,确认SPI传输完成中断的向量名为SPI_STC_vect。
现象关联说明
你遇到的移位寄存器无输出、主循环延时代码运行缓慢,本质都是CPU被无限触发的SPI中断占用,无法正常执行主循环逻辑和完成SPI传输链路的后续操作。解决中断触发问题后,这些现象会自动消失。
内容的提问来源于stack exchange,提问作者MSSJCODER
相关产品推荐
相关产品推荐

