历时3天(由于第一天去研究所帮忙3/4天,第二天拆解彩电用去3/4天,其实也不算3天)的双机通信终于结束了,做到第三天晚上的时候,终于发现是一个悲剧。哎,其实我第一天就做出来了,是硬件的问题啊,导致我又十分郁闷的又多调试了2天,杯具啊。今天下午的时候,我就在想,程序是一定没有问题的,那么肯定是硬件出了问题。教训是十分深刻的。以后考虑要全面,不仅仅要考虑主观因素,也要考虑客观因素,两者的侧重不能偏离的太远,否则,是会出现悲剧的。
以下是源程序,给后来人以参考;
主机:
//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;
}
以下是源文件和仿真文件点击此处下载 ourdev_566813TGM0IY.rar(文件大小:14K) (原文件名:SPI双机通信.rar)转载
|