|
最近刚学习SPI通讯,想用双机通讯,分别接受对方的数据并且用LED显示,发现了一个小小的区别(当分别用不同的工作模式时SS的设置很重要),这是我通过多次实验才调试出来的,虽然技术含量不高,希望能够帮助和我一样刚刚学习AVR的朋友,呵呵!!!
注:大家注意两个不同模式时SS的设置!!!(为了判断数据的正误,我用了主从发送同样是数据)
SPI中断:两片16分别把自己的数据传给对方,并显示!
主机1:
#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
#pragma interrupt_handler man:11
uchar temp=1;
void delay_ms (uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1141;j++);
}
}
void man()
{
PORTB=0b01010000; //先拉高SS,读取来自从机的数据
PORTD=SPDR;
delay_ms(1000); //看不清可以延时
PORTB=0b01000000; //拉低SS,准备写入数据
SPDR=++temp; //写入数据
}
void main()
{
DDRB=0b10110000; // 设置SS,MOIS,SLK输入,MIOS为输出
PORTB=0b01010000; // 拉高SS,MIOS为带上拉,其他输出0
DDRD=0xff; //设置PD口为LED输出
SPCR=0b11010000; //设置为主机,使能中断和SPI(注意:此处的使用第0
种工作模式(先锁后移)
SPSR=0;
SREG|=BIT(7); //使能全部中断
PORTB=0b01000000; //拉低SS
//delay_ms(50);
SPDR=temp; //写入数据开启SPI
while(1)
{
;
}
}
从机1:
#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
void delay_ms (uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1141;j++);
}
}
void main ()
{
uchar date=1;
DDRB=0b01000000;
PORTB=0b10110000;
DDRD=0xff;
SPCR=0b01000000; //此处和主机一样的工作模式(先锁后移)
SPSR=0;
while(1)
{
while(!(SPSR&(1<<SPIF))); //确定传输完毕
PORTD=SPDR; //读取从主机来的数据
SPDR=++date; //写入数据
}
}
主机2:
#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
#pragma interrupt_handler man:11
uchar temp=1;
void delay_ms (uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1141;j++);
}
}
void man()
{
//PORTB=0b01010000; //当使用1或3模式是(先移后锁),此处可以省略(拉高
SS)
PORTD=SPDR;
//delay_ms(1000); //看不清可延时
//PORTB=0b01000000; // 拉低SS,但是可以省去
SPDR=++temp;
}
void main()
{
DDRB=0b10110000;
PORTB=0b01010000;
DDRC|=0x01;
DDRD=0xff;
SPCR=0b11010100; //使用1工作模式(先移后锁)
SPSR=0;
SREG|=BIT(7);
PORTB=0b01000000;
//delay_ms(50);
SPDR=temp;
while(1)
{
;
}
}
从机2:
#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
void delay_ms (uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1141;j++);
}
}
void main ()
{
uchar date=1;
DDRB=0b01000000;
PORTB=0b10110000;
DDRD=0xff;
SPCR=0b01000100;
SPSR=0;
while(1)
{
while(!(SPSR&(1<<SPIF)));
PORTD=SPDR;
SPDR=++date;
}
}
![](http://cache.amobbs.com/bbs_upload782111/files_27/ourdev_538221.jpg)
(原文件名:clip_image001.jpg)
学习SPI的一些小笔记ourdev_538222.doc(文件大小:10K) (原文件名:新建 Microsoft Word 文档.doc) |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|