相关寄存器说明以及资料请查阅官方资料文档
编译器 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条评论)
登录后参与讨论