资料介绍
新鲜出炉--SPI 双机全双工通讯/源代码/仿真 采用查询方式,双工通讯时,主机每发送完一个字节,就要拉高SS。否则,从机的发送结束标志不会置位。
//从机
#includeiom16v.h>
#includemacros.h>
voidmain()
{
unsignedcharGH=0X45;
DDRC=0XFF;
PORTC=0X00;
//SSPB4
//MOSIPB5
//MISOPB6
//SCKPB7
PORTB=PORTB|0b11110000;//SCKMISOMOSISS使能上拉
DDRB=DDRB0b01001111;//SCKMOSISS置为输入
DDRB=DDRB|0b01000001;//MISO置为输出
//SSPB4
//MOSIPB5
//MISOPB6
//SCKPB7
SPCR=0b01000000;//不用中断,使能SPI,MSB首先发送,SPI置为从机模式,
//SCK空闲时为低,低电平采样,4分频
SPSR=0x00;
while(1)
{
SPDR=GH;//向发送缓冲区写数据
while(!(SPSR(1SPIF)));//等待发送结束
PORTC=SPDR;//读取接收到的从机数据,并显示
GH++;
}
}
//主机
#includeiom16v.h>
#includemacros.h>
//SSPB4
//MOSIPB5
//MISOPB6
//SCKPB7
voidmain()
{
unsignedintXX;
unsignedcharFF,GHJ;
CLI();
DDRA=0XFF;
DDRC=0XFF;
PORTB=PORTB|0b11110000;//SCKMISOMOSISS使能上拉
DDRB=DDRB0b10111111;//MISO置为输入
DDRB=DDRB|0b10110001;//SCKMOSISS置为输出
SPCR=0b01010000;//不用中断,使能SPI,MSB首先发送,SPI置为主机模式,
//SCK空闲时为低,低电平采样,4分频
SPSR=0x00;
while(1)
{
PORTB=PORTB0b11101111;//拉低从机SS准备通讯
SPDR=GHJ;//向缓冲区写数据以启动通讯
while(!(SPSR(1SPIF)));//等待发送结束
PORTC=SPDR;//读取接收到的从机数据,并显示
//为观察方便,延时。
for(XX=20000;XX!=0;XX--){}
for(XX=20000;XX!=0;XX--){}
for(XX=20000;XX!=0;XX--){}
PORTB=PORTB|0b00010000;//拉高从机SS以同步数据,否则从机发送结束标志不会置位
GHJ++;
}
}