Jump to content

    
Sign in to follow this  
mery

spi dspic33fj256mc710

Recommended Posts

Добрый день!

У меня следующая проблема: не срабатывает прерывание по 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 выдаются. А когда программирую прерывание, программа зависает.

Спасибо

 

Share this post


Link to post
Share on other sites

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

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

и что имеете.

 

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

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

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

Edited by skyv

Share this post


Link to post
Share on other sites

По 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 .

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this