Перейти к содержанию
    

spi dspic33fj256mc710

Добрый день!

У меня следующая проблема: не срабатывает прерывание по spi dspic33fj256mc710.

Программирую его в режиме мастер.



void SPI_Init(void)
{
  // Set SPI pins (SCLK, MOSI, and SS#) as outputs
   PORTF=0;
   LATF=0;
   TRISF=0;                     //1 - in, 0 - out
  // Set SPI pins MISO as inputs
   TRISF|=(1<<7); //_RF7;
// INT as input
    TRISA=0;
    TRISA|=(1<<14); //_RA14;

    
// fastest SPI clock--div by 2
// mode(0,0), 8 bit data
// Set SPI controller as master
// Enable the SPI controller

/* конфигурацию регистра SPI для работы в режиме ведущего */
IEC0bits.SPI1IE = 0; //отключаем прерывание
IFS0bits.SPI1IF = 0; //Очищаем флаг прерывания
// настройка регистра SPI1CON1
SPI1CON1bits.DISSCK = 0; //Разрешаем внутренние тактовые импульсы SCK.
SPI1CON1bits.DISSDO = 0; //вывод SDOx управляется модулем SPI.
SPI1CON1bits.MODE16 = 0; //Коммуникация осуществляется с помощью байт (8-ми битная).
SPI1CON1bits.SMP = 0; //Входные данные выбираются в середине вывода данных.
SPI1CON1bits.CKE = 0; // Последовательные выходные данные изменяются по
// переднему фронту тактового сигнала
SPI1CON1bits.SPRE = 0b111; //Настраиваем вторичный предделитель. 1:1
SPI1CON1bits.PPRE = 0b10;//64:1//0b11; // Настраиваем первичный предделитель. 1:1
SPI1CON1bits.CKP = 0;
SPI1CON1bits.MSTEN = 1; //Включаем режим ведущего
SPI1STATbits.SPIEN = 1; //Включить модуль SPI

_SPI1IF = 0; // Clear the Interrupt Flag
_SPI1IE = 1; // Enable the Interrupt
_SPI1IP = 3;

}
void WriteSPI1(uint8_t data_out)
{   interrupt_spi=0;
    _LATB13=1;
   _SPI1IE = 1;
    while (SPI1STATbits.SPITBF); //SPITBF==1
    SPI1BUF = data_out & 0xff;   /*  записываем байт  */
        
     while(interrupt_spi==0);
    _SPI1IE = 0; // Disable the Interrupt
  

}

void __attribute__((__interrupt__, no_auto_psv)) _SPI1Interrupt(void)
{
_SPI1IF = 0;
  interrupt_spi=1;
  SPI1BUF = 0;

}

 

По таймеру запускаю функцию WriteSPI1(uint8_t data_out). Данные без прерывания по spi выдаются. А когда программирую прерывание, программа зависает.

Спасибо

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы прежде изложите свой алгоритм.

Понятно будет Вам и остальным чего хотите

и что имеете.

 

Если функция WriteSPI1(uint8_t data_out) принимает один байт данных,

который нужно передать по SPI, то для чего в прерывании SPI запускать на передачу

еще один байт (SPI1BUF = 0)? Или для чего вообще в Вашем случае необходимо прерывание SPI?

Изменено пользователем skyv

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По spi обслуживаю мост usb max3420e.

Передавать надо по-разному: один байт и несколько байт подряд.

Проблема при передачи 1 байта (нескольких байт) следующая:перевожу линию SS в ноль я передаю байт SS делаю =1. Вот так:



  ss_lo;                      // Set SS# low
  temp = SPI1BUF;            // dummy read of the SPI1BUF register to clear the SPIRBF flag
  SPI1BUF = reg+2;        // write the data out to the SPI peripheral
  while (!SPI1STATbits.SPIRBF);    // wait for the data to be sent out
  
  temp = SPI1BUF;            // dummy read of the SPI1BUF register to clear the SPIRBF flag
  SPI1BUF = dat;        // write the data out to the SPI peripheral
  while (!SPI1STATbits.SPIRBF);    // wait for the data to be sent out
  temp = SPI1BUF;
   //for(j=0;j<7;j++) Nop();
_LATB13=1;
  ss_hi;                      // set SS# high

Так вот, когда я отпускаю ss_hi последний такт у меня еще идет и данные стоят, а ss уже равен 1. Пробовала вставить цикл ожидания for(j=0;j<7;j++) Nop();. Диаграммы выставляются как в документации, но прии стыковке с max3420 (usb мост) его не обнаруживается windows, а без for(j=0;j<7;j++) Nop() обнаруживается, но windows пишет, что устройство работает с ошибкой код 10 .

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На какую частоту настроен Ваш командный цикл или

на какой частоте работает SPI? Я это спрашиваю потому, что в документе

"Section 18. Serial Peripheral Interface (SPI)" в Table 18-1

приведены допустимые значения для первичного и вторичного делителей.

Настройки ваших делителей запрещены для FCY = 40 MHz.

Это так на всякий случай.

Когда флаг SPIRBF устанавливается, то это значит, что все

биты переданы в линию и можно устанавливать SS в высокое состояние,

с учетом временных задержек потребителя. Если Вы сделали циклограмму

в соответствии с требованиями max3420e, то при чем здесь проблема связс с Win.

По поводу обнаружения USB моста со стороны Win. При подключении к PC

происходит обмен между хостом и Вашим USB устройством и при чем здесь

циклограмма SPI. Я так думаю, что она может быть и неправильной, но устройство

будет нормально обнаружено, а вот обмена уже не будет. Может надо уточниться

с драйвером для Вашего USB моста.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...