Цитата(evg123 @ Jan 23 2007, 21:55)

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

У меня был проект, в котором необходимо было связать два проц-а по 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;
}