spi同步串行接口.pdfVIP

  • 21
  • 0
  • 约6.15千字
  • 约 9页
  • 2017-04-26 发布于浙江
  • 举报
spi同步串行接口

AVR单片机(学习ing)— (十)、ATMEGA16 的同步串行接口SPI—02 一遍就哦了~~ 寄存器比较少~~所以~~设置起来也很简单~~ 不过有点要注意的: 1)那就是在之前的介绍中说过,在说一遍~~ 主机和从机的两个移位寄存器可以被认为是一个公开的 16位环形移位寄存器,当数据从主 机移向从机时,同时从机饿数据也向相反的放向移向主机。这就意味着在一个以为周期内, 主机和从机的数据进行了交换。 (不过这个例子里没有用到这个,下个会用到~~呵呵~~), 早知道对谁都好~~ 2)配置为SPI主机时,SPI接口不自动控制SS引脚,必须由用户软件来处理。还有配置为 从机时,只要SS引脚为高,SPI接口将一直保持睡眠状态,并保持MISO为三态。(这个 章节的第一篇文章有详细的介绍~~自己可以看看~~) 3)SPI系统的发送方向只有一个缓冲器,而接收方向有两个缓冲器。也就是说,在发送时 一定要等到移位过程全部结束后才能对SPI数据寄存器执行写操作(这里也就是要有这个语 句:while(!(SPSR(1SPIF)));)。而在接收数据时,需要在下一个字符移位过程结束之前 通过访问SPI数据寄存器读取接收到的字节(来个这个语句:都是一样的 ~~while(!(SPSR(1SPIF)));) )具体的SPI引脚的配 ~~看这一章的第一篇文章~~ 十、ATMEGA16 的同步串行接口SPI 十— (02)、ATMEGA16 的同步串行接口SPI的串行通讯实验 然后就是程序喽: IAR10_1_M.c:(主机发送) // //这个是ATMEGA16作为主机的情况下的文件 //主机每隔1s发送数据0x55给从机,从机的D1指示灯每1s闪烁一次 #includeioavr.h #includedelayics.h #includemacroandconst.h // #defineSPIF7 // //端口初始化函数 voidport_init() { DDRB=0XB0; //SCK、MOSI、SS置位为输出,MISO设置为输入 PORTB=0X00; //输出低电平,输入也是低电平 } // //SPI初始化函数 voidspi_init() { SPCR=0x51; //使能SPI;时钟选择为16分频;时钟极性 (CPOL)为低电 平,起始沿为上升沿,结束沿为下降沿; //时钟相位(CPHA)在起始沿采样 } // //芯片初始化函数 voiddevice_init() { port_init(); spi_init(); } // //SPI主机发送函数 voidspi_master_send(uchardat) { SPDR=dat; while(!(SPSR(1SPIF))); //等待传输结束 } // //main voidmain() { device_init(); while(1) { spi_master_send(0x55); delay_s(1); } } IAR10_1_S.c:(从机接收) // //这就是ATMEGA16从机接收的文件了 #includeioavr.h #includedelayics.h #includemacroandconst.h #includebitics.h #includeintrinsics.h // #defineSPIF7 // //端口初始化函数 voidport_init() { DDRB=0X41; //SCK、MOSI、SS置位为输入,MISO设置为输出 PORTB=0X01; //上面的输出低电平,输入也是低电平;同时PB0为输出高 电平~~用于点亮法官二极管 } // //SPI初始化函数 voidspi_init() { SPCR=0x41; //使能SPI;为从机模式;时钟选择为16分频;时钟极性 (CPOL)为低电平,起始沿为上升沿,结束沿为下降沿; //时钟相位(CPHA)在起始沿采样 } // //芯片初始化函数 voidd

文档评论(0)

1亿VIP精品文档

相关文档