Chào mọi người!
Em thực hiện giao tiếp SPI giữa các atmega32 giống như bài trên trang hocavr:
Bài 7 - Giao tiếp SPI
Em mô phỏng đã chạy trên protues, nhưng khi mô phỏng trong khoảng 1s đầu thì xuất hiện cảnh báo data overrun - received data is lost.
Code em viết như sau:
code của slave :
code của master:
#include <mega32.h>
#include <delay.h>
unsigned char wdata[3]={0,80,160}, dis[];
void SPI_masterinit();
void SPI_transmit(unsigned char i, unsigned char data);
#define slave0 PORTB.0
#define slave1 PORTB.1
#define slave2 PORTB.2
void main(void)
{
//define port for SPI
PORTB= 0xE7;
DDRB= 0xA7;
SPI_masterinit();
delay_ms(100);
while (1)
{
SPI_transmit(0,wdata[0]++);
if(wdata[0]>80) wdata[0]=0;
delay_ms(10);
SPI_transmit(1,wdata[1]++);
if(wdata[1]>160) wdata[1]=80;
delay_ms(10);
SPI_transmit(2,wdata[2]++);
if(wdata[2]>240) wdata[2]=160;
delay_ms(10);
delay_ms(500);
}
}
void SPI_masterinit()
{
SPCR=0xD2;
}
void SPI_transmit(unsigned char i, unsigned char data)
{
if(i==0) slave0= 0;
if(i==1) slave1= 0;
if(i==2) slave2= 0;
delay_ms(10);
SPDR= data;
while(SPIF==0){};
slave0= 1;
slave1= 1;
slave2= 1;
}
Xin mọi người xem thử mình code sai chỗ nào ạ!
Em thực hiện giao tiếp SPI giữa các atmega32 giống như bài trên trang hocavr:
Bài 7 - Giao tiếp SPI
Em mô phỏng đã chạy trên protues, nhưng khi mô phỏng trong khoảng 1s đầu thì xuất hiện cảnh báo data overrun - received data is lost.
Code em viết như sau:
code của slave :
#include <mega32.h>
#include <lcd_4bit.h>
#include <stdio.h>
void SPI_slaveinit();
unsigned char wdata=16, rdata;
void main(void)
{
//define port for LCD
PORTD=0xCF;
DDRD=0xCF;
PORTC=0x4F;
DDRC=0x0F;
SPI_slaveinit();
delay_ms(60);
init_LCD();
wr_cmd_nibble(0x02);
#asm("sei");
while (1)
{
// Place your code here
}
}
void SPI_slaveinit()
{
//define port for SPI
PORTB=0xB0;
DDRB=0x40;
SPCR= 0xC2;
}
interrupt [SPI_STC] void spi_isr(void)
{
unsigned char dis[16];
rdata=SPDR;
wr_cmd_nibble(0x02);
sprintf(dis,"%i",rdata);
go_to_XY(1,1);
wr_LCD_data(dis);
}
#include <lcd_4bit.h>
#include <stdio.h>
void SPI_slaveinit();
unsigned char wdata=16, rdata;
void main(void)
{
//define port for LCD
PORTD=0xCF;
DDRD=0xCF;
PORTC=0x4F;
DDRC=0x0F;
SPI_slaveinit();
delay_ms(60);
init_LCD();
wr_cmd_nibble(0x02);
#asm("sei");
while (1)
{
// Place your code here
}
}
void SPI_slaveinit()
{
//define port for SPI
PORTB=0xB0;
DDRB=0x40;
SPCR= 0xC2;
}
interrupt [SPI_STC] void spi_isr(void)
{
unsigned char dis[16];
rdata=SPDR;
wr_cmd_nibble(0x02);
sprintf(dis,"%i",rdata);
go_to_XY(1,1);
wr_LCD_data(dis);
}
#include <mega32.h>
#include <delay.h>
unsigned char wdata[3]={0,80,160}, dis[];
void SPI_masterinit();
void SPI_transmit(unsigned char i, unsigned char data);
#define slave0 PORTB.0
#define slave1 PORTB.1
#define slave2 PORTB.2
void main(void)
{
//define port for SPI
PORTB= 0xE7;
DDRB= 0xA7;
SPI_masterinit();
delay_ms(100);
while (1)
{
SPI_transmit(0,wdata[0]++);
if(wdata[0]>80) wdata[0]=0;
delay_ms(10);
SPI_transmit(1,wdata[1]++);
if(wdata[1]>160) wdata[1]=80;
delay_ms(10);
SPI_transmit(2,wdata[2]++);
if(wdata[2]>240) wdata[2]=160;
delay_ms(10);
delay_ms(500);
}
}
void SPI_masterinit()
{
SPCR=0xD2;
}
void SPI_transmit(unsigned char i, unsigned char data)
{
if(i==0) slave0= 0;
if(i==1) slave1= 0;
if(i==2) slave2= 0;
delay_ms(10);
SPDR= data;
while(SPIF==0){};
slave0= 1;
slave1= 1;
slave2= 1;
}
Comment