1. THÔNG BÁO TUYỂN ADMIN DIỄN ĐÀN 2013
    Tìm kiếm nhà trọ - Ở ghép
    THÔNG BÁO BÁN ÁO SPKT.NET CHO THÀNH VIÊN DIỄN ĐÀN


    HÃY TÌM KIẾM Ở ĐÂY TRƯỚC KHI ĐẶT CÂU HỎI
    {xen:phrase loading}

Giao tiếp SPI

Thảo luận trong 'Lập trình C cho vi điều khiển AVR cơ bản' bắt đầu bởi viethm06112100, 18 Tháng mười một 2009.

  1. viethm06112100 New Member

    Số bài viết: 12
    Đã được thích: 0
    Điểm thành tích: 0
    Hồ Minh Việt
    Lớp: 06112CLC
    MSSV: 06112100

    Atmega128 là Master, Atmega16 là Slave
    -Master đọc dip switch (PORTA) truyền qua cho Slave hiển thị ở PORTC
    -Ngược lại Slave cũng đọc dip switch (PORTA) truyền qua cho Master hiển thị (PORT C)
    Ví dụ này dựa theo giáo trình nhưng đã có sữa chữa của tác giả.

    Code:
    Atmega128:
    #include <mega128.h>
    #define SPI_output_data PORTC
    #define SPI_input_data PINA
    // SPI interrupt service routine
    interrupt [SPI_STC] void spi_isr(void)
    {
    SPI_output_data=SPDR;
    PORTB.0=0;
    SPDR=SPI_input_data;
    }
    void main(void)
    {
    PORTA=0xFF;
    DDRA=0x00;
    PORTB=0x01;
    DDRB=0x07;
    PORTC=0xFF;
    DDRC=0xFF;
    // SPI initialization
    // SPI Type: Master
    // SPI Clock Rate: 375.000 kHz
    // SPI Clock Phase: Cycle Half
    // SPI Clock Polarity: Low
    // SPI Data Order: MSB First
    SPCR=0xD1;
    SPSR=0x00;
    // Clear the SPI interrupt flag
    #asm
    in r30,spsr
    in r30,spdr
    #endasm

    // Global enable interrupts
    #asm("sei")
    SPDR=0x00;
    while (1)
    {
    };
    }
    Atmega16:

    #include <mega16.h>
    #define SPI_output_data PORTC
    #define SPI_input_data PINA
    // SPI interrupt service routine
    interrupt [SPI_STC] void spi_isr(void)
    {
    SPI_output_data=SPDR;
    SPDR=SPI_input_data;
    }
    void main(void)
    {
    PORTA=0xFF;
    DDRA=0x00;
    PORTB=0xB0;
    DDRB=0x40;
    PORTC=0xFF;
    DDRC=0xFF;
    // SPI initialization
    // SPI Type: Slave
    // SPI Clock Rate: 375.000 kHz
    // SPI Clock Phase: Cycle Half
    // SPI Clock Polarity: Low
    // SPI Data Order: MSB First
    SPCR=0xC1;
    SPSR=0x00;
    // Clear the SPI interrupt flag
    #asm
    in r30,spsr
    in r30,spdr
    #endasm

    // Global enable interrupts
    #asm("sei")

    while (1)
    {
    // Place your code here

    };
    }

Chia sẻ trang này