欢迎来到天天文库
浏览记录
ID:40525138
大小:36.50 KB
页数:5页
时间:2019-08-04
《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);//发送一个字节
此文档下载收益归作者所有