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

 
 
> 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
Ответов
evg123
сообщение Jan 25 2007, 16:02
Сообщение #2


Местный
***

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



Спасибо за помощь.


Вот как я реализовал Slave (если интересно):

// Формат запроса от Master - |Команда|Данные1|...|ДанныеN|

void Init_SPI0(byte speed)
{
IE |= 0x40;//SPI0 interrupt enable
IP |= 0x40;//SPI0 priority enable
XBR0 |= 0x02;//routed SPI to crossbar
SPI0CKR=speed; //max speed=0 ; min = 0xFF
SPI0CFG=_0b00010000;
SPI0CN= _0b00000101;
}

void SPI0_ISR (void) interrupt 6 using 2
{
static data char *p_buf;
static data char Rsv_N=0;
static data char N=0;

EA=0;
if(SPIF){
SPIF = 0;
if (N != Rsv_N){
//tmp=p_buf[Rsv_N]; //передача данных +
p_buf[N++]=SPI0DAT; //прием данных |
//SPI0DAT=tmp; // <-----+
}else{
//Прием первого байта и определение операции
switch(SPI0DAT)//Команды от мастера
{
case GET_KEY: //p_buf=&key;
SPI0DAT=key; //передача key
Rsv_N=0;
break;
case SET_HD: p_buf=Dis_Buf; //Загружаю адрес приемника
Rsv_N=SIZE_HD; //и его длину
break;
case SET_LED: p_buf=LED;
Rsv_N=SIZE_LED;
break;
case SET_BEEP: p_buf=bp.buf;
Rsv_N=SIZE_BEEP;
break;
default: p_buf=0;
Rsv_N=0;
break;
}
N=0;
//SPI0DAT=p_buf[N]; //передача данных
}

}else{
WCOL = 0;
MODF = 0;
RXOVRN = 0;
}
EA=1;
}

Все работает, только почемуто при ответе на запрос GET_KEY:

case GET_KEY: //p_buf=&key;
SPI0DAT=key; //передача key
Rsv_N=0;
break;

Master получает всегда 0x00, хотя значение key изменяется.

Не врубаюсь в чем дело. angry.gif
Go to the top of the page
 
+Quote Post
mihask
сообщение Jan 26 2007, 08:16
Сообщение #3


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

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



Может быть ошибка в том что мастер ожидает получения key после того как
мастер выдал запрос GET_KEY, а ведь на самом деле мастеру необходимо
выдать еще один запрос, чтобы значение key записанное слэйвом в SPIDAT
было переписано в регистр SPIDAT мастера (это принцип работы spi).
Go to the top of the page
 
+Quote Post



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

 


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


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