Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
13.11.2008, 14:49
|
|
Прописка
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
|
Обмен по 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); |
|
|
|
|
13.11.2008, 15:16
|
|
Прописка
Регистрация: 24.09.2008
Сообщений: 116
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Возможно printf "съедает" время в прерывании.
Принимай пакет в массив, а потом выводи!
__________________
Если мы вам не подходим, вы нам вовсе не нужны!
Услышал и забыл, увидел и запомнил, сделал и понял!
Нейрон - штука тонкая!
Чудес на свете не бывает!
|
|
|
|
13.11.2008, 17:18
|
|
Прописка
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
|
сделал варианты с прерыванием и без, и с сохранением в массив - одно и то же
скорость SPI у 2х мк одинаковая. на монитор в протеусе всё выводит правильно (в режиме монитора). в режиме slave останавливается после получения 1го байта
|
|
|
|
13.11.2008, 21:16
|
|
Прописка
Регистрация: 24.09.2008
Сообщений: 116
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Дружище! Читай матчасть! Там же все расписано!
У тебя явно с временем проблема. Мастер шлет байты один за другим, а слейв их читать не успевает. Там же буфера нет как в UART. Не считал данные стоп всему и еще флажок выставляет WCOL. Ты в протеусе пошагово одновременно два проца прогони и посмотри че у тебя в регистрах SPIных делается.
__________________
Если мы вам не подходим, вы нам вовсе не нужны!
Услышал и забыл, увидел и запомнил, сделал и понял!
Нейрон - штука тонкая!
Чудес на свете не бывает!
|
|
|
|
13.11.2008, 21:17
|
|
Прописка
Регистрация: 24.09.2008
Сообщений: 116
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Пришли проект для протеуса если не трудно, все вместе посмотрим...
__________________
Если мы вам не подходим, вы нам вовсе не нужны!
Услышал и забыл, увидел и запомнил, сделал и понял!
Нейрон - штука тонкая!
Чудес на свете не бывает!
|
|
|
|
14.11.2008, 12:30
|
|
Прописка
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
|
проект, прошика, исходник в zip
Прикрепленный файл: 9801598.zip
|
|
|
|
14.11.2008, 22:24
|
|
Прописка
Регистрация: 24.09.2008
Сообщений: 116
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Ну что ты сделал?
Надо два проца, каждый со своей программой!
Запускаешь, и жмешь F11 пока не дойдёт...
__________________
Если мы вам не подходим, вы нам вовсе не нужны!
Услышал и забыл, увидел и запомнил, сделал и понял!
Нейрон - штука тонкая!
Чудес на свете не бывает!
|
|
|
|
15.11.2008, 02:34
|
|
Прописка
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
|
тут даже имеющийся МК (slave) с SPI-монитора (master) не принимает, ни то что с другого МК
|
|
|
|
17.11.2008, 22:37
|
|
Прописка
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
|
что, никто не делал связь междку МК через SPI?
почему МК берет только 1 байт, а устройства, которые работают по SPI принимают 8?
|
|
|
|
18.11.2008, 02:41
|
|
Гражданин KAZUS.RU
Регистрация: 26.09.2005
Сообщений: 569
Сказал спасибо: 58
Сказали Спасибо 509 раз(а) в 135 сообщении(ях)
|
Попробуйте внести в подпрограмму управление 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;
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
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.
|
|