Thông báo

Collapse
No announcement yet.

cho hỏi về giao tiếp SPI

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • cho hỏi về giao tiếp SPI

    em đang viết thử SPI cho 2 con atmega128 ( em đang làm đề tài với con này và cần đến SPI của nó). nhưng mắc lỗi không mô phỏng được trên proteus. ace nào sửa hộ e với. em mắc 2 hôm nay mà không sửa được.
    master:
    Code:
    #define  F_CPU	8000000UL
    #include <avr/io.h>
    #include <util/delay.h>
    #include <string.h>
    #include <avr/interrupt.h>
    
    #define SPI_PORT 	PORTB
    #define SPI_DDR 	DDRB
    #define SS			4
    #define SCK			1
    #define MOSI		2
    #define MISO		3
    
    
    // khai bao 2 macro set bit va clear bit
    #define sbi(port,bit) port = (1<<bit)
    #define cbi(port,bit) port =~(1<<bit)
    
    
    char xau1[]="nguyentuanqs";
    
    
    void SPI_Trans(char Data)
    	{
    	while (bit_is_clear(SPSR,SPIF))
    	{};
    	SPDR = Data;
    	}
    void Transmit_SPI(char* S_Data)
    	{
    
    	for (int i=0;i<=strlen(S_Data);i++)
    		SPI_Trans(S_Data[i]);
    	}
    int main()
    	{
    	SPI_DDR  |= (1<<SCK)|(1<<MOSI); // dat SCK va MOSI lam cong ra
    	SPI_PORT |= (1<<MISO);		    // dat MISO lam cong vao.
    	cbi(PORTB,SS);
    	SPCR = (1<<SPIE)|(1<<SPE)|(1<<MSTR)|(1<<CPHA);
    	_delay_ms(100);
    	Transmit_SPI(xau1);
    	return 0;
    	}
    slave:
    Code:
    //slave
    #define  F_CPU	8000000UL
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
    #include <string.h>
    #include "myLCD.h"
    
    #define SPI_PORT 	PORTB
    #define SPI_DDR	 	DDRB
    #define SS			0
    #define SCK			1
    #define MOSI		2
    #define MISO		3
    
    
    // khai bao bien toan cuc
    	char SPI_Data;
    	int stt;
    
    int main()
    	{
    	SPI_DDR  |= (1<<MISO);
    	SPI_PORT |= (1<<SS)|(1<<MOSI);
    	SPCR	 |= (1<<SPIE)|(1<<SPE)|(1<<CPHA);
    	sei();
    	init_LCD();
    	clr_LCD();
    	while(1)
    		{
    		};
    	return 0;
    	}
    
    
    ISR(SIG_SPI)
    	{
    	SPI_Data = SPDR;
    	putChar_LCD(SPI_Data);
    	}
    ở dưới em có đính kèm theo toàn bộ project.
    Attached Files

  • #2
    mong mọi người chỉ giúp em cặm cụi mãi rồi ạ!

    Comment


    • #3
      đã tìm ra lỗi và sửa xong

      sau một hồi tự kỷ em đã tìm ra lỗi. thì ra bởi em hiểu nhầm cờ SPIF trong thanh ghi SPSR. thực ra nó báo là quá trình truyền 1 byte đã xong . em nhầm với UART là cờ báo truyền nối tiếp của nó báo là thanh ghi dữ liệu nối tiếp rỗng. quá là nhọ! em up luôn project lên cho ae xem để có ai gặp vấn đề tương tự thì biết cách xử lý
      Attached Files

      Comment


      • #4
        ban nay tu ki ghe :P
        ths ban nhe dang ngoi coi spi.
        ma sao thay xai gi den atmega 128 cao qua the
        Khánh Hùng
        tapdoanytesingapore.com
        0985743349

        Comment

        Về tác giả

        Collapse

        nguyentuanqs Tìm hiểu thêm về nguyentuanqs

        Bài viết mới nhất

        Collapse

        Đang tải...
        X