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

 
 
> Не работает прерывание SPI1 dsPIC33FJ256GP710, Не работает прерывание SPI1 в режиме SPI slave Framed slave
MasterM12
сообщение Aug 6 2013, 05:14
Сообщение #1





Группа: Новичок
Сообщений: 6
Регистрация: 18-08-07
Из: Омск
Пользователь №: 29 871



Доброго времени суток! Столкнулся со следующей проблемой: при инициализации модуля SPI1 в режим SPI slave Framed slave контроллер не входит в прерывание по импульсам на ноге SS1. В других режимах работы модуля прерывание отрабатывает. Обмен происходит с АЦП, которая и генерирует клоки и импульсы кадровой синхронизации. Возможно в этом режиме прерывание и не должно срабатывать, но в дата- и эррата-шитах этого не нашел. Разработка ведется в среде MikroC for dsPIC/PIC24 ver.6.0. АЦП ADS1601, тактируется от LTC6903.
Привожу кусок кода программы:
Код
void Start_ADC(void)                 //инициализация SPI1, прерывания от SPI1, и в конце - разрешение тактирования АЦП
{
sampling_flag = 1;


TRISF6_bit = 1; //SCK1
TRISF7_bit = 1; //SDO1
TRISF8_bit = 1; //SDI1
TRISB2_bit = 1; //SS1

SPI1STATbits.SPIEN = 0;

SPI1CON2bits.FRMDLY = 1;
SPI1CON2bits.FRMPOL = 1;
SPI1CON2bits.SPIFSD = 1;
SPI1CON2bits.FRMEN = 1;

SPI1CON1bits.PPRE = 4;
SPI1CON1bits.SPRE = 3;
SPI1CON1bits.MSTEN = 0;
SPI1CON1bits.CKP = 0;
SPI1CON1bits.SSEN = 0;
SPI1CON1bits.CKE = 1;
SPI1CON1bits.SMP = 0;
SPI1CON1bits.MODE16 = 1;
SPI1CON1bits.DISSDO = 1;
SPI1CON1bits.DISSCK = 0;

  SPI1STATbits.SPISIDL = 1;


IFS0bits.SPI1EIF = 0;
IFS0bits.SPI1IF = 0;
IEC0bits.SPI1IE = 1;
IPC2bits.SPI1IP = 4;

SPI1STATbits.SPIEN = 1;

oe_6903 = 1;        //start of SPI master
}



void SPI1Interrupt() iv IVT_ADDR_SPI1INTERRUPT ics ICS_AUTO             //Обработчик прерывания, сюда не входит
{
unsigned int aSample, tmp;
aSample = SPI1BUF;
IFS0bits.SPI1IF = 0;         //Clear Interrupt status of SPI1
SPI1STATbits.SPIROV = 0;
IEC0bits.SPI1IE =1;
}


void main() {

  Start_ADC();

  while (1) {
      //////////////////////// ничего больше не делаем

  }

}


Ниже приведены осциллограммы на SS1, SCLK1 и SDI1 соответственно (все ноги сконфигурированы на вход)
Прикрепленное изображение

Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
evc
сообщение Aug 6 2013, 06:59
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 206
Регистрация: 17-03-07
Из: Москва
Пользователь №: 26 266



Проверьте есть ли питание на плате! Некоторые устройства (не все!) работают лучше, если их запитать электричеством.
Следующим шагом должна быть уже проверка напряжения - оно тоже должно быть, хотя бы приблизительно, близко к значению, которое указано в даташите!
Проверьте, случайно, программатор не находится ли в режиме "Hold in reset"!
Проверьте вообще имеется ли контроллер на испытываемой плате! Если забыли впаять, обязательно сделайте это!
Проверьте запрограммирован ли вообще контроллер! Запрограммируйте еще раз, на всякий случай! (программатором!)
Проверьте совпадает ли язык программирования с языком компилятора! Это важно!
Проверьте, наконец, правильно ли у вас подключены выводы SPI. "Правильно" означает что бы совпадали номера выводов в даташите и на вашей схеме.
Некоторые контроллеры не умеют догадываться к какому именно выводу вы хотите подключить периферию, к которой хотите обратится по указанному интерфейсу.
Проверьте все!
Удачи!

ПП Перечитайте все последние темы в данном разделе! Начинается все с "Не работает высшая математика на моем контроллере, не извлекается квадратный корень из сферического коня в вакууме!".
А заканчивается на "Ой! Я забыл нажать кнопку "Release from Reset"."


--------------------
УЭР
Go to the top of the page
 
+Quote Post
MasterM12
сообщение Aug 6 2013, 07:44
Сообщение #3





Группа: Новичок
Сообщений: 6
Регистрация: 18-08-07
Из: Омск
Пользователь №: 29 871



Цитата(evc @ Aug 6 2013, 13:59) *
Проверьте есть ли питание на плате! Некоторые устройства (не все!) работают лучше, если их запитать электричеством.
Следующим шагом должна быть уже проверка напряжения - оно тоже должно быть, хотя бы приблизительно, близко к значению, которое указано в даташите!
Проверьте, случайно, программатор не находится ли в режиме "Hold in reset"!
Проверьте вообще имеется ли контроллер на испытываемой плате! Если забыли впаять, обязательно сделайте это!
Проверьте запрограммирован ли вообще контроллер! Запрограммируйте еще раз, на всякий случай! (программатором!)
Проверьте совпадает ли язык программирования с языком компилятора! Это важно!
Проверьте, наконец, правильно ли у вас подключены выводы SPI. "Правильно" означает что бы совпадали номера выводов в даташите и на вашей схеме.
Некоторые контроллеры не умеют догадываться к какому именно выводу вы хотите подключить периферию, к которой хотите обратится по указанному интерфейсу.
Проверьте все!
Удачи!

ПП Перечитайте все последние темы в данном разделе! Начинается все с "Не работает высшая математика на моем контроллере, не извлекается квадратный корень из сферического коня в вакууме!".
А заканчивается на "Ой! Я забыл нажать кнопку "Release from Reset"."

Не понял смысл и цель вашего сообщения. Если Вам по делу нечего сказать - проходите мимо. На форум люди приходят для обмена опытом, и если Ваш опыт заканчивается на том, что вы написали - я вам сочувствую.

Сообщение отредактировал MasterM12 - Aug 6 2013, 07:45
Go to the top of the page
 
+Quote Post
evc
сообщение Aug 6 2013, 09:21
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 206
Регистрация: 17-03-07
Из: Москва
Пользователь №: 26 266



Цитата(MasterM12 @ Aug 6 2013, 11:44) *
Если Вам по делу нечего сказать...

Сударь! Нет здесь никакого дела! Каков вопрос - таков и ответ.
Вы утверждаете:
Цитата(MasterM12 @ Aug 6 2013, 09:14) *
...при инициализации модуля SPI1 в режим SPI slave Framed slave контроллер не входит в прерывание по импульсам на ноге SS1. В других режимах работы модуля прерывание отрабатывает.

Не удосужитесь ли вы растолковать, как установили сей факт (что контроллер не входит в прерывание)?
Чудес, знаете, не бывает ...
Я бы вам порекомендовал проверить SPIROV. Если он выставлен, никакого приема данных не будет...
А потом можете прочитать документ 70206D, пункт 18.3.5. ...
Цитата
If a new data word has been shifted into SPIxSR and the previous SPIxBUF contents have not
been read, the SPIROV bit (SPIxSTAT<6>) is set. Any received data in SPIxSR is not transferred,
and further data reception is disabled until the SPIROV bit is cleared. The SPIROV bit is not
cleared automatically by the module; it must be cleared by the user application.

В вашем куске кода не заметно что бы вы упразднили буфер SPI (прочитав его) до начала приема.


--------------------
УЭР
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 5th August 2025 - 16:03
Рейтинг@Mail.ru


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