Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 13.11.2008, 14:49  
code-by
Прописка
 
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
code-by на пути к лучшему
По умолчанию Обмен по SPI - из 8 байтов берет только первый

приветсвую
пробую делать связь по SPI между 2-мя mega16 (1й master, 2й slave). Slave из 8 байтов пакета принимает только первый. где может быть ошибка? (использую СAVR2).

Master:

Код:
void SPI_send(char cData)
{
      /* Start transmission */
      SPDR = cData;
      /* Wait for transmission complete */
      while(!SPSR.7);
}

...

void main()
{

PORTB=0x00;
DDRB=0xB0;

// SPI Type: Master
// SPI Clock Rate: 31,250 kHz
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=0x53;
SPSR=0x00;

...

while(1)
{
      PORTB.4=0; // SS
      for(i=1;i‹=8;i++)
            SPI_send(i*2); // send data
      PORTB.4=1; // SS
};
}
Slave:

Код:
// SPI interrupt service routine
interrupt [SPI_STC] void spi_isr(void)
{
      unsigned char data;
      data=SPDR;
      printf("%02X

",(unsigned char) data);    
}

void main(void)
{

PORTB=0x00;
DDRB=0x40;

// SPI Type: Slave
// SPI Clock Rate: 31,250 kHz
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=0xC3;
SPSR=0x00;

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

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

while(1);
Реклама:
code-by вне форума  
Непрочитано 13.11.2008, 15:16  
ra9mig
Прописка
 
Регистрация: 24.09.2008
Сообщений: 116
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
ra9mig на пути к лучшему
По умолчанию

Возможно printf "съедает" время в прерывании.
Принимай пакет в массив, а потом выводи!
__________________
Если мы вам не подходим, вы нам вовсе не нужны!
Услышал и забыл, увидел и запомнил, сделал и понял!
Нейрон - штука тонкая!
Чудес на свете не бывает!
ra9mig вне форума  
Непрочитано 13.11.2008, 17:18  
code-by
Прописка
 
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
code-by на пути к лучшему
По умолчанию

сделал варианты с прерыванием и без, и с сохранением в массив - одно и то же
скорость SPI у 2х мк одинаковая. на монитор в протеусе всё выводит правильно (в режиме монитора). в режиме slave останавливается после получения 1го байта
code-by вне форума  
Непрочитано 13.11.2008, 21:16  
ra9mig
Прописка
 
Регистрация: 24.09.2008
Сообщений: 116
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
ra9mig на пути к лучшему
По умолчанию

Дружище! Читай матчасть! Там же все расписано!
У тебя явно с временем проблема. Мастер шлет байты один за другим, а слейв их читать не успевает. Там же буфера нет как в UART. Не считал данные стоп всему и еще флажок выставляет WCOL. Ты в протеусе пошагово одновременно два проца прогони и посмотри че у тебя в регистрах SPIных делается.
__________________
Если мы вам не подходим, вы нам вовсе не нужны!
Услышал и забыл, увидел и запомнил, сделал и понял!
Нейрон - штука тонкая!
Чудес на свете не бывает!
ra9mig вне форума  
Непрочитано 13.11.2008, 21:17  
ra9mig
Прописка
 
Регистрация: 24.09.2008
Сообщений: 116
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
ra9mig на пути к лучшему
По умолчанию

Пришли проект для протеуса если не трудно, все вместе посмотрим...
__________________
Если мы вам не подходим, вы нам вовсе не нужны!
Услышал и забыл, увидел и запомнил, сделал и понял!
Нейрон - штука тонкая!
Чудес на свете не бывает!
ra9mig вне форума  
Непрочитано 14.11.2008, 12:30  
code-by
Прописка
 
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
code-by на пути к лучшему
По умолчанию

проект, прошика, исходник в zip

Прикрепленный файл: 9801598.zip
code-by вне форума  
Непрочитано 14.11.2008, 22:24  
ra9mig
Прописка
 
Регистрация: 24.09.2008
Сообщений: 116
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
ra9mig на пути к лучшему
По умолчанию

Ну что ты сделал?
Надо два проца, каждый со своей программой!
Запускаешь, и жмешь F11 пока не дойдёт...
__________________
Если мы вам не подходим, вы нам вовсе не нужны!
Услышал и забыл, увидел и запомнил, сделал и понял!
Нейрон - штука тонкая!
Чудес на свете не бывает!
ra9mig вне форума  
Непрочитано 15.11.2008, 02:34  
code-by
Прописка
 
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
code-by на пути к лучшему
По умолчанию

тут даже имеющийся МК (slave) с SPI-монитора (master) не принимает, ни то что с другого МК
code-by вне форума  
Непрочитано 17.11.2008, 22:37  
code-by
Прописка
 
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
code-by на пути к лучшему
По умолчанию

что, никто не делал связь междку МК через SPI?

почему МК берет только 1 байт, а устройства, которые работают по SPI принимают 8?
code-by вне форума  
Непрочитано 18.11.2008, 02:41  
marera
Гражданин KAZUS.RU
 
Регистрация: 26.09.2005
Сообщений: 569
Сказал спасибо: 58
Сказали Спасибо 509 раз(а) в 135 сообщении(ях)
marera на пути к лучшему
По умолчанию

Попробуйте внести в подпрограмму управление SS, это даст Slave(у) время на размышление
void SPI_send(char cData)
{
/* Start transmission */
!!!!!! PORTB.4=0; // SS
SPCR=(1‹‹6); // и установка бита помогает
SPDR = cData;
/* Wait for transmission complete */
while(!SPSR.7);
!!!!!! PORTB.4=1; // SS
}
И луше
// SPI Clock Polarity: High
т.е.
SPCR=0x5B;
marera вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++ обмен данными через USB Boris_Britva Микроконтроллеры, АЦП, память и т.д 8 24.06.2008 11:58
RTC ds1307.. не могу прочитать сразу нельсколько байтов godz320 Микроконтроллеры, АЦП, память и т.д 1 22.01.2008 12:13
обмен информацией по IrDA на PIC16F84A EXIS Микроконтроллеры, АЦП, память и т.д 4 26.12.2007 15:54
Обмен МК со Slave устройствами по I2C EugVor Микроконтроллеры, АЦП, память и т.д 3 25.05.2006 11:39
Подскажите, как считать несколько байтов из 24lc64 в pic??? Pavel645499 Микроконтроллеры, АЦП, память и т.д 15 25.10.2005 20:42


Часовой пояс GMT +4, время: 10:29.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot