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

 
 
> SPI SLAVE в C8051F310
evg123
сообщение Jan 23 2007, 18:55
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 353
Регистрация: 11-09-06
Из: Минск
Пользователь №: 20 282



Помогите плз.

Никак не могу настроить режим SLAVE в ентом контроллере.
Непонятен следующие моменты при работе с прерыванием:
- как определить первый байт в пакете
- или (вытекает из первог), как определить момент выбора ведомого (т.е. момент перепада с 1 в 0 входа SS) и его отключения (момент перепада с 0 в 1 входа SS).

Заранее благодарю help.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
mihask
сообщение Jan 24 2007, 07:46
Сообщение #2


Частый гость
**

Группа: Validating
Сообщений: 80
Регистрация: 7-12-05
Пользователь №: 11 905



Цитата(evg123 @ Jan 23 2007, 21:55) *
Помогите плз.

Никак не могу настроить режим SLAVE в ентом контроллере.
Непонятен следующие моменты при работе с прерыванием:
- как определить первый байт в пакете
- или (вытекает из первог), как определить момент выбора ведомого (т.е. момент перепада с 1 в 0 входа SS) и его отключения (момент перепада с 0 в 1 входа SS).

Заранее благодарю help.gif


У меня был проект, в котором необходимо было связать два проц-а по SPI (ведущий С8051F040, ведомый С8051F023).
Вот часть кода ведомого (С8051F023), отвечающая за настройку модуля SPI и передачу данных ведущему (C8051F040).
Думаю, что модуль SPI один и тот же во всей линейке 51-ых у Cygnal.

Каждый принятый байт по SPI генерирует прерывание SPI_isr.

/*----------------------------------------------------------------
* SPI Configuration
*----------------------------------------------------------------
*/
SPI0CN = 0x00; // Выключаем модуль SPI, сбрасываем все флаги.
SPI0CFG = 0x07; // Задаём конфигурацию модуля.
SPI0CKR = 0x0C; // Задаём тактовую частоту модуля SPI (должна совпадать с ведущим).
SPI0CN |= 0x01; // Включаем модуль SPI.

EIE1 |= (1 << 0); // Разрешаем прерывания модулю SPI



/*------------------------------------------------------------------------------
* Обработка прерывания модуля SPI.
* Данные (tbufSPI []) передаются от slave-а к master-у.
*------------------------------------------------------------------------------
*/
void SPI_isr (void) interrupt 6 using 2
{
EA = 0;
if (SPIF)
{
SPIF = 0;

if (tSPI_in != tSPI_out)
{
CheckSum = CheckSum ^ tbufSPI [tSPI_out];
SPI0DAT = tbufSPI [tSPI_out++];
}
else
{
SPI0DAT = CheckSum;
tSPI_in = 0;
tSPI_out = 0;
}
}
else
{
WCOL = 0;
MODF = 0;
RXOVRN = 0;
}
EA = 1;
}
Go to the top of the page
 
+Quote Post



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

 


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


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