新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于AVR单片机的SPI多机环路通信

基于AVR单片机的SPI多机环路通信

作者:时间:2012-08-06来源:网络收藏
点击浏览下一页
一主机三从机的通信程序如下:主机://ICC-AVR application builder : 2012-1-13 18:56:57// Target : M16// Crystal: 8.0000Mhz// 完整程序下载: http://www.51hei.com/f/djhltl.rar #include iom16v.h>#include macros.h>#define Load_High PORTB|=(14)#define Load_Low PORTB=~(14)unsigned char tab[]={0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//流水灯数组/*-----------------------------------------------------------------函数名称: void masterInit(void) 函数功能: 初始化为主机参 数: 返 回 值: 无SPI控制寄存器介绍SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0SPIE:中断使能 SPE :SPI使能 DORD:数据次序 1为LSB首先发送,0为MSB首先发送MSTR:主从选择 1为主,0为从MSTR置位时选择主机模式,否则为从机.如果MSTR为"1",SS配置为输入,且被拉低,则MSTR 被清零,寄存器SPSR 的SPIF 置位.用户必须重新设置MSTR 进入主机模式。CPOL: 时钟极性见ATMEGA16L(中文)P130CPHA: 时钟相位SPR1, SPR0: SPI 时钟速率选择1 与0 SPR1 和SPR0 对从机没有影响。-----------------------------------------------------------------*/void SPImasterInit(void) //SPI初始化{DDRB|=(17)|(15)|(14); //设置SCK,MOSI为输出,其他为输入SPCR|=(1SPE)|(1MSTR)|(1SPR1)|(1SPR0);//使能SPI,主模式,Fck/128}/*-----------------------------------------------------------------函数名称: void SPIMasterTransmit(uchar TranData) 函数功能: SPI数据传输参 数: 返 回 值: 无-----------------------------------------------------------------*/void SPIMasterTransmit(unsigned char TranData) {SPDR=TranData; //数据放入SPI寄存器中while(!(SPSR(1SPIF))); //等待数据传输完毕}void delay(unsigned int ms){unsigned int i,j;for(i=0;ims;i++){for(j=0;j1141;j++);}}/*-----------------------------------------------------------------函数名称: void Transmit(unsigned char i)函数功能: 封装传输函数参 数: 返 回 值: 无-----------------------------------------------------------------*/void Transmit(unsigned char i){Load_Low; //等待数据传输,主机向SPDR中写入数据前要将SS拉低SPIMasterTransmit(i); //传输数据Load_High; //数据传输完毕,ss恢复高电平}void main(){ unsigned char i=0;DDRC=0XFF;SPImasterInit(); //SPI初始化while(1){i++;if(i>8){i=0;}Transmit(tab[i]);//发送数据PORTC=SPDR;//主机接收从机的数据产生动作delay(100);}}从机:#includeiom16v.h>#includemacros.h>//#includedelay.h>#define uchar unsigned char#define uint unsigned intvoid delay(uint ms){uint i,j;for(i=0;ims;i++){for(j=0;j1141;j++);}}void spi_init(void){SPCR|=(1SPE)|(0MSTR)|(1SPR1)|(1SPR0);//使能SPI,从机模式,Fck/128DDRB|=(1PB6);}char SPI_SlaveReceive(void){/*等待接收结束*/while(!(SPSR(1SPIF)));/*返回数据*/return SPDR;}void main(){char a;spi_init();DDRC=0XFF;//DDRB=0X00;//PORTC=0XFF;while(1){ PORTC=SPI_SlaveReceive();//从机接收主机的数据做出动作SPDR=PORTC;//从机向主机传输数据//delay(100);}}

单片机相关文章:单片机教程


单片机相关文章:单片机视频教程


单片机相关文章:单片机工作原理


通信相关文章:通信原理




评论


相关推荐

技术专区

关闭