AVR单片机(学习ing)—(十)、ATMEGA16的同步串行接口—01
扫描二维码
随时随地手机看文章
十、ATMEGA16的同步串行接口
十—(01)、ATMEGA16的同步串行接口的介绍
1、ATMEGA16的SPI特点
串行外设接口SPI 允许ATmega16 和外设或其他AVR 器件进行高速的同步数据传输。
ATmega16 SPI 的特点如下:
? 全双工, 3 线同步数据传输
? 主机或从机操作
? LSB 首先发送或MSB 首先发送
? 7 种可编程的比特率
? 传输结束中断标志
? 写碰撞标志检测
? 可以从闲置模式唤醒
? 作为主机时具有倍速模式(CK/2)
2、主机与从机之间的SPI连接以及原理
主机和从机之间的SPI 连接如Figure 66 所示。 系统包括两个移位寄存器和一个主机时钟
发生器。通过将需要的从机的 SS 引脚拉低,主机启动一次通讯过程。主机和从机将需要
发送的数据放入相应的移位寄存器。主机在SCK 引脚上产生时钟脉冲以交换数据。主机
的数据从主机的MOSI 移出,从从机的MOSI 移入;从机的数据从从机的MISO 移出,从
主机的MISO 移入。主机通过将从机的SS 拉高实现与从机的同步。
配置为SPI 主机时, SPI 接口不自动控制 SS 引脚,必须由用户软件来处理。(还有~~就是主机和从机的两个移位寄存器可以被认定为一个公开的16位环形移位寄存器)对 SPI 数
据寄存器写入数据即启动SPI 时钟,将8 比特的数据移入从机。传输结束后SPI 时钟停
止,传输结束标志SPIF 置位。如果此时SPCR 寄存器的SPI 中断使能位SPIE 置位,中
断就会发生。主机可以继续往SPDR 写入数据以移位到从机中去,或者是将从机的SS 拉
高以说明数据包发送完成。最后进来的数据将一直保存于缓冲寄存器里。
配置为从机时,只要SS 为高,SPI 接口将一直保持睡眠状态,并保持MISO 为三态。在
这个状态下软件可以更新SPI 数据寄存器SPDR 的内容。即使此时SCK 引脚有输入时
钟,SPDR 的数据也不会移出,直至SS 被拉低。一个字节完全移出之后,传输结束标志
SPIF置位。如果此时SPCR寄存器的SPI中断使能位SPIE置位,就会产生中断请求。在读
取移入的数据之前从机可以继续往SPDR 写入数据。最后进来的数据将一直保存于缓冲
寄存器里。
SPI 系统的发送方向只有一个缓冲器,而在接收方向有两个缓冲器。也就是说,在发送时
一定要等到移位过程全部结束后才能对SPI 数据寄存器执行写操作。而在接收数据时,需
要在下一个字符移位过程结束之前通过访问SPI 数据寄存器读取当前接收到的字符。否则
第一个字节将丢失。
工作于SPI 从机模式时,控制逻辑对SCK 引脚的输入信号进行采样。为了保证对时钟信
号的正确采样, SPI 时钟不能超过fosc/4。
下面的例程说明如何将SPI 初始化为主机,以及如何进行简单的数据发送。例子中
DDR_SPI必须由实际的数据方向寄存器代替;DD_MOSI、DD_MISO和DD_SCK必须由
实际的数据方向代替。比如说, MOSI 为PB5 引脚,则DD_MOSI 要用DDB5 取代,
DDR_SPI 则用DDRB 取代。
void SPI_MasterInit(void)
{
DDR_SPI = (1<
SPCR = (1<
void SPI_MasterTransmit(char cData)
{
SPDR = cData;
while(!(SPSR & (1<
}
void SPI_SlaveInit(void)
{
DDR_SPI = (1<
SPCR = (1<
char SPI_SlaveReceive(void)
{
while(!(SPSR & (1<
return SPDR;
}
3、SS 引脚的功能
从机模式
当SPI 配置为主机时,从机选择引脚SS 总是为输入。SS 为低将激活SPI 接口, MISO
成为输出( 用户必须进行相应的端口配置) 引脚,其他引脚成为输入引脚。当SS 为高时
所有的引脚成为输入, SPI 逻辑复位,不再接收数据。
SS引脚对于数据包/字节的同步非常有用,可以使从机的位计数器与主机的时钟发生器同
步。当SS 拉高时SPI从机立即复位接收和发送逻辑,并丢弃移位寄存器里不完整的数据。
主机模式
当SPI 配置为主机时(MSTR 的SPCR 置位),用户可以决定SS 引脚的方向。
若SS 配置为输出,则此引脚可以用作普通的I/O 口而不影响SPI 系统。典型应用是用来
驱动从机的SS 引脚。
如果SS 配置为输入,必须保持为高以保证SPI 的正常工作。若系统配置为主机, SS 为
输入,但被外设拉低,则SPI 系统会将此低电平解释为有一个外部主机将自己选择为从
机。为了防止总线冲突, SPI 系统将实现如下动作:
1. 清零SPCR 的MSTR 位,使SPI 成为从机,从而MOSI 和SCK 变为输入。
2. SPSR 的SPIF 置位。若SPI 中断和全局中断开放,则中断服务程序将得到执行。
因此,使用中断方式处理SPI 主机的数据传输,并且存在SS 被拉低的可能性时,中断服
务程序应该检查MSTR 是否为"1”。若被清零,用户必须将其置位,以重新使能SPI 主机
模式。
4、SPI的相关寄存器
1)SPI控制寄存器
? Bit 7 – SPIE: 使能SPI 中断
置位后,只要SPSR 寄存器的SPIF 和SREG 寄存器的全局中断使能位置位,就会引发
SPI 中断。
? Bit 6 – SPE: 使能SPI
SPE 置位将使能SPI。进行任何SPI 操作之前必须置位SPE。
? Bit 5 – DORD: 数据次序
DORD 置位时数据的LSB 首先发送;否则数据的MSB 首先发送。
? Bit 4 – MSTR: 主/ 从选择
MSTR置位时选择主机模式,否则为从机。如果MSTR为"1”,SS配置为输入,但被拉低,
则MSTR 被清零,寄存器SPSR 的SPIF 置位。用户必须重新设置MSTR 进入主机模式。
? Bit 3 – CPOL: 时钟极性
CPOL 置位表示空闲时SCK 为高电平;否则空闲时SCK 为低电平。请参考 Figure 67 与
Figure 68。 CPOL 功能总结如下:
? Bit 2 – CPHA: 时钟相位
CPHA 决定数据是在SCK 的起始沿采样还是在SCK 的结束沿采样。请参考Figure 67 与
Figure 68 。
? Bits 1, 0 – SPR1, SPR0: SPI 时钟速率选择1 与0
确定主机的SCK 速率。SPR1 和SPR0 对从机没有影响。SCK 和振荡器的时钟频率fosc
关系如下表所示:
2)SPI状态寄存器
? Bit 7 – SPIF: SPI 中断标志
串行发送结束后,SPIF 置位。若此时寄存器SPCR 的SPIE 和全局中断使能位置位,SPI
中断即产生。如果SPI 为主机, SS 配置为输入,且被拉低, SPIF 也将置位。进入中断
服务程序后SPIF自动清零。或者可以通过先读SPSR,紧接着访问SPDR来对SPIF清零。
? Bit 6 – WCOL: 写碰撞标志
在发送当中对SPI 数据寄存器SPDR写数据将置位WCOL。WCOL可以通过先读SPSR,
紧接着访问SPDR 来清零。
? Bit 5..1 – Res: 保留
保留位,读操作返回值为零。
? Bit 0 – SPI2X: SPI 倍速
置位后SPI 的速度加倍。若为主机( 见 Table 58),则SCK 频率可达CPU 频率的一半。
若为从机,只能保证fosc /4。
3)SPI 数据寄存器- SPDR