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