原创 SPI协议AVR单片机双机通讯

2011-9-15 18:37 2558 17 17 分类: MCU/ 嵌入式

相关寄存器说明以及资料请查阅官方资料文档

编译器 ICC AVR
SPI双机通讯源文件


下面是从机接收主文件:

#include<iom128v.h>
#include<macros.h>

#include"SPI.H"


void main(void)
{
 PORTE |= BIT(PE2);
 DDRE  |= BIT(PE2);
 
 PORTA = 0X88;
 DDRA  = 0XFF;

 SPI_Slave_Init();
 
 while(1)
 {
   PORTA=SPI_Slave_Recevive();
 }
}//我的PORTA接口是LED灯,演示用

/*********************************************************/
下面是主机发送主文件:

#include<iom128v.h>
#include<macros.h>


#include"SPI.h"


void main(void)
{
 SPI_Master_Init();
 
 while(1)
 {
   SPI_Master_Transmit(0xaa);
 }
}

/******************************************************************/
下面附上SPI.C和SPI.H文件:
#include<iom128v.h>
#include<macros.h>

#include"SPI.h"


vSS为低,激活SPI
   SPI_DDR |= (1<<MOSI)|(1<<SCK)|(1<<SS); //设置MOSI和SCK输出 SS输出
 //主机模式的MISO系统默认输入
   SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);//|(1<<SPR1); //使能SPI,主机模式
   //SPE,使能SPI;MSTR,主机模式;SPR0和SPR1设置时钟频率
 //时钟为CPU的128分频
 //注意选择数据的LSB 还是 MSB发送   默认为MSB
}


void SPI_Master_Transmit(unsigned char Data)
{
 SPI_SS_CLR();   //设置SS为低,激活SPI
   /* 启动数据传输 */
   SPDR = Data;
   /* 等待传输结束 */
   while(!(SPSR & (1<<SPIF)));  
 //串行发送结束以后SPIF置位(即为1)
 
 SPI_SS_SET();   //设置SS为高,复位从机的SPI
    //实现数据同步
}


void SPI_Slave_Init(void)

 SPI_DDR |= BIT(MISO);//其他的3个口系统默认设置为输入
 SPCR |= BIT(SPE);//使能SPI
}

unsigned char SPI_Slave_Recevive(void)
{
 //等待接收结束
 while(!(SPSR & (1<<SPIF)));
 return SPDR;
 //返回数据
}

/***************************************************************/

#ifndef __SPI_H
#define __SPI_H


#define SPI_DDR   DDRB
#define SPI_PORT  PORTB
#define MOSI    PB2
#define MISO      PB3
#define SS        PB0
#define SCK       PB1

#define SPI_SS_SET()  SPI_PORT |=  BIT(SS)
#define SPI_SS_CLR()  SPI_PORT &= ~BIT(SS)
//主机控制SPI的SS口,实现数据的同步

extern void SPI_Master_Init(void);
extern void SPI_Master_Transmit(unsigned char Data);
extern void SPI_Slave_Init(void);
extern unsigned char SPI_Slave_Recevive(void);

 

#endif


 

文章评论0条评论)

登录后参与讨论
我要评论
0
17
关闭 站长推荐上一条 /2 下一条