yunlong 发表于 2009-10-12 01:57:07

新鲜出炉--SPI 双机全双工通讯,源代码,仿真。(原创哈)

奋战到凌晨终于调通。
采用查询方式,双工通讯时,主机每发送完一个字节,就要拉高SS。否则,从机的发送结束标志不会置位。
就这个小小的问题搞了一晚。
http://cache.amobbs.com/bbs_upload782111/files_19/ourdev_490581.jpg
(原文件名:123.jpg)

点击此处下载 ourdev_490582.rar(文件大小:17K) (原文件名:SPI双机双工通讯.rar)

//从机
#include <iom16v.h>
#include <macros.h>

void main()
{
unsigned char GH=0X45;
DDRC= 0XFF;
PORTC=0X00;
// SS   PB4
// MOSI PB5
// MISO PB6
// SCKPB7
PORTB=PORTB|0b11110000; //SCK MISO MOSI SS使能上拉   

DDRB=DDRB&0b01001111;   // SCKMOSI SS 置为输入

DDRB=DDRB|0b01000001;   // MISO 置为输出


// SS   PB4
// MOSI PB5
// MISO PB6
// SCKPB7

SPCR =0b01000000;//不用中断,使能SPI,MSB首先发送,SPI置为从机模式,
                   //SCK空闲时为低,低电平采样,4分频
        SPSR = 0x00;


while(1)
{
SPDR=GH; //向发送缓冲区写数据
while(!(SPSR&(1<<SPIF))); //等待发送结束
PORTC=SPDR; //读取接收到的从机数据,并显示
GH++;
}
}



//主机
#include <iom16v.h>
#include <macros.h>

// SS   PB4
// MOSI PB5
// MISO PB6
// SCKPB7

void main()
{
unsigned int XX;
unsigned char FF,GHJ;
CLI();
DDRA= 0XFF;
DDRC= 0XFF;


PORTB=PORTB|0b11110000; //SCK MISO MOSI SS使能上拉   
DDRB=DDRB&0b10111111;   //MISO 置为输入
DDRB=DDRB|0b10110001;   //SCKMOSI SS 置为输出

SPCR =0b01010000; //不用中断,使能SPI,MSB首先发送,SPI置为主机模式,
                   //SCK空闲时为低,低电平采样,4分频
SPSR = 0x00;      


while(1)
{
PORTB=PORTB&0b11101111; //拉低从机SS准备通讯
SPDR=GHJ;//向缓冲区写数据以启动通讯
while(!(SPSR&(1<<SPIF))); //等待发送结束
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++;

}

}

yunlong 发表于 2009-10-12 17:56:38

自个顶!!!

aiyige 发表于 2009-10-12 18:58:02

建议写成中断的,我帮你顶!

yunlong 发表于 2009-10-12 20:25:47

回二楼,
个人感觉。不一定全对。

双机通讯的话,这么快的速度,不用中断了吧。
进中断还要保护现场,出中断也要恢复现场。
中断一次只能接收一个字节。这样算起来的话,速度也不见得快多少。

Ryan 发表于 2009-12-12 15:14:31

顶起

dgdjfw 发表于 2009-12-12 17:30:45

支持一下

huhuan521 发表于 2010-3-9 22:28:18

yunlong 飞翔
能不能帮小弟用中断写一个,我写了一个没有成功!想让各位大虾帮帮忙!!!!

yunlong 发表于 2010-3-10 17:57:18

【6楼】 huhuan521
如果 你以2分频的方式通讯的话,这么快的速度,不用中断了吧

cuikai12345 发表于 2010-3-10 18:12:33

mark

huhuan521 发表于 2010-3-10 21:51:37

回复【7楼】yunlong 飞翔
-----------------------------------------------------------------------

小弟是想学习一下中断这个功能,暂时还没有考虑速度的问题,呵呵!!!

xuejianhua1986 发表于 2010-3-11 18:05:24

我公司产品都是用3线通信,不要用你的ss信号

zhq1989723 发表于 2010-8-4 20:01:08

看不懂耶。。。。。。

ljt8015 发表于 2010-8-4 22:19:32

MARK!~~

yujian12365 发表于 2010-9-9 18:19:40

我可要好好研究一下子了。

haolaishi 发表于 2012-11-6 16:25:23

这个支持一下了。

Eve昔枫 发表于 2012-11-6 16:26:37

oldmen 发表于 2012-11-12 08:12:20

楼主好人一生平安

Doctor_A 发表于 2012-11-12 08:43:07

查询在时间上还是浪费了不少的。。。不过能够实现就是好作品。。。注意检查后期的bug

czp123123 发表于 2012-11-12 11:43:23

顶一个,AVR学习中
页: [1]
查看完整版本: 新鲜出炉--SPI 双机全双工通讯,源代码,仿真。(原创哈)