tota2004 发表于 2009-4-4 23:10:29

请教,关于SPI多机通信

马老师好,我这两天也在一个程序,前两天调不出来挂在论坛上求救没大有人理,这两天又改了一下,能收发数据,但是最终结果不是很理想,我用的是串口→主机→(spi)从机→串口(电脑接收),结果是我发送一个字符,发现总是先返回上一次发送的数据两次以后才能正确返回,比如,我上一次发了aa然后改发送bb的时候,总是先继续显示两个aa才能显示bb,而且当我发送一个A的时候他会返回两个AA,不知道为什么,麻烦你帮忙看一下。
程序如下:
主机:
#include<iom48v.h>
#include<macros.h>
#define ucharunsigned char
#pragma interrupt_handler uart_recv_end:19
#pragma interrupt_handler spi_send_end:18
uchar temp;
void uart_master_init(void)
{
UCSR0C=0X06;//校验位设置
UCSR0B|=BIT(RXCIE0)|BIT(RXEN0);//串口接受使能
}
void uart_buad_set(void)
{
UBRR0L=51;
UBRR0H=51>>8;//波特率设置,9600
}
void port_init(void)
{
   DDRD|=BIT(1);
DDRD&=~BIT(0);

DDRB|=BIT(2)|BIT(3)|BIT(5);
DDRB&=~BIT(4);
}
void spi_master_init(void)
{
SPCR|=BIT(SPIE)|BIT(SPE)|BIT(MSTR)|BIT(CPOL)|BIT(CPHA)|BIT(SPR1);//主机使能,中断时能
SPSR=0;
}
void spi_master_send(uchar data)
{
   SPDR = data;
   while(!(SPSR & (1<<SPIF)));
}
void main(void)
{
SREG|=BIT(7);//开总中断
//PORTB&=~BIT(2);//slave enable
uart_master_init();//串口初始化
uart_buad_set();//波特率设置
port_init();//端口设置
while(1)
{
   while(!(UCSR0A&BIT(RXC0)));//等待串口数据
temp=UDR0;//串口接收
}
}
void uart_recv_end(void)
{
   spi_master_init();//SPI初始化
PORTB&=~BIT(2);//slave enable
   spi_master_send(temp);//SPI发送
PORTB|=BIT(2);//slave disable
}
void spi_send_end(void)
{
   uart_master_init();//串口初始化
uart_buad_set();//波特率设置
}
从机:
#include<iom48v.h>
#include<macros.h>
#define ucharunsigned char
#pragma interrupt_handler spi_recv_end:18
uchar temp;
void uart_slave_init(void)
{
UCSR0C=0X06;
UCSR0B|=BIT(TXCIE0)|BIT(TXEN0);//串口发送使能
}
void uart_buad_set(void)
{
UBRR0L=51;
UBRR0H=51>>8;//波特率设置,9600
}
void port_init(void)
{
   DDRD|=BIT(1);
DDRD&=~BIT(0);

DDRB&=~(BIT(2)|BIT(3)|BIT(5));
DDRB|=BIT(4);
}
void spi_slave_init(void)
{
SPCR|=BIT(SPIE)|BIT(SPE)|BIT(CPOL)|BIT(CPHA);//从机模式,中断时能
SPSR=0;
}
void uart_slave_send(uchar data)
{
while(!(UCSR0A & (1<<UDRE0)));
UDR0= data;
while(!(UCSR0A&(BIT(TXC0))));//发送结束标志
UCSR0A|=BIT(TXC0);
}
uchar spi_slave_recv(void)
{
while (!(SPSR & (1<<SPIF)));// 等待传输结束
return SPDR;
}
void main(void)
{
SREG|=BIT(7);//开总中断
spi_slave_init();
uart_slave_init();
port_init();
while(1)
{
while(!(SPSR & (1<<SPIF)));
   temp=SPDR;
}
}
void spi_recv_end(void)
{
uart_buad_set();
uart_slave_send(temp);
}
谢谢。。。

tota2004 发表于 2009-4-5 23:40:14

问题已解决。中断和查询重复使用。。。
页: [1]
查看完整版本: 请教,关于SPI多机通信