AVR spi读取多字节程序

AVR spi读取多字节程序

ID:40525138

大小:36.50 KB

页数:5页

时间:2019-08-04

AVR spi读取多字节程序_第1页
AVR spi读取多字节程序_第2页
AVR spi读取多字节程序_第3页
AVR spi读取多字节程序_第4页
AVR spi读取多字节程序_第5页
资源描述:

《AVR spi读取多字节程序》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

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

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

3、阻。  下面一段是SPI主机方式连续发送(接收)字节的例程:  #DefineSIZE100  UnsignedCharSPI_rx_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_

4、stc_isr:18  VoidSpi_stc_isr(Void)  {  SPI_rx_buff[Rx_wr_index]=SPDR;//从ISP口读出收到的字节  If(++Rx_wr_index==SIZE)Rx_wr_index=0;//放入接收缓冲区,并调整队列指针  If(++Rx_counter==SIZE)  {  Rx_counter=0;  Rx_buffer_overflow=1;  }  If(Tx_counter)//如果发送缓冲区中有待发的数据  {  --Tx_counter; 

5、 SPDR=SPI_tx_buff[Tx_rd_index];//发送一个字节数据,并调整指针  If(++Tx_rd_index==SIZE)Tx_rd_index=0;  }  }  UnsignedCharGetSPIchar(Void)  {  UnsignedCharData;  While(Rx_counter==0);//无接收数据,等待  Data=SPI_rx_buff[Rx_rd_index];//从接收缓冲区取出一个SPI收到的数据  If(++Rx_rd_index==SIZE)Rx_

6、rd_index=0;//调整指针  CLI();  --Rx_counter;  SEI();  ReturnData;  }  VoidPutSPIchar(CharC)  {  While(Tx_counter==SIZE);//发送缓冲区满,等待  CLI();  If(Tx_counter

7、

8、((SPSR&0x80)==0))//发送缓冲区已中有待发数据  {//或SPI正在发送数据时  SPI_tx_buffer[Tx_wr_index]=C;//将数据放入发送缓冲区排队  If(++Tx_wr_

9、index==SIZE)Tx_wr_index=0;//调整指针  ++Tx_counter;  }  Else  SPDR=C;//发送缓冲区中空且SPI口空闲,直接放入SPDR由SIP口发送  SEI();  }  VoidSpi_init(Void)  {  UnsignedChatTemp;  DDRB

10、=0x080;//MISO=InputAndMOSI,SCK,SS=Output  PORTB

11、=0x80;//MISO上拉电阻有效  SPCR=0xD5;//SPI允许,主机模式,MSB,允许SPI

12、中断,极性方式01,1/16系统时钟速率  SPSR=0x00;  Temp=SPSR;  Temp=SPDR;//清空SPI,和中断标志,使SPI空闲  }  VoidMain(Void)  {  UnsignedCharI;  CLI();//关中断  Spi_init();//初始化SPI接口  SEI();//开中断  While()  {  PutSPIchar(I);//发送一个字节  

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

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

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