реклама на сайте
подробности

 
 
> ATMega8535 SPI Slave Mode trouble, не устанавливается флаг SPIF
Yurik32
сообщение Nov 11 2008, 22:53
Сообщение #1





Группа: Новичок
Сообщений: 8
Регистрация: 4-04-06
Пользователь №: 15 803



С одной стороны ARM (SPI Master), с другой ATMega8535L. (Тактируется внутренним RC - 8Мгц)
Частота SPI - 1МГц.

Проверяю как. Беру отправляю байт с АРМа, и ожидаю каких то
импульсов на PORTD.7/ PORTD.6 AVRa. Их конечно же нету.

на ARMе получаю первый байт 0b11001100. как и ожидалось. а
последующее - тэ которые посылал с АРМа. Тоесть данные возвращаются,
что свидетельствует о том что они не были программно принятые в AVRе.

Исходний код AVRа (проект в CodeVisionAVR):
Код
#include <MEGA8535.H>
#include <stdio.h>
#include <delay.h>

#include "header.h"

interrupt [SPI_STC] void spi_isr(void)
{
    unsigned char data;  
        PORTD.6 = 0;    
        PORTD.6 = 1;
// Clear the SPI interrupt flag
#asm
    in   r30,spsr
#endasm
        data = SPDR;            
        PORTD.6 = 0;
}

void main(void)                                        
{
    unsigned char tmp;

    #asm ("cli") //Выкл. глоб. прерывания
    
    // Input/Output Ports initialization
    // Port A initialization
    PORTA=0x00;      
    DDRA=0x00;
    // Port B initialization
    PORTB=0x00;
    DDRB=0b00000111;
    // Port C initialization
    PORTC=0x00;
    DDRC=0xFF;
    // Port D initialization
    PORTD=0x00;
    DDRD=0b11000000;    
    
    // SPI initialization              
    /* Set MISO output */    
    DDRB.6 = 1; //DDR_SPI = (1<<DD_MISO);

// SPI initialization
// SPI Type: Slave
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First

//    SPCR=0xC0;
    SPCR=0x80;    
    SPSR=0x00;

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

/* Enable SPI */
SPCR |= (1<<SPE);
    
    
// Global enable interrupts
#asm("sei")
        
    while (1)
    {        
        SPDR = 0b11001100;        
        
        /* Wait for reception complete */
        while(!(SPSR & (1<<SPIF))) {};       //   <<< ---  Такое ощущение, что здесь программа уходит в ступор

        tmp = SPDR;                                              
        tmp = SPSR;
        tmp = tmp & 0b10000000;                
        if (tmp)
        {                
                PORTD.7 = 0;    
                PORTD.7 = 1;    
                PORTD.7 = 0;      
        }        
                
//        delay_ms(1000);      

    };
}


Что я делаю не так ? Есть какие то идеи ?
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 00:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.01358 секунд с 7
ELECTRONIX ©2004-2016