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);
}
网友评论