#1楼主:M8与M16 SPI通信,发送数据正确,接收不到(求教)
文章发表于:2008-08-30 10:08
M8与M16 SPI通信,M8为主机,依次发送0--8,M16接收,但在protues上仿真的结果是发送的数据是对的,但是接收不到。
请高手指点一下,编译环境GCC,程序如下:
//主机mega8
// 功能:SPI主机模式
//程序如下:
#include<avr/io.h>
#include<avr/signal.h>
#include<avr/interrupt.h>
void port_init(void)
{
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00;
DDRC = 0x00;
PORTD = 0xFF;//输出高电平
DDRD = 0xff; //D口定义输出
}
//SPI initialize
void spi_init(void)
{
PORTB|=(1<<PB2)|(1<<PB3)|(1<<PB4)|(1<<PB5);
DDRB|=(1<<DDB2)|(1<<DDB3)|(1<<DDB5); //Set MOSI, SCK AND SS as outputs
SPCR=0x53; //setup SPI
SPSR=0x00; //setup SPI
}
void init_devices(void)
{
cli(); //disable all interrupts
port_init();
spi_init();
sei();
}
void SPI_MasterTransmit(char cData)
{
PORTB &=~(1<<PB2); //强制接收方进入从模式
SPCR |= (1<<MSTR); // MSTR有时会被清零,这里强制进入主机模式
/* 启动数据传输 */
SPDR = cData;
/* 等待传输结束 */
while(!(SPSR&(1<<SPIF)))
;
PORTD = SPDR;
}
void Delay(int ms) //延时,没有详细计算
{
unsigned int i,j;
for(i=1000;i>0;i--)
{
for(j=2000;j>0;j--)
;
}
}
void delay1s(void)
{
unsigned char i;
for(i=20;i>0;i--)
{
Delay(50000);// 50ms
}
}
void main(void)
{
unsigned char k;
init_devices();
while(1)
{
for(k=0;k<9;k++)
{
SPI_MasterTransmit(k);
delay1s();
}
}
}
//从机mega16
//程序如下
# include<avr/io.h>
# include<avr/interrupt.h>
# include<avr/signal.h>
//时钟频率为10MHz
//SPI initialize
void spi_init(void)
{
SPCR = 0xC3; //setup SPI
SPSR = 0x00; //setup SPI
}
SIGNAL(SIG_SPI)
{
PORTA=SPDR;
}
void init_devices(void)
{
cli(); //disable all interrupts
spi_init();
sei(); //re-enable interrupts
}
int main(void)
{
PORTA=0XFF;
DDRA=0XFF;
init_devices();
DDRB|=(1<<PB6); //MOSI 设置为输出
while(1)
;//等待中断
}