Неправильно выразился, в инициализации сначала делаю фиктивное чтение, а потом обнуляю SPIROV (для надежности :)), а прерывание так и молчит. Сделал сейчас просто SPI Slave - все срабатывает, берутся семплы от АЦП, но пока не разобрался с фазой клоков, т.к. АЦП CS поднимает по 15 клоку, и 16-й клок проходит уже при поднятом CS. По идее старший бит должен теряться(в сдвиговый регистр вдвигается 15 бит вместо 16). Наверное вследствие этого в результатах проскакивает и старший и младший биты одновременно при КЗ входа АЦП, хотя по осциллограмме шумит 4 младших бита, остальные - в нулях.
Вобщем пошел разбираться с полярностью и фазой клоков, и в АЦП есть прямые и инверсные клоки, может что получится.
На рисунке осциллограмма данных с АЦП при подаче на вход 100 мВ.
P.S. Все же интересно, кто-то из форумчан заводил SPI в framed slave mode c прерываниями? У меня уже ощущение что это в принципе невозможно (баг камня).
Инициализация SPI теперь выглядит так:
void Start_ADC(void)
{
int tmp;
sampling_flag = 1;
//SPI1_Init_Advanced(_SPI_SLAVE, _SPI_16_BIT, _SPI_PRESCALE_SEC_4, _SPI_PRESCALE_PRI_4, _SPI_SS_ENABLE, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_IDLE_2_ACTIVE);
TRISF6_bit = 1; //SCK1
TRISF7_bit = 1; //SDO1
TRISF8_bit = 1; //SDI1
TRISB2_bit = 1; //SS1
SPI1STATbits.SPIEN = 0;
SPI1CON2bits.FRMDLY = 0;
SPI1CON2bits.FRMPOL = 0;
SPI1CON2bits.SPIFSD = 0;
SPI1CON2bits.FRMEN = 0;
SPI1CON1bits.PPRE = 4;
SPI1CON1bits.SPRE = 3;
SPI1CON1bits.MSTEN = 0;
SPI1CON1bits.CKP = 1;
SPI1CON1bits.SSEN = 1;
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;
tmp = SPI1BUF; // Фиктивное чтение буфера
SPI1STATbits.SPIROV = 0; // Сброс флага SPIROV
SPI1STATbits.SPIEN = 1;
ADS1601_sync = 0;
ADS1601_PD = 1;
delay_ms(1000);
oe_6903 = 1;
}