kamfun 发表于 2014-3-11 09:13:10

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

第一次使用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 charSPI_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 INT16Uunsigned 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 charSPI_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)
{
}
}





kamfun 发表于 2014-3-12 10:31:14


急啊!怎么没人回复?自己先顶一个!
页: [1]
查看完整版本: 新手求助,关于ATmage128 SPI双机通讯的数据问题