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