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

 
 
> 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
 
Start new topic
Ответов
VladimirYU
сообщение Nov 13 2008, 06:27
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(Yurik32 @ Nov 12 2008, 01:53) *
С одной стороны ARM (SPI Master), с другой ATMega8535L. (Тактируется внутренним RC - 8Мгц)
Частота SPI - 1МГц.


/* Wait for reception complete */
while(!(SPSR & (1<<SPIF))) {}; // <<< --- Такое ощущение, что здесь }[/code]

Что я делаю не так ? Есть какие то идеи ?


У меня один раз было на двух мегах 128-ых из одной партии:
После выхода из while у SLAVE в SPDR проскакивала всякая хрень, ошибка была в бите который мастер выталкивал последним. Посмотрел осциллом передачу от Мастера и ох...ел, 7 битов вытакивались равномероно с частотой клоков, как положено, а последний бит выталкивался (и последний 8-ой клок) после паузы примерно на время передачи байта, а следующий байт сообщения от Мастера шел сразу за последним битом. У слэйва крыша съезжала. Обошел следующим образом: вставил задержку у мастера между посылками байтов - помогло. Потом в следующей версии ПО передачу от мастера сделал по прераванию от SPIF и подобной прооблемы не было. В последующих приборах проверял обе версии ПО для Мастера, больше этот косяк не всплывал. В итоге списал все на глюк в конкретной меге.
Go to the top of the page
 
+Quote Post



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

 


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


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