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

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

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

Ответ
 
Опции темы Опции просмотра
Старый 28.11.2008, 11:49   #1
Любопытный
Junior Member
 
Регистрация: 28.11.2008
Сообщений: 4
Вес репутации: 108/0
Любопытный will become famous soon enoughЛюбопытный will become famous soon enough
По умолчанию Прерывание SPI в dsPIC33FJ33GP202

Всё просто до смешного и ещё более непонятно. Задача простейшая: выдать 16 бит по SPI и по окончании выдачи сформировать строб (для чего и нужно мне прерывание). Данные выходят отлично, именно те, и именно так, как я хочу. Но вот прерывания по окончанию выдачи не возникает. Может кто подскажет, где искать это коварное прерывание? Программа написана на С в MPLab.

Текст инициализации SPI:
Код:
RPOR1bits.RP2R = 9;          //RB2 - SS
RPOR1bits.RP3R = 8;          //RP3 - SCK SPI
RPOR2bits.RP4R = 7;          //RP4 - SDO SPI
 
SPI1CON1bits.DISSCK = 0;  //SCK - нога SPI
SPI1CON1bits.DISSDO = 0;  //SDO - нога SPI
SPI1CON1bits.MODE16 = 1; //16 бит
SPI1CON1bits.CKE = 0;       //Данные меняются по фронту SCK
SPI1CON1bits.CKP = 0;       //Активный уровень SCK - высокий
SPI1CON1bits.MSTEN = 1;   //Режим Master
 
SPI1STATbits.SPIEN = 1;     //Включить SPI
 
IFS0bits.SPI1IF = 0;           //Очистить флаг прерываний SPI
IEC0bits.SPI1IE = 1;           //Разрешить прерывание SPI
Само прерывание SPI, которое как раз и не возникает:
Код:
void __attribute__((__interrupt__)) _SPI1Interrupt(void)
{
   IFS0bits.SPI1IF = 0;         //Очистить флаг прерываний SPI
   LATBbits.LATB2 = 1;
   asm(" nop");
   asm(" nop");
   asm(" nop");
   asm(" nop");
   asm(" nop");
   LATBbits.LATB2 = 0;
}
Ну и, если кому интересно, выдача в SPI (уже просто в main`е периодически сделана, чтобы проще уже было нельзя...):
Код:
for(;;)
{
   SPI1BUF = 0xb333;
   for(i=0;i<20000;i++);
}
Выдаваемые данные друг на друга не накладываются, при длительности посылки около 100мкс, между посылками около 15мс.

Примерно аналогичная проблема была с приёмником UART на этом же процессоре. На одной из ножек, при чётко видимом на ней сигнале, не возникало прерывание о приходе данных, тогда всё исправилось при приёме данных на другую ножку, может и тут кто-нибудь знает именно ту, "волшебную", комбинацию ног, которые будут работать? Хотя лучше было бы, если бы явная ошибка была в моём тексте...
Любопытный вне форума   Ответить с цитированием
Старый 28.11.2008, 12:26   #2
AVB
Senior Member
 
Регистрация: 03.03.2008
Сообщений: 107
Вес репутации: 102/46
AVB will become famous soon enoughAVB will become famous soon enough
По умолчанию Ответ: Прерывание SPI в dsPIC33FJ33GP202

Если вручную IFS0bits.SPI1IF = 1; то прерывание формируется?
AVB вне форума   Ответить с цитированием
Старый 28.11.2008, 14:14   #3
Любопытный
Junior Member
 
Регистрация: 28.11.2008
Сообщений: 4
Вес репутации: 108/0
Любопытный will become famous soon enoughЛюбопытный will become famous soon enough
По умолчанию Ответ: Прерывание SPI в dsPIC33FJ33GP202

Цитата:
Сообщение от AVB Посмотреть сообщение
Если вручную IFS0bits.SPI1IF = 1; то прерывание формируется?
Вот в таком виде:
Код:
for(;;)
{
//  SPI1BUF = 0xb333;
    IFS0bits.SPI1IF = 1;
    for(i=0;i<20000;i++);
}
прерывания возникают без проблем и с заданной периодичностью.
Любопытный вне форума   Ответить с цитированием
Старый 28.11.2008, 16:55   #4
Romantic
Senior Member
 
Аватар для Romantic
 
Регистрация: 13.07.2007
Адрес: Ленинград
Возраст: 34
Сообщений: 2,096
Вес репутации: 3340/99
Romantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond repute
По умолчанию Ответ: Прерывание SPI в dsPIC33FJ33GP202

А каким образом принимается вывод о наличии/отсутствии прерывания? В тексте функции обработки поставлена точка останова в отладчике или отслеживается состояние светодиода на RB2?
Если второе, то возникает мысль, что на приличной тактовой частоте время горения светодиода до смешного маленькое. Скажем, при Fosc = 40 МГц светодиод загорается на 5 (число nop-ов) х 10^-7 с раз в 15 мс. Этого, на мой взгляд, маловато.
Romantic вне форума   Ответить с цитированием
Старый 28.11.2008, 17:06   #5
Любопытный
Junior Member
 
Регистрация: 28.11.2008
Сообщений: 4
Вес репутации: 108/0
Любопытный will become famous soon enoughЛюбопытный will become famous soon enough
По умолчанию Ответ: Прерывание SPI в dsPIC33FJ33GP202

Цитата:
Сообщение от Romantic Посмотреть сообщение
А каким образом принимается вывод о наличии/отсутствии прерывания? В тексте функции обработки поставлена точка останова в отладчике или отслеживается состояние светодиода на RB2?
Ждущий режим осциллографа мне в помощь.
При ручной установке флага прерывания, период получается тот же, и всё прекрасно на осциллографе видно.
Любопытный вне форума   Ответить с цитированием
Старый 28.11.2008, 17:25   #6
Любопытный
Junior Member
 
Регистрация: 28.11.2008
Сообщений: 4
Вес репутации: 108/0
Любопытный will become famous soon enoughЛюбопытный will become famous soon enough
По умолчанию Ответ: Прерывание SPI в dsPIC33FJ33GP202

Мда... То ли в Microchip [цензура], то ли я пойду сегодня не домой, а в психушку, давно не проверялся...
Разрешилась ситуация самым парадоксальным образом:

В dsPic33 есть 2 источника прерывания от SPI: прерывание по концу пакета, и прерывание по ошибке (как вызвать данное прерывание так и не нашёл, в даташитах не описано). Каждое из прерываний имеет свой вектор, соответственно отдельно разрешается/запрещается и имеет свои флаги срабатывания.
Вот и получается, что при разрешении прерывания по концу пакета (и при выполнении условия ) - устанавливается флаг срабатывания прерывания по ошибке передачи.

Ну а дальше всё просто: разрешил нормальное прерывание SPI, и написал обработчик прерывания ошибки (не разрешая этого прерывания), всё и заработало...
Любопытный вне форума   Ответить с цитированием
Старый 28.11.2008, 17:29   #7
Romantic
Senior Member
 
Аватар для Romantic
 
Регистрация: 13.07.2007
Адрес: Ленинград
Возраст: 34
Сообщений: 2,096
Вес репутации: 3340/99
Romantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond reputeRomantic has a reputation beyond repute
По умолчанию Ответ: Прерывание SPI в dsPIC33FJ33GP202

"Касяк..."
А ты посмотри inc-файл! Бывает, что там встречаются странности. Может, и ошибки тоже. Было у меня дело, искал регистр, который зовётся в документации как PWM1CON. MCC18 не понимал такого имени и весьма ругался. Посмотрел адрес регистра в ОЗУ по даташиту (H'0FB7' ), залез в inc-файл в папке mcc18\mpasm и поиском обнаружил, что зовётся он не PWM1CON, а ECCP1DEL. В то же время, в inc-файле в папке Microchip\MPAsm Suite он значится как положено. Так что имей в виду!

Последний раз редактировалось Romantic; 28.11.2008 в 17:47.
Romantic вне форума   Ответить с цитированием
Ответ


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

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Цифровой потенциометр и аппаратный SPI michipic Продукция MICROCHIP 38 09.10.2008 21:05
Прерывание SPI в DSPIC33FJ32GP202 Spawn-PMV Продукция MICROCHIP 3 18.09.2008 18:57
Почему не неправильно работает прерывание TMR0(+) neptun23 Продукция MICROCHIP 17 04.12.2007 17:19
Прога для Pic16c63a Reitar Продукция MICROCHIP 1 20.04.2007 23:35
SPI еще раз ssp Продукция MICROCHIP 7 17.04.2007 19:19


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


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