打印

新手求助,关于ATmage128 SPI双机通讯的数据问题

[复制链接]
1083|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kamfun|  楼主 | 2014-3-11 09:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
第一次使用128进行双机通讯,多有不懂,请大侠指教!!!
说明:我的双机通讯主机使用主机发送一个数据,如0x7E;从机采用中断接收,从机判断接受到0x7E后则点亮,但是问题来了,无论主机发送什么数据,虽然从机中断接收时可以的,就是从机
//SPI中断服务子程序
ISR(SPI_STC_vect)
{
   INT8U data;
  data= SPI_Receive();
if(data==0x7E)            这里为什么没起作用,就是无论接受到0X01,0X7C,下面的   PORTD = 0xFC;  //     语句都会执行,且点亮相关的灯,相应的proteus仿真附图,望高手指正,在下感激不尽~!!!  
{
  PORTD = 0xFC;  //      

}
  PORTD^=_BV(PD0);
   _delay_ms(500);
}


主机程序:
#define F_CPU 4000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>


//端口初始化
void port_init(void)
{
PORTA = 0x00;
DDRA  = 0x00;
PORTB = 0x00;
DDRB  = 0x00;
PORTC = 0x00;
DDRC  = 0x00;
PORTD = 0x00;
DDRD  = 0x00;
PORTE = 0x00;
DDRE  = 0x00;
PORTF = 0x00;
DDRF  = 0x00;
PORTG = 0x00;
DDRG  = 0x00;
}
//SPI总线初始化
void spi_init(void)
{
  SPCR = 0x70; //fosc/8
  SPSR = 0x00; //2倍
  DDRB=0X07;
  PORTB|=0X08;
}
//ATmega128初始化代码
void init_devices(void)
{
cli();
port_init();
spi_init();
sei();
  DDRA=0XFF; //设置PA端口为输出
}
//SPI总线数据发送函数
void SPI_Transmit(char cData)
{
// 启动数据传输
SPDR = cData;
//等待传输结束
while(!(SPSR & (1<<SPIF)));

}
//SPI总线数据接收函数
unsigned char  SPI_Receive(void)
{
  //等待接收结束
  while(!(SPSR & (1<<SPIF)));
  // 返回数据
  return SPDR;
}
int main()
{  
   unsigned char i;
   init_devices();
   _delay_ms(100);          //延时1ms
   SPI_Transmit(0x7E);
   while(1)
   {

    for(i=255;i>0;i--)   //循环发送
        {
          //SPI_Transmit(i);
          _delay_ms(100);     //延时
                   PORTA^=_BV(PA6);
                 PORTA &=~ (_BV(PA7));
        }
   }
}


从机部分:
#define F_CPU 4000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define INT8U   unsigned char
#define INT16U  unsigned int

unsigned char temp;   //用于存放接收到的数据
//端口初始化
void port_init(void)
{
PORTA = 0x00;
DDRA  = 0x00;
PORTB = 0x00;
DDRB  = 0x0B;                //SPI引脚方向
PORTC = 0x00;
DDRC  = 0x00;
//PORTD = 0x00;
//DDRD  = 0x00;
PORTE = 0x00;
DDRE  = 0x00;
PORTF = 0x00;
DDRF  = 0x00;
PORTG = 0x00;
DDRG  = 0x00;
DDRD=0xFF; //设置PA端口为输出
}
//SPI数据发送函数
void SPI_Transmit(char cData)
{
// 启动数据传输
SPDR = cData;
//等待传输结束
while(!(SPSR & (1<<SPIF)));
}
//SPI数据接收函数
unsigned char  SPI_Receive(void)
{
  //等待接收结束
  while(!(SPSR & (1<<SPIF)));
  // 返回数据
  return SPDR;
}
//SPI初始化函数
void spi_init(void)
{
SPCR = 0xE0; //从机工作模式
SPSR = 0x00; //清除
}
//SPI中断服务子程序
ISR(SPI_STC_vect)
{
   INT8U data;
  data= SPI_Receive();
if(data==0x7E)
{
  PORTD = 0xFC;  //

}
  PORTD^=_BV(PD0);
   _delay_ms(500);
}

//UART0初始化
/*void uart0_init(void)
{
UCSR0B = 0x00; //disable while setting baud rate
UCSR0A = 0x00;
UCSR0C = 0x06;
UBRR0L = 0x33; //set baud rate lo
UBRR0H = 0x00; //set baud rate hi
UCSR0B = 0x98;
}

//初始化ATmega128
void init_devices(void)
{
cli();
port_init();
spi_init();
// uart0_init();
sei();
}
int main()
{  
//  unsigned char temp=0x01;
  init_devices();
  while(1)
  {
  }
}

双机程序,GCC.rar

27.27 KB

protues仿真双机.rar

14.63 KB

相关帖子

沙发
kamfun|  楼主 | 2014-3-12 10:30 | 只看该作者
急啊!怎么没人回复?自己先顶一个!

使用特权

评论回复
板凳
tyw| | 2014-3-12 11:11 | 只看该作者
atmega128中文资料.pdf (3.02 MB)

使用特权

评论回复
地板
kamfun|  楼主 | 2014-3-12 20:37 | 只看该作者
这位大哥,我也有手册啊,但是就是不知道问题所在,请指教!谢谢~~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

37

帖子

2

粉丝