查看: 921|回复: 0
打印 上一主题 下一主题

AVR-ATmega16 SPI-双机通信程序

[复制链接]
跳转到指定楼层
沙发
发表于 2015-10-29 08:41:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
历时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)转载

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表