java怎么拦截某个对象
239
2022-11-07
怎样设计一个基于AVR单片机的SPI串行外设接口?
图(1)主/从机的连接图
串行外设接口SPI允许ATmega16和外设之间进行高速的同步数据传输。ATmega16SPI的特点如下:全双工,3线同步数据传输,主/从机操作,LSB首先发送或MSB首先发送,7种可编程的比特率,传送中断结束,写碰撞标志检测,可以从闲置模式唤醒,作为主机时具有双速模式(CK/2)。
图(2)SPI主机-从机的互连
下面将介绍SPI的几个特殊寄存器:
1.1SPI的控制寄存器—SPCR
SPIE为SPI中断使能,置位后,只要SPSR寄存器的SPIF和SREG寄存器的全局中断使能位置位,就会引发SPI中断。SPE置位将使能SPI,DORD置位时数据的LSB首先发送;否则数据的MSB首先发送。MSTR置位时选择主机模式,否则为从机。CPOL置位表示空闲SCK为高电平;否则空闲时SCK为低电平。CPHA决定数据是在SCK的起始沿采样还是在SCK的结束沿采样。通过对SPR1、SPR0进行设计,确定主机的SCK速率。
1.2SPI的状态寄存器—SPSR
SPIF为中断标志位,串行发送结束后,SPIF置位。若此时寄存器 SPCR的SPIE和全局中断使能位置位,SPI中断即产生。进入中断例程后SPIF将自动清零。在发送当中对SPI数据寄存器SPDR写数据将置位WCOL,SPI2X置位后SPI的速度加倍。
1.3SPI的数据寄存器—SPDR
首先,应设置相应管脚的读写寄存器以设定数据传输方向。在Mega16里,SPI的接口为以下管脚:PB4-PB7 (SS/MOSI/MISO/CLK)。如果工作在主模式则可以这么写(PORTB=0xff; DDRB=0xBF; PB7(SCK):输出 PB6(MISO):输入 PB5(MOSI):输出 PB4(SS):输出)
接着还需要设定SPI工作寄存器,控制的寄存器只有三个:SPDR(SPI数据寄存器)、SPCR(SPI控制寄存器)、SPSR(SPI状态寄存器),其中SPDR是读写移位寄存器中的值,SPSR中包括了SPIE:SPI中断使能位 SPE:SPI使能位 DORD:数据传送从最高位或最低位开始MSTR:主从工作方式选择 COPL/CPHA:时钟极性相位选择 SPR1/SPR0:时钟速率选择;SPSR中主要是几个状态标志位,用来做软件查询,SPIF:SPI中断标志位 WCOL:冲则可以如下设置突标志位 如果使用的是软件查询, SPCR中只需要置SPE和MSTR两位。
随后的工作就是往SPDR里读写数据,需要注意的是一次最少读写一个Byte(8 bit)的数据,这和硬件的设计有关。在读取数据前需要先写入数据。可以一次读写一个字节,也可以块读写,在OurAVR上的例程中这两种方式均有。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~