Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: spi dspic33fj256mc710
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
mery
Добрый день!
У меня следующая проблема: не срабатывает прерывание по spi dspic33fj256mc710.
Программирую его в режиме мастер.
Код
[/code]
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;

}
[code]


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

Если функция WriteSPI1(uint8_t data_out) принимает один байт данных,
который нужно передать по SPI, то для чего в прерывании SPI запускать на передачу
еще один байт (SPI1BUF = 0)? Или для чего вообще в Вашем случае необходимо прерывание SPI?
mery
По spi обслуживаю мост usb max3420e.
Передавать надо по-разному: один байт и несколько байт подряд.
Проблема при передачи 1 байта (нескольких байт) следующая:перевожу линию SS в ноль я передаю байт SS делаю =1. Вот так:
Код
[/code]
  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
[code]

Так вот, когда я отпускаю ss_hi последний такт у меня еще идет и данные стоят, а ss уже равен 1. Пробовала вставить цикл ожидания for(j=0;j<7;j++) Nop();. Диаграммы выставляются как в документации, но прии стыковке с max3420 (usb мост) его не обнаруживается windows, а без for(j=0;j<7;j++) Nop() обнаруживается, но windows пишет, что устройство работает с ошибкой код 10 .
skyv
На какую частоту настроен Ваш командный цикл или
на какой частоте работает SPI? Я это спрашиваю потому, что в документе
"Section 18. Serial Peripheral Interface (SPI)" в Table 18-1
приведены допустимые значения для первичного и вторичного делителей.
Настройки ваших делителей запрещены для FCY = 40 MHz.
Это так на всякий случай.
Когда флаг SPIRBF устанавливается, то это значит, что все
биты переданы в линию и можно устанавливать SS в высокое состояние,
с учетом временных задержек потребителя. Если Вы сделали циклограмму
в соответствии с требованиями max3420e, то при чем здесь проблема связс с Win.
По поводу обнаружения USB моста со стороны Win. При подключении к PC
происходит обмен между хостом и Вашим USB устройством и при чем здесь
циклограмма SPI. Я так думаю, что она может быть и неправильной, но устройство
будет нормально обнаружено, а вот обмена уже не будет. Может надо уточниться
с драйвером для Вашего USB моста.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.