新鲜出炉--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 飞翔
能不能帮小弟用中断写一个,我写了一个没有成功!想让各位大虾帮帮忙!!!! 【6楼】 huhuan521
如果 你以2分频的方式通讯的话,这么快的速度,不用中断了吧 mark 回复【7楼】yunlong 飞翔
-----------------------------------------------------------------------
小弟是想学习一下中断这个功能,暂时还没有考虑速度的问题,呵呵!!! 我公司产品都是用3线通信,不要用你的ss信号 看不懂耶。。。。。。 MARK!~~ 我可要好好研究一下子了。 这个支持一下了。 楼主好人一生平安 查询在时间上还是浪费了不少的。。。不过能够实现就是好作品。。。注意检查后期的bug 顶一个,AVR学习中
页:
[1]