永发信息网

谁能给我一个avr单片机SPI通信的实例,简单的能体现出基本原理就可以,最好有比较详细注解,C语言的.

答案:3  悬赏:0  手机版
解决时间 2021-02-10 19:40
谁能给我一个avr单片机SPI通信的实例,简单的能体现出基本原理就可以,最好有比较详细注解,C语言的.
最佳答案
主机:
//SPI双机通信 主机//发送0x09,接收方PD0~3,对应点小灯
//包含所需头文件
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
// SS PB4
// MOSI PB5
// MISO PB6
// SCK PB7

#define uchar unsigned char
#define uint unsigned int
#define BIT(x) (1<<(x))
#define NOP() asm("nop")
#define WDR() asm("wdr")


void spi_write(uchar sData);
uchar spi_read(void);

//端口初始化
void port_init(void)
{
DDRD = 0xFF;
PORTB=PORTB|0b11110000; //SCK MISO MOSI SS 使能上拉
DDRB=DDRB&0b10111111; //MISO 置为输入
DDRB=DDRB|0b10110001; //SCK MOSI SS 置为输出

}

void spi_init(void) //spi初始化
{
DDRB|=(~(1<<PB5))|(1<<PB7)|(1<<PB4)|(~(1<<PB4));
SPCR = 0xF1;
SPSR = 0x01;
}

SIGNAL(SIG_SPI) //一个字节发送或接收完成中断
{
PORTD=SPDR;
}

void spi_write(uchar sData)//功能:使用SPI发送一个字节
{
SPDR = sData;
while(!(SPSR & BIT(SPIF)));
//sData=SPDR;//读从机发回来的数据
}

uchar spi_read(void)//功能:使用SPI接收一个字节
{
SPDR = 0x00;
while(!(SPSR & BIT(SPIF)));
return SPDR;
}

void init_devices(void)
{
cli(); //禁止所有中断
MCUCR = 0x00;
MCUCSR = 0x80;//禁止JTAG
GICR = 0x00;
port_init();
spi_init();
sei();//开全局中断
}
//主函数
int main(void)
{
init_devices();
spi_write(0x09);
while(1)
{
NOP();
}
return 0;
}

从机:
//SPI双机通信 从机
//发送0x06,PA0~3接收
//包含所需头文件
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>


#define uchar unsigned char
#define uint unsigned int
#define BIT(x) (1<<(x))
#define NOP() asm("nop")
#define WDR() asm("wdr")


void spi_write(uchar sData);
uchar spi_read(void);

//端口初始化
void port_init(void)
{
DDRA = 0xFF;
PORTB=PORTB|0b11110000; //SCK MISO MOSI SS 使能上拉
DDRB=DDRB&0b01001111; // SCK MOSI SS 置为输入
DDRB=DDRB|0b01000001; // MISO 置为输出
}

void spi_init(void) //spi初始化
{
DDRB|=(1<<PB5)|(~(1<<PB7))|(~(1<<PB4))|(~(1<<PB4));
SPCR = 0xE1;
SPSR = 0x00;
}

SIGNAL(SIG_SPI) //一个字节发送或接收完成中断
{
DDRA=0xFF;
PORTA=spi_read();
}

//功能:使用SPI发送一个字节
void spi_write(uchar sData)
{
SPDR = sData;
while(!(SPSR & BIT(SPIF)));
//sData=SPDR;//读从机发回来的数据
}

//功能:使用SPI接收一个字节
uchar spi_read(void)
{
SPDR = 0x00;
while(!(SPSR & BIT(SPIF)));
return SPDR;
}

void init_devices(void)
{
cli(); //禁止所有中断
MCUCR = 0x00;
MCUCSR = 0x80;//禁止JTAG
GICR = 0x00;
port_init();
spi_init();
sei();//开全局中断
}
//主函数
int main(void)
{
init_devices();
spi_write(0x06);

while(1)
{
NOP();
}
return 0;
}
全部回答
#include <iom16v.h> #include <macros.h> #include "digital.h" void port_init(void) { PORTA = 0x00; DDRA = 0x00; PORTB = 0xd0; DDRB = 0xd0;//设置相应的端口为输出 PORTC = 0x00; //m103 output only DDRC = 0x00; PORTD = 0x00; DDRD = 0x00; } //SPI initialize // 时钟频率: 1000000hz void spi_init(void)//spi初始化函数 { SPCR = 0x5f; //setup SPI SPSR = 0x00; //setup SPI } //call this routine to initialize all peripherals void init_devices(void) { //stop errant interrupts until set up CLI(); //disable all interrupts port_init(); spi_init(); MCUCR = 0x00; GICR = 0x00; TIMSK = 0x00; //timer interrupt sources SEI(); //re-enable interrupts //all peripherals are now initialized } void SPI_MasterTransmit(char cData)//发送函数 { SPDR = cData; while(!(SPSR & (1<<SPIF))) ; } char SPI_SlaveReceive(void)//接收函数 { while(!(SPSR & (1<<SPIF))) ; return SPDR; } // void main(void) { unsigned data; init_devices(); PORTB&=~BIT(4); SPI_MasterTransmit(2); data=SPI_SlaveReceive(); data=data-0xfa; asm("nop"); PORTB|=BIT(4); while(1) digital_show(0,data); } 有问题请追问,没问题请采纳
http://www.cyjmcu.com/18/post/2011/11/avrspi.html 这个链接中有明确的 代码
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
技嘉970ad3p配什么cpu
吉盛源老菜馆地址在什么地方,想过去办事
欢乐斗地主怎么把它注销到没玩过的样子
锥管螺纹1:16什么意思
好久没打电话也没微信!昨天发现他把我拉黑了!
武进市海星空调设备厂在哪里啊,我有事要去这
红旗世纪星底盘悬挂与什么车相同
荆楚理工学院的起分线
英雄联盟怎么登陆密码不能输入密码
求证对边和相等的四边形有内切圆
山医大二院南院地址在什么地方,想过去办事
建筑业企业项目经理资质管理制度向建造师执业
韵致皇茶广元旗舰店地址在什么地方,想过去办
堕落的人是什么样的性格?
根据我国工业企业划分标准,大中型企业是指(
推荐资讯
内射多了会怎么样?
若某轮船在江中顺水航行与逆水航行的速度之比
浪琴,哪个城市85折或者更低,专柜
武汉腾飞人才市场是真还是假
丽人情缘摄影在什么地方啊,我要过去处理事情
星达电机轴承批发地址有知道的么?有点事想过
怎样提高自己的英语 短文阅读能力?
横县创兴家具厂怎么去啊,有知道地址的么
上海杏诚国际贸易有限公司怎么样?
岭背镇中心小学地址在什么地方,想过去办事
马为什么站着睡觉?
上津镇怎么去啊,有知道地址的么
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?