| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
Помогите разобраться с SPI AVR
30.08.2010, 00:47
|
|
|
Прохожий
Регистрация: 29.12.2009
Сообщений: 6
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Помогите разобраться с SPI AVR
Спасибо всем!!! ТУПЛЮ... 
Сейчас буду код редактировать.
Есть еще один вопрос: вызывается ли прерывание по изменению сигнала линии SS.
|
|
|
|
30.08.2010, 01:35
|
|
|
Прохожий
Регистрация: 29.12.2009
Сообщений: 6
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Помогите разобраться с SPI AVR
|
Код:
|
void spi_tx (unsigned char dat)
{
SPDR = dat;
while(!(SPSR & (SPIF)));
delay_us(100);
}
void spi_tx_p (unsigned char regim, unsigned char but)
{
if(but==0)
{
spi_tx(255);
}
if(but==1)
{
spi_tx(regim);
}
if(but›1)
{
if(but‹11)
{
spi_tx(data[but-2]);
}
else
{
spi_tx(data_s[but-12]);
}
}
}
void main(void)
{
// Port B initialization
// Func7=Out Func6=In Func5=Out Func4=Out Func3=Out Func2=In Func1=In Func0=In
// State7=0 State6=T State5=0 State4=0 State3=0 State2=T State1=T State0=T
PORTB=0x00;
DDRB=0xB8;
// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 125,000 kHz
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=0xD3;
SPSR=0x00;
................................
data[0]=0;
data[1]=1;
data[2]=2;
while (1)
{
unsigned char i;
for(i=0;i‹22;i++)
{
spi_tx_p(2,i);
}
delay_ms(1000);
};
} |
Может компилятору хана -- задержка не работает
Теперь получаю следующую лажу:
передаю байт слейву (255), в ответ получаю (255), и так до бесконечности...
|
|
|
|
30.08.2010, 02:53
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
|
Re: Помогите разобраться с SPI AVR
Сообщение от Basan
|
|
Теперь получаю следующую лажу:
|
А где выбор слейва?
И что значит "в ответ получаю" - у Вас односторонняя передача.
Зачем задержка на 100 микросекунд?
Но уже намного ближе к работоспособному варианту, чем вначале
|
|
|
|
30.08.2010, 03:00
|
|
|
Прохожий
Регистрация: 29.12.2009
Сообщений: 6
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Помогите разобраться с SPI AVR
Сообщение от kison
|
|
А где выбор слейва?
|
|
Код:
|
#define SS PORTB.2
.............................................
void spi_tx (unsigned char dat)
{
SS=0;
SPDR = dat;
while(!(SPSR & (SPIF)));
SS=1;
} |
Так лучше???
По поводу ответа - в протеусе повесил на шину SPI анализатор.
И всетаки будет ли вызываться прерывание в слейве по переходу линии SS в 0???
Последний раз редактировалось Basan; 30.08.2010 в 03:45.
|
|
|
|
30.08.2010, 11:59
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
|
Re: Помогите разобраться с SPI AVR
Сообщение от Basan
|
|
И всетаки будет ли вызываться прерывание в слейве по переходу линии SS в 0???
|
Нет конечно.
|
|
|
|
31.08.2010, 09:05
|
|
|
Частый гость
Регистрация: 23.07.2008
Сообщений: 16
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Помогите разобраться с SPI AVR
Прерывание можно устоить замкнув SS и INT0 и настроить по спаду. Можно делать просто по таймауту SPI сброс счетчика.
Задержка тут-не пришей кобыле хвост, флаг прерывания SPI надо сбрасывать (datasheet читайте, он сбрасывается сам только по прерыванию). Еще бы неплохо сделать контроль присутствия слейва, пусть он в ответ хотя бы номер принятого байта шлет.
|
|
|
|
31.08.2010, 09:11
|
|
|
Частый гость
Регистрация: 23.07.2008
Сообщений: 16
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Помогите разобраться с SPI AVR
Сообщение от Basan
|
SS=0;
SPDR = dat;
while(!(SPSR & (SPIF)));
SS=1;
|
Вот так делать очень не рекомендую, надо перед всей посылкой сбрасывать SS и поднимать обратно только передав все.
Кстати, зачем такая сложная конструкция при передаче? Для контроля данных проще использовать CRC или хотя бы контрольную сумму. И лучше не устраивать хитрологику заполнения посылки при передаче. Вам 2 байта буфера жалко?
|
|
|
|
31.08.2010, 12:08
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
|
Re: Помогите разобраться с SPI AVR
Сообщение от alchem
|
|
Задержка тут-не пришей кобыле хвост, флаг прерывания SPI надо сбрасывать (datasheet читайте, он сбрасывается сам только по прерыванию).
|
Похоже Вам и нужно читать  О "несбрасывающемся флаге". Кстати о прерывании по перепаду SS. Его таки можно получить, настоив слейва как мастер, но оставив SS входом. MISO настроить выходом. Тогда при перепаде на SS 1-›0 SPI сам переключится в слейв и произойдет прерывание. Вот только как различить готовность данных в SPDR и перепад на SS непонятно.
|
|
|
|
31.08.2010, 12:44
|
|
|
Частый гость
Регистрация: 23.07.2008
Сообщений: 16
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Помогите разобраться с SPI AVR
Сообщение от kison
|
|
Похоже Вам и нужно читать О "несбрасывающемся флаге"
|
Alternatively, the
SPIF bit is cleared by first reading the SPI Status Register with SPIF set, then accessing
the SPI Data Register (SPDR).
Ну да, по идее "accessing the SPI Data Register (SPDR)" должно означать в том числе и запись в него. Щас дебаггером проверю
Последний раз редактировалось alchem; 31.08.2010 в 12:46.
|
|
|
|
31.08.2010, 12:54
|
|
|
Частый гость
Регистрация: 23.07.2008
Сообщений: 16
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Помогите разобраться с SPI AVR
Да, при записи в SPDR бит сбрасывается. Нашел, где я читал что надо его сбрасывать:
|
Сообщение от AT89C51ED2
|
Software clears SPIF by reading
the Serial Peripheral Status register (SPSTA) with the SPIF bit set, and then reading the
SPDAT
|
Вот что значит писать под несколько платформ сразу
Последний раз редактировалось alchem; 31.08.2010 в 13:03.
Причина: нашел
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 22:21.
|
|