|
奋战到凌晨终于调通。
采用查询方式,双工通讯时,主机每发送完一个字节,就要拉高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
// SCK PB7
PORTB=PORTB|0b11110000; //SCK MISO MOSI SS 使能上拉
DDRB=DDRB&0b01001111; // SCK MOSI SS 置为输入
DDRB=DDRB|0b01000001; // MISO 置为输出
// SS PB4
// MOSI PB5
// MISO PB6
// SCK PB7
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
// SCK PB7
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; //SCK MOSI 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++;
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|