mery 0 14 марта, 2013 Опубликовано 14 марта, 2013 · Жалоба Добрый день! У меня следующая проблема: не срабатывает прерывание по 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 выдаются. А когда программирую прерывание, программа зависает. Спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skyvmicro 0 18 марта, 2013 Опубликовано 18 марта, 2013 (изменено) · Жалоба Вы прежде изложите свой алгоритм. Понятно будет Вам и остальным чего хотите и что имеете. Если функция WriteSPI1(uint8_t data_out) принимает один байт данных, который нужно передать по SPI, то для чего в прерывании SPI запускать на передачу еще один байт (SPI1BUF = 0)? Или для чего вообще в Вашем случае необходимо прерывание SPI? Изменено 18 марта, 2013 пользователем skyv Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mery 0 21 марта, 2013 Опубликовано 21 марта, 2013 · Жалоба По 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 . Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skyvmicro 0 21 марта, 2013 Опубликовано 21 марта, 2013 · Жалоба На какую частоту настроен Ваш командный цикл или на какой частоте работает SPI? Я это спрашиваю потому, что в документе "Section 18. Serial Peripheral Interface (SPI)" в Table 18-1 приведены допустимые значения для первичного и вторичного делителей. Настройки ваших делителей запрещены для FCY = 40 MHz. Это так на всякий случай. Когда флаг SPIRBF устанавливается, то это значит, что все биты переданы в линию и можно устанавливать SS в высокое состояние, с учетом временных задержек потребителя. Если Вы сделали циклограмму в соответствии с требованиями max3420e, то при чем здесь проблема связс с Win. По поводу обнаружения USB моста со стороны Win. При подключении к PC происходит обмен между хостом и Вашим USB устройством и при чем здесь циклограмма SPI. Я так думаю, что она может быть и неправильной, но устройство будет нормально обнаружено, а вот обмена уже не будет. Может надо уточниться с драйвером для Вашего USB моста. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться