返回该小组首页 回复主题
qinshaoq

qinshaoq

小组等级:     E币:107  (E币换礼)

#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)
 ;//等待中断


}

快速回复主题--如果想加入编辑器功能,建议使用 [高级回复]

您目前还不是小组成员,请先加入

回复贴子区

用户名:    您没有注册?

密码:    忘记了密码?

内容:

  • DesignDesign
  • HTMLHTML

浏览该小组的用户还看过...

所有小组精华文章