AVR单片机SPI心得体会_程序代码

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

SPI心得体会关于SPI的一些基本内容就不再在这说了,下面主要是一些实用的用法知识。SPI是全双工通信,即可以单工通信,又可以全双工通信。在单工通信和半双工通信,比较简单,就是主机(从机)发送数据,对方接受数据。在全双工通信中,就是主机A在发送的数据也在接受数据,同理,此时从机B在接受数据的同时也在发送数据,但何时发送(接受),完全是由主机A控制的(/SS)。过程如下:主机A写SPDR,开始发送数据,同时接收,接收的数据放入缓冲器中,当这个事(发送、接收)之后,置位标志位SPIF,判断(读)标志位SPSR中的SPIF(或者设置中断)。读取刚才接收的数据。后面还是再写数据和接收,或停止传输。从机B先将数据写入SPDR中,待主机开始传数据时,B接收数据到缓冲器中,并同时发送数据到A中。完事之后置位标志位SPIF。后面就是写数据读数据。有几个要点:1.主机从机的各端口同名相连,即MOSI连MOSI;MISO连MISO;SCK连SCK;/SS连SS。这与有些单片机半双工的不同(如TXD连RXD,RXD连TXD.)。即MO连SI,MI连SO。2.端口配置问题。主机A,MOSI、/SS、SCK配置为输入,MISO配置为输出。从机B,只有MISO配置为输出,其他都为输入。理解了前面的,后面的东西设置就相对简单了:1.主机从机选择及端口配置2.传输波特率,是否倍速。3.发送方向(先发低位还是先发高位)。4.时钟的极性和相位(就是SCK高位空闲还是低位空闲,及在脉冲的前沿检测还是后沿检测,这个对传输无影响)。5.是否要发生中断设置。下面是一个例程。(本人刚学AVR单片机,编程中有别扭处见谅)。环境说明:采用aTmega128AVR单片机。软件AVRstudio5.protues为7版本。程序说明:U1为主机,U2为从机。两个aTmega128AVR单片机进行通信,如图所示。U1每秒中发一个数据(0-9)到U2,并在U2中接数码管显示出来;同时U2发一个数据(9-0)到U1,也在U1中接的数码管显示出来。U1中采用定时器/计数器1。Protues仿真图:程序如下:1.主机程序:/**SPI_2.c**Created:2012-10-615:19:01*Author:Administrator*/#includeavr/io.h#includeavr/signal.h#includeavr/interrupt.hunsignedcharfnd[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};volatileunsignedchars_count=0,tr_count=0,s_flag=0;voidinit(void);voidtimer_init(void);send_re(unsignedcharnum);voiddelay_us(unsignedintnum){unsignedinti,j;for(i=0;inum;i++);}intmain(void){unsignedcharnum1=0;init();timer_init();while(1){if(s_flag){s_flag=0;num1=send_re(9-tr_count);PORTD=fnd[num1];tr_count++;if(tr_count9)tr_count=0;}}}send_re(unsignedcharnum){unsignedcharr;PORTB&=0XFE;//拉低/SS;SPDR=num;//发送数据while(!(SPSR&(1SPIF)));//结束说明已发送接受完。PORTB|=0X01;//拉高/SSr=SPDR;//读取接受的数据。returnr;}voidinit(void){DDRB=(1PB2)|(1PB0)|(1PB1);SPCR=0X7F;SPSR=SPSR&0XFE;PORTB|=0X01;DDRD=0XFF;}voidtimer_init(void){TCNT1H=0XCF;//设初值;TCNT1L=0X32;TCCR1B=0X02;//工作方式。TCCR1A=0;TCCR1C=0;//TIFR=0X04;//清标志,开中断使能及总中断。TIMSK=0X04;sei();}SIGNAL(SIG_OVERFLOW1){TCNT1H=0XCF;//设初值;TCNT1L=0X32;s_count++;if(s_count==10){s_flag=1;s_count=0;PORTF=PORTF|0X02;}}2.从机程序:/**SPI_22.c**Created:2012-10-615:48:16*Author:Administrator*/#includeavr/io.hunsignedcharfnd[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};voidinit(void);unsignedcharsend_re(unsignedcharnum);voidmain(void){unsignedcharnum1=0,s_count=0;init();while(1){num1=send_re(s_count);PORTD=fnd[num1];s_count++;if(s_count9)s_count=0;}}unsignedcharsend_re(unsignedcharnum){unsignedcharr;SPDR=num;//发送数据while(!(SPSR&(1SPIF)));//结束说明已发送、接受完。r=SPDR;//读取接受的数据。returnr;}voidinit(void){DDRB|=(1PB3);DDRB&=(0XF8);SPCR=0X6F;SPSR=SPSR&0XFE;DDRD=0XFF;}

1 / 5
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功