Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 29.01.2009, 17:27   #1
Andd3dfx
Junior Member
 
Регистрация: 29.01.2009
Возраст: 38
Сообщений: 6
Вес репутации: 100/0
Andd3dfx will become famous soon enoughAndd3dfx will become famous soon enough
По умолчанию SPI в MCC18

Помогите, пожалуйста.

Есть pic18f4550 (20MHz), pic18f252 (4МHz). Надо реализовать их обмен по SPI. Одиночный байт передаю и принимаю нормально. Больше одного за раз- никак. Осциллографом увидел, что MASTER отдает нужное кол-во байт, т.е. дело (вроде бы) в SLAVE-е.

Компилятор MCC18.
Код для мастера:
Код:
{
unsigned char buff[]="Heh";
...
OpenSPI(SPI_FOSC_64,MODE_00,SMPMID);
...
buff[0] = ..;
buff[1] = ..;
putcSPI(0b10100000);  //код команды
putcSPI(2);   //кол-во байт в буфере
putsSPI(buff);  //буфер
}
Код для слейва:
Код:
while(1)
{
value = ReadSPI();
switch(value)
{ 
...
 case 0b10100000: 
 while(!DataRdySPI()); count = getcSPI();
 while(!DataRdySPI()); getsSPI(buff,count);
 T1= (unsigned int)(2+3*buff[0]);
 T2= (unsigned int)(2+3*buff[1]);
 break;
}
}
аналогичные case у слейва, когда предполагается прием лишь одного байта работают.

Последний раз редактировалось majorPAE; 29.01.2009 в 20:33. Причина: Мог бы и сам исправить... ;)
Andd3dfx вне форума   Ответить с цитированием
Старый 29.01.2009, 17:48   #2
vitalka
Super Moderator
 
Аватар для vitalka
 
Регистрация: 19.03.2007
Адрес: Львов
Возраст: 44
Сообщений: 3,334
Вес репутации: 2341/99
vitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond repute
По умолчанию Ответ: SPI в MCC18

Цитата:
Сообщение от Andd3dfx Посмотреть сообщение
Помогите, пожалуйста.

Есть pic18f4550 (20MHz), pic18f252 (4МHz). Надо реализовать их обмен по SPI. Одиночный байт передаю и принимаю нормально. Больше одного за раз- никак. Осциллографом увидел, что MASTER отдает нужное кол-во байт, т.е. дело (вроде бы) в SLAVE-е.

Компилятор MCC18.
Код для мастера:
{
unsigned char buff[]="Heh";
...
OpenSPI(SPI_FOSC_64,MODE_00,SMPMID);
...
buff[0] = ..;
buff[1] = ..;
putcSPI(0b10100000); //код команды
putcSPI(2); //кол-во байт в буфере
putsSPI(buff); //буфер
}

Код для слейва:
while(1)
{
value = ReadSPI();
switch(value)
{
...
case 0b10100000:
while(!DataRdySPI()); count = getcSPI();
while(!DataRdySPI()); getsSPI(buff,count);
T1= (unsigned int)(2+3*buff[0]);
T2= (unsigned int)(2+3*buff[1]);
break;
}
}
аналогичные case у слейва, когда предполагается прием лишь одного байта работают.
сначала сюда

Код:
 T1= (unsigned int)(2+3*buff[0]);
так считать не будет
например, если buff[0] = 200, то Т1 = 90
vitalka вне форума   Ответить с цитированием
Старый 29.01.2009, 18:04   #3
Andd3dfx
Junior Member
 
Регистрация: 29.01.2009
Возраст: 38
Сообщений: 6
Вес репутации: 100/0
Andd3dfx will become famous soon enoughAndd3dfx will become famous soon enough
По умолчанию Ответ: SPI в MCC18

Исправился:
Код:
 T1= 2+3*(unsigned int)buff[0];
А насчет SPI как?
Andd3dfx вне форума   Ответить с цитированием
Старый 29.01.2009, 18:17   #4
vitalka
Super Moderator
 
Аватар для vitalka
 
Регистрация: 19.03.2007
Адрес: Львов
Возраст: 44
Сообщений: 3,334
Вес репутации: 2341/99
vitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond repute
По умолчанию Ответ: SPI в MCC18

Цитата:
Сообщение от Andd3dfx Посмотреть сообщение
А насчет SPI как?
нужно сначала сделать без всяких проверок,
просто - что отправилось, то и принялось
и дальше уже плясать
vitalka вне форума   Ответить с цитированием
Старый 30.01.2009, 02:53   #5
Andd3dfx
Junior Member
 
Регистрация: 29.01.2009
Возраст: 38
Сообщений: 6
Вес репутации: 100/0
Andd3dfx will become famous soon enoughAndd3dfx will become famous soon enough
По умолчанию Ответ: SPI в MCC18

Не помогло. Дак как по SPI принять за раз >1байта?
Andd3dfx вне форума   Ответить с цитированием
Старый 30.01.2009, 08:49   #6
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,789
Вес репутации: 5397/164
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Ответ: SPI в MCC18

Цитата:
Сообщение от Andd3dfx Посмотреть сообщение
Не помогло. Дак как по SPI принять за раз >1байта?
больше одного байта - никак. Имелось в виду, что надо отработать "петлю" (послать-принять) с одним байтом
Greg вне форума   Ответить с цитированием
Старый 31.01.2009, 04:52   #7
Andd3dfx
Junior Member
 
Регистрация: 29.01.2009
Возраст: 38
Сообщений: 6
Вес репутации: 100/0
Andd3dfx will become famous soon enoughAndd3dfx will become famous soon enough
По умолчанию Ответ: SPI в MCC18

я написал в первом посте, что 1 байт мастером шлю, слейвом принимаю, причем то, что надо.

и спрашиваю, как отправить мастером пачку байт, чтобы слейв их тоже принял. у меня слейв же принимает только первый байт.
Andd3dfx вне форума   Ответить с цитированием
Старый 31.01.2009, 21:31   #8
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,789
Вес репутации: 5397/164
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Ответ: SPI в MCC18

Цитата:
Сообщение от Andd3dfx Посмотреть сообщение
и спрашиваю, как отправить мастером пачку байт, чтобы слейв их тоже принял. у меня слейв же принимает только первый байт.
да хз. перечитайте ещё раз свой "первый пост" свежим взглядом. у вас там полно каких-то функций, через которые и идёт весь обмен.
чтобы посоветовать что-то осмысленное, надо привести их содержимое.
особо смущает функция getsSPI(buff,count); Сделайте для начала попроще - while (!SSPIF) -> чтение байта -> while (!SSPIF) -> чтение и т.д.
уверен, всё получится...
Greg вне форума   Ответить с цитированием
Старый 31.01.2009, 22:21   #9
vitalka
Super Moderator
 
Аватар для vitalka
 
Регистрация: 19.03.2007
Адрес: Львов
Возраст: 44
Сообщений: 3,334
Вес репутации: 2341/99
vitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond repute
По умолчанию Ответ: SPI в MCC18

Цитата:
Сообщение от Greg Посмотреть сообщение
да хз. перечитайте ещё раз свой "первый пост" свежим взглядом. у вас там полно каких-то функций, через которые и идёт весь обмен.
чтобы посоветовать что-то осмысленное, надо привести их содержимое.
особо смущает функция getsSPI(buff,count); Сделайте для начала попроще - while (!SSPIF) -> чтение байта -> while (!SSPIF) -> чтение и т.д.
уверен, всё получится...
функции там встроенные
Код:
void getsSPI( unsigned char *rdptr, unsigned char length )
{
  while ( length )                // stay in loop until length = 0
  {
    *rdptr++ = getcSPI();         // read a single byte
    length--;                     // reduce string length count by 1
  }
}

unsigned char ReadSPI( void )
{
  SSPBUF = 0x00;                  // initiate bus cycle
  while ( !SSPSTATbits.BF );      // wait until cycle complete
  return ( SSPBUF );              // return with byte read 
}
ничего в них интересного нет

2Andd3dfx
просто сделать примитивный буфер
и без всяких проверок отослать с десяток байт и посмотреть, что принимается

ну и то, что Greg посоветовал - сначала попроще, а потом уже и функции подключать

Цитата:
while(!DataRdySPI()); count = getcSPI();
имхо, это не очень правильно
сначала ждешь, пока buf заполнится, потом его обнуляешь и ждешь читаешь следующий...

глянь в описание библиотек, там есть пример работы с spi

Последний раз редактировалось vitalka; 01.02.2009 в 09:29.
vitalka вне форума   Ответить с цитированием
Старый 13.02.2009, 05:48   #10
Andd3dfx
Junior Member
 
Регистрация: 29.01.2009
Возраст: 38
Сообщений: 6
Вес репутации: 100/0
Andd3dfx will become famous soon enoughAndd3dfx will become famous soon enough
По умолчанию Ответ: SPI в MCC18

Разобрался, просто по получению первого байта я включал высокоприоритетное прерывание по таймеру с очень малым периодом.
Подправил период - все стало хорошо.

Всем спасибо.
Andd3dfx вне форума   Ответить с цитированием
Ответ

Метки
pic18, spi


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прерывание SPI в dsPIC33FJ33GP202 Любопытный Продукция MICROCHIP 6 28.11.2008 17:29
Цифровой потенциометр и аппаратный SPI michipic Продукция MICROCHIP 38 09.10.2008 21:05
SPI PIC18F452 Alexey Belodvortsev Продукция MICROCHIP 4 25.03.2008 22:59
Прога для Pic16c63a Reitar Продукция MICROCHIP 1 20.04.2007 23:35
SPI еще раз ssp Продукция MICROCHIP 7 17.04.2007 19:19


Часовой пояс GMT +3, время: 17:43.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot