Доброго времени суток! Столкнулся со следующей проблемой: при инициализации модуля SPI1 в режим SPI slave Framed slave контроллер не входит в прерывание по импульсам на ноге SS1. В других режимах работы модуля прерывание отрабатывает. Обмен происходит с АЦП, которая и генерирует клоки и импульсы кадровой синхронизации. Возможно в этом режиме прерывание и не должно срабатывать, но в дата- и эррата-шитах этого не нашел. Разработка ведется в среде MikroC for dsPIC/PIC24 ver.6.0. АЦП ADS1601, тактируется от LTC6903.
Привожу кусок кода программы:
Код
void Start_ADC(void) //инициализация SPI1, прерывания от SPI1, и в конце - разрешение тактирования АЦП
{
sampling_flag = 1;
TRISF6_bit = 1; //SCK1
TRISF7_bit = 1; //SDO1
TRISF8_bit = 1; //SDI1
TRISB2_bit = 1; //SS1
SPI1STATbits.SPIEN = 0;
SPI1CON2bits.FRMDLY = 1;
SPI1CON2bits.FRMPOL = 1;
SPI1CON2bits.SPIFSD = 1;
SPI1CON2bits.FRMEN = 1;
SPI1CON1bits.PPRE = 4;
SPI1CON1bits.SPRE = 3;
SPI1CON1bits.MSTEN = 0;
SPI1CON1bits.CKP = 0;
SPI1CON1bits.SSEN = 0;
SPI1CON1bits.CKE = 1;
SPI1CON1bits.SMP = 0;
SPI1CON1bits.MODE16 = 1;
SPI1CON1bits.DISSDO = 1;
SPI1CON1bits.DISSCK = 0;
SPI1STATbits.SPISIDL = 1;
IFS0bits.SPI1EIF = 0;
IFS0bits.SPI1IF = 0;
IEC0bits.SPI1IE = 1;
IPC2bits.SPI1IP = 4;
SPI1STATbits.SPIEN = 1;
oe_6903 = 1; //start of SPI master
}
void SPI1Interrupt() iv IVT_ADDR_SPI1INTERRUPT ics ICS_AUTO //Обработчик прерывания, сюда не входит
{
unsigned int aSample, tmp;
aSample = SPI1BUF;
IFS0bits.SPI1IF = 0; //Clear Interrupt status of SPI1
SPI1STATbits.SPIROV = 0;
IEC0bits.SPI1IE =1;
}
void main() {
Start_ADC();
while (1) {
//////////////////////// ничего больше не делаем
}
}
Ниже приведены осциллограммы на SS1, SCLK1 и SDI1 соответственно (все ноги сконфигурированы на вход)