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

 
 
> 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
Ответов
SysRq
сообщение Nov 11 2008, 23:24
Сообщение #2


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата(Yurik32 @ Nov 12 2008, 01:53) *
// Clear the SPI interrupt flag
#asm
in r30,spsr
#endasm
Не надо этого.
Цитата
SPIF is cleared by hardware when executing the corresponding interrupt handling vector. Alternatively, the SPIF bit is cleared by first reading the SPI Status Register with SPIF set, then accessing the SPI Data Register (SPDR).


Цитата(Yurik32 @ Nov 12 2008, 01:53) *
while(!(SPSR & (1<<SPIF))) {}; // <<< --- Такое ощущение, что здесь программа уходит в ступор
У вас ведь разрешено прерывание от SPI, и разрешены прерывания глобально. Как только SPIF взводится - вызывается прерывание и его сбрасывает. Оставить что-то одно может?

На SS должен быть низкий уровень.

Сообщение отредактировал SysRq - Nov 11 2008, 23:34
Go to the top of the page
 
+Quote Post
Yurik32
сообщение Nov 12 2008, 21:28
Сообщение #3





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



Цитата(SysRq @ Nov 12 2008, 02:24) *
Не надо этого.

Убрал.

Цитата(SysRq @ Nov 12 2008, 02:24) *
На SS должен быть низкий уровень.

Все сигналы генерируются верно. Смотрел осциллографом.

Сделал только на прерывании - не работает, потом переделал только на полинге SPIF - тож не работает. Симптомы те же. Я уж прям не знаю к чему придраться. Начинаю грешить на контроллер. Завтра на другом(ATMega16) попробую сделать.
Go to the top of the page
 
+Quote Post



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

 


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


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