串行接口spi接口应用设计

串行接口spi接口应用设计

ID:19925286

大小:27.00 KB

页数:5页

时间:2018-10-07

串行接口spi接口应用设计_第1页
串行接口spi接口应用设计_第2页
串行接口spi接口应用设计_第3页
串行接口spi接口应用设计_第4页
串行接口spi接口应用设计_第5页
资源描述:

《串行接口spi接口应用设计》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、串行接口SPI接口应用设计使用的同步串行三线SPI接口,可以方便的连接采用SPI通信协议的外围或另一片AVR单片机,实现在短距离内的高速同步通信。ATmega128的SPI采用硬件方式实现面向字节的全双工3线同步通信,支持主机、从机和2种不同极性的SPI时序,通信速率有7种选择,主机方式的最高速率为1/2系统时钟,从机方式最高速率为1/4系统时钟。ATmega128单片机内部的SPI接口也被用于程序存储器和数据E2PROM的编程下载和上传。但特别需要注意的是,此时SPI的MOSI和MISO接口不再对应PB2、PB3引脚,而是转换到PE0、PE1引脚上(PDI、PDO),其

2、详见第二章中关于程序存储器的串行编程和校验部分的内容。ATmega128的SPI为硬件接口和传输完成中断申请,所以使用SPI传输数据的有效方法是采用中断方式+数据缓存器的设计方法。在对SPI初始化时,应注意以下几点:.正确选择和设置主机或从机,以及工作模式(极性),数据传输率;.注意传送字节的顺序,是低位优先(LSBFirst)还是高位优先(MSBFrist);.正确设置MOSI和MISO接口的输入输出方向,输入引脚使用上拉电阻,可以节省总线上的吊高电阻。下面一段是SPI主机方式连续发送(接收)字节的例程:#defineSIZE100unsignedcharSPI_rx_

3、buff[SIZE];unsignedcharSPI_tx_buff[SIZE];unsignedcharrx_wr_index,rx_rd_index,rx_counter,rx_buffer_overflow;unsignedchartx_wr_index,tx_rd_index,tx_counter;#pragmainterrupt_handlerspi_stc_isr:18voidspi_stc_isr(void){SPI_rx_buff[rx_wr_index]=SPDR;//从ISP口读出收到的字节if(++rx_wr_index==SIZE)rx_wr_in

4、dex=0;//放入接收缓冲区,并调整队列指针if(++rx_counter==SIZE){rx_counter=0;rx_buffer_overflow=1;}if(tx_counter)//如果发送缓冲区中有待发的数据{--tx_counter;SPDR=SPI_tx_buff[tx_rd_index];//发送一个字节数据,并调整指针if(++tx_rd_index==SIZE)tx_rd_index=0;}}unsignedchargetSPIchar(void){unsignedchardata;while(rx_counter==0);//无接收数据,等待da

5、ta=SPI_rx_buff[rx_rd_index];//从接收缓冲区取出一个SPI收到的数据if(++rx_rd_index==SIZE)rx_rd_index=0;//调整指针CLI();--rx_counter;SEI();returndata;}voidputSPIchar(charc){while(tx_counter==SIZE);//发送缓冲区满,等待CLI();if(tx_counter

6、

7、((SPSR&0x80)==0))//发送缓冲区已中有待发数据{//或SPI正在发送数据时SPI_tx_buffer[tx_wr_index]=c;//将数据放入发送

8、缓冲区排队if(++tx_wr_index==SIZE)tx_wr_index=0;//调整指针++tx_counter;}elseSPDR=c;//发送缓冲区中空且SPI口空闲,直接放入SPDR由SIP口发送SEI();}voidspi_init(void){unsignedchattemp;DDRB

9、=0x080;//MISO=inputandMOSI,SCK,SS=outputPORTB

10、=0x80;//MISO上拉电阻有效SPCR=0xD5;//SPI允许,主机模式,MSB,允许SPI中断,极性方式01,1/16系统时钟速率SPSR=0x00;temp=SPSR;

11、temp=SPDR;//清空SPI,和中断标志,使SPI空闲}voidmain(void){unsignedcharI;CLI();//关中断spi_init();//初始化SPI接口SEI();//开中断while(){putSPIchat(i);//发送一个字节i++;getSPIchar();//接收一个字节(第一个字节为空字节)………}}这个典型的SPI例程比较简单,主程序中首先对ATmega128的硬件SPI进行初始化。在初始化过程中,将PORTB的MOSI、SCLK和SS引脚作为输出,同时将MISO作为输入引脚,并

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。