ATTiny24/44/84 使用USI接口实现SPI从机功能 (2016-08-25 01:04:20)

ATTiny系列的芯片都不带硬件SPI,但是能用USI接口模拟。

USI设计的比较简单,但是能实现SPI,I2C,UART的功能。下面的代码实现了SPI的从机功能。

引脚的连接方式:

主机 从机

SPI   USI

MOSI DI

SCK   USCK

USI不支持SS,因此从机不用连接SS。

寄存器:

USICR:控制寄存器

USISR:状态寄存器

USIDR:数据输出/入寄存器

原理就是USISR中带的4位计数器,当收到SPI传来的时钟信号,这个计数器会开始计数。当溢出的时候会触发USI_OVF_vect中断,这时位移寄存器USIDR里面就是传来的数据了。

//定义引脚

#define DI_PIN PA6

#define DO_PIN PA5

#define CLK_PIN PA4

void InitSPI()

{

 // 将DI和时钟的引脚定义为输入

 DDRA &= ~_BV(DI_PIN) | ~_BV(CLK_PIN);

 // 设置上拉电阻

 PORTA |= _BV(DI_PIN) | _BV(CLK_PIN);

 // USIOIE:设置计数器溢出中断

 // USIWM0:设置成3线模式,也就是SPI模式

 // USICS1:设置计数器上下沿同时触发,这样一个char型正好是4位计数器

 USICR = _BV(USIOIE) | _BV(USIWM0) | _BV(USICS1);

 //清空溢出中断,允许触发

 USISR = _BV(USIOIF);

}

ISR(USI_OVF_vect)

{

 // 取出数据

 char v = USIDR;

 USISR = _BV(USIOIF);

}

你可能感兴趣的:(ATTiny24/44/84 使用USI接口实现SPI从机功能 (2016-08-25 01:04:20))