Thông báo

Collapse
No announcement yet.

Vấn đề giao tiếp SPI, mong các cáo thủ giúp đỡ.

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

  • Vấn đề giao tiếp SPI, mong các cáo thủ giúp đỡ.

    Mình giao tiếp SPI giữ con master Atmega64 và con slave Atmega8, khi mô phỏng trên Proteus là chương trình chạy ok k bị lỗi lầm gì hết, nhưng khi e làm mạch thật thì chương trình k chạy đc. Bị lỗi lung tung hết.
    Mạch e kết nối thế này: 2 chân nguồn và đất của Master và Slave nối chung với nhau, các chân giao tiếp SPI thì nối như trong lý thuyết.
    Chương trình e gửi kèm theo bên dưới.

    /************************************************** ***
    This program was produced by the
    CodeWizardAVR V2.05.0 Professional
    Automatic Program Generator
    © Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
    HP InfoTech, Development Tools for Microcontrollers, C Compilers, In-System Programmers

    Project :
    Version :
    Date : 18/07/2012
    Author : NeVaDa
    Company :
    Comments:


    Chip type : ATmega8
    Program type : Application
    AVR Core Clock frequency: 8,000000 MHz
    Memory model : Small
    External RAM size : 0
    Data Stack size : 256
    ************************************************** ***/

    #include <mega8.h>
    #include <delay.h>

    // Alphanumeric LCD Module functions
    #include <alcd.h>

    unsigned char data1;
    void lcd_putnum(unsigned char so,unsigned char x,unsigned char y)
    {
    unsigned char m,n,l;
    m=so/100; // lay fan tram
    n=(so-100*m)/10; // lay fan chuc
    l=(so-100*m-10*n); // lay hang don vi
    lcd_gotoxy(x,y); // ve vi tri x,y
    lcd_putchar(m+48); // day ra hang tram, ma ascii
    lcd_putchar(n+48); // day ra hang chuc, ma ascii
    lcd_putchar(l+48); // day ra hang don vi, ma ascii
    }
    interrupt [SPI_STC] void spi_isr(void)
    {
    data1=SPDR;
    SPDR=200;

    // Place your code here

    }

    // Declare your global variables here

    void main(void)
    {
    // Declare your local variables here

    // Input/Output Ports initialization
    // Port B initialization
    // Func7=In Func6=In Func5=In Func4=Out Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=P State4=1 State3=P State2=P State1=T State0=T
    PORTB=0xff;
    DDRB=0xD3;

    // Port C initialization
    // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTC=0x00;
    DDRC=0x00;

    // Port D initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTD=0x00;
    DDRD=0x00;

    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: Timer 0 Stopped
    TCCR0=0x00;
    TCNT0=0x00;

    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer1 Stopped
    // Mode: Normal top=0xFFFF
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;

    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer2 Stopped
    // Mode: Normal top=0xFF
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;

    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    MCUCR=0x00;

    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x00;

    // USART initialization
    // USART disabled
    UCSRB=0x00;

    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;

    // ADC initialization
    // ADC disabled
    ADCSRA=0x00;

    // SPI initialization
    // SPI Type: Slave
    // SPI Clock Phase: Cycle Start
    // SPI Clock Polarity: Low
    // SPI Data Order: MSB First
    SPCR=0xC0;
    SPSR=0x00;

    // Clear the SPI interrupt flag
    #asm
    in r30,spsr
    in r30,spdr
    #endasm

    // TWI initialization
    // TWI disabled
    TWCR=0x00;

    // Alphanumeric LCD initialization
    // Connections specified in the
    // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
    // RS - PORTC Bit 0
    // RD - PORTC Bit 1
    // EN - PORTC Bit 2
    // D4 - PORTC Bit 3
    // D5 - PORTC Bit 4
    // D6 - PORTC Bit 5
    // D7 - PORTD Bit 0
    // Characters/line: 16
    lcd_init(16);
    lcd_clear();
    lcd_gotoxy(0,0);
    lcd_putsf("TEST SPI MEGA64");

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

    while (1)
    {
    // Place your code here
    lcd_putnum(data1,7,1);

    }
    }
    ////////////Master

    /************************************************** ***
    This program was produced by the
    CodeWizardAVR V2.05.0 Professional
    Automatic Program Generator
    © Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
    HP InfoTech, Development Tools for Microcontrollers, C Compilers, In-System Programmers

    Project :
    Version :
    Date : 18/07/2012
    Author : NeVaDa
    Company :
    Comments:


    Chip type : ATmega64
    Program type : Application
    AVR Core Clock frequency: 8,000000 MHz
    Memory model : Small
    External RAM size : 0
    Data Stack size : 1024
    ************************************************** ***/

    #include <mega64.h>

    // Alphanumeric LCD Module functions
    #include <alcd.h>

    // SPI functions
    #include <spi.h>
    #include <delay.h>

    // Declare your global variables here
    #define SS1 PORTB.7
    // Declare your global variables here
    unsigned char du_lieu_nhan,i;
    /////////////////////////////////////
    void lcd_putnum(unsigned char so,unsigned char x,unsigned char y)
    {
    unsigned char m,n,l;
    m=so/100; // lay fan tram
    n=(so-100*m)/10; // lay fan chuc
    l=(so-100*m-10*n); // lay hang don vi
    lcd_gotoxy(x,y); // ve vi tri x,y
    lcd_putchar(m+48); // day ra hang tram, ma ascii
    lcd_putchar(n+48); // day ra hang chuc, ma ascii
    lcd_putchar(l+48); // day ra hang don vi, ma ascii
    }
    /////////////////////////////////////
    void spi_truyen(unsigned char du_lieu)
    {
    SS1=1; delay_us(10);SS1=0;
    SPDR=du_lieu;
    while( (SPSR & 0x80)==0 );//Cho den khi SPIF set
    du_lieu_nhan=SPDR;
    SS1=1;
    }

    void main(void)
    {
    // Declare your local variables here

    // Input/Output Ports initialization
    // Port A initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTA=0x00;
    DDRA=0x00;


    // Port B initialization
    // Func7=Out Func6=In Func5=In Func4=In Func3=In Func2=Out Func1=Out Func0=Out
    // State7=0 State6=T State5=T State4=T State3=T State2=0 State1=0 State0=0
    PORTB=0xff;
    DDRB=0x87;

    // Port C initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTC=0x00;
    DDRC=0x00;

    // Port D initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTD=0x00;
    DDRD=0x00;

    // Port E initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTE=0x00;
    DDRE=0x00;

    // Port F initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTF=0x00;
    DDRF=0x00;

    // Port G initialization
    // Func4=In Func3=In Func2=In Func1=In Func0=In
    // State4=T State3=T State2=T State1=T State0=T
    PORTG=0x00;
    DDRG=0x00;

    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: Timer 0 Stopped
    // Mode: Normal top=0xFF
    // OC0 output: Disconnected
    ASSR=0x00;
    TCCR0=0x00;
    TCNT0=0x00;
    OCR0=0x00;

    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer1 Stopped
    // Mode: Normal top=0xFFFF
    // OC1A output: Discon.
    // OC1B output: Discon.
    // OC1C output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    // Compare C Match Interrupt: Off
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;
    OCR1CH=0x00;
    OCR1CL=0x00;

    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer2 Stopped
    // Mode: Normal top=0xFF
    // OC2 output: Disconnected
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;

    // Timer/Counter 3 initialization
    // Clock source: System Clock
    // Clock value: Timer3 Stopped
    // Mode: Normal top=0xFFFF
    // OC3A output: Discon.
    // OC3B output: Discon.
    // OC3C output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer3 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    // Compare C Match Interrupt: Off
    TCCR3A=0x00;
    TCCR3B=0x00;
    TCNT3H=0x00;
    TCNT3L=0x00;
    ICR3H=0x00;
    ICR3L=0x00;
    OCR3AH=0x00;
    OCR3AL=0x00;
    OCR3BH=0x00;
    OCR3BL=0x00;
    OCR3CH=0x00;
    OCR3CL=0x00;

    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    // INT2: Off
    // INT3: Off
    // INT4: Off
    // INT5: Off
    // INT6: Off
    // INT7: Off
    EICRA=0x00;
    EICRB=0x00;
    EIMSK=0x00;

    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x00;

    ETIMSK=0x00;

    // USART0 initialization
    // USART0 disabled
    UCSR0B=0x00;

    // USART1 initialization
    // USART1 disabled
    UCSR1B=0x00;

    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;

    // ADC initialization
    // ADC disabled
    ADCSRA=0x00;

    // SPI initialization
    // SPI Type: Master
    // SPI Clock Rate: 2000,000 kHz
    // SPI Clock Phase: Cycle Start
    // SPI Clock Polarity: Low
    // SPI Data Order: MSB First
    SPCR=0x50;
    SPSR=0x00;

    // TWI initialization
    // TWI disabled
    TWCR=0x00;

    // Alphanumeric LCD initialization
    // Connections specified in the
    // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
    // RS - PORTA Bit 0
    // RD - PORTA Bit 1
    // EN - PORTA Bit 2
    // D4 - PORTA Bit 4
    // D5 - PORTA Bit 5
    // D6 - PORTA Bit 6
    // D7 - PORTA Bit 7
    // Characters/line: 16
    lcd_init(16);
    lcd_clear();
    lcd_gotoxy(0,0);
    lcd_putsf("SPI ATMEGA 128");

    while (1)
    {

    // Place your code here
    for(i=0;i<=10;i++){
    spi_truyen(i);
    delay_ms(250);
    }

    }
    }

  • #2
    Bạn kể rõ bệnh của nó hơn đi. Lcd hiển thị như thế nào. Thiếu giá trị hay không đúng giá trị hay không hiển thị. Đọc code mà biết bệnh thì chuẩn đoán mới nhanh được.

    Giải pháp điện tử của bạn

    Comment


    • #3
      Lcd hiển thị không đúng giá trị bên con Slave, hiển thị toàn số 000, thỉnh thoảng hiển thị được số 004.

      Comment


      • #4
        So k có coa thủ nào giúp mình hết vậy, ai có cao kiến j giúp với.

        Comment


        • #5
          Nguyên văn bởi chinh_cover Xem bài viết
          Lcd hiển thị không đúng giá trị bên con Slave, hiển thị toàn số 000, thỉnh thoảng hiển thị được số 004.
          Hàm lcd_putnum() của bạn đã test chuẩn chưa. Mình tham gia ý kiến thế này phần hiển thị lcd trong main thì bạn thử clear màn hình đi rồi delay khoảng 30ms
          Code:
          while (1)
          {
          // Place your code here
          lcd_clear();
          lcd_putnum(data1,7,1); 
          delay_ms(30);
          
          }
          Và bạn up nguyên lý xem có vấn đề gì không. Bạn gửi trong master để delay 1s truyền 1 lần. Bạn thử nối tắt chân SS của slave xuống 0 để con slave luôn nhận rồi dùng hàm
          Code:
          unsigned char spi(unsigned char data);
          trong thư viện spi.h xem thế nào.
          Sống là để chiến đấu

          Comment


          • #6
            xem phần cứng di ! nên treo điện trở nữa!
            lập trình vi điều khiển 8051 - avr - pic- thiết kế mạch điện tử

            Học Hiểu Nguyên Tắc - Tuân Theo Nguyên Tắc - Giải Trừ Nguyên Tắc

            Comment


            • #7
              Đây là sơ đồ nguyên lý, mình đã thử nhiều nhưng vẫn không giao tiếp được. Mong các cao thủ cho biết chố sai.
              Help gấp gấp.
              PS: E giao tiếp mạch thật giữa 2 con mega8 với nhau thì không có vấn đề gì ạ!
              Attached Files
              Last edited by chinh_cover; 31-07-2012, 13:05.

              Comment


              • #8
                Thêm một chi tiết nữa để các cao thủ giúp đây, e giao tiếp lấy con mega8 làm Master, con mega128 làm Slave thì con mega128 nhận giá trị ok, không lỗi lầm gì.
                Vậy các cao thủ ai đã làm giao tiếp SPI như vậy rồi cho e hỏi SPI với Mega128 làm Master có khác gì so với mấy con AVR khác hay k ?
                PS: Đã thử treo trở 10k rồi, test đường output k bị hở mạch.

                Comment

                Về tác giả

                Collapse

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

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

                Collapse

                Đang tải...
                X