Код
...
for (i=0; i<=13;i++ )
{
//массив запросов с соответсвующими адресами каналов АЦП
ADC1Request[i*2]=(1<<7)|( (i) <<2)|(1<<1)|1;
ADC1Request[i*2+1]=(1<<5)|(1<<4);//(1<<5) | (1<<4);//| (1<<6);
}
...
void RequestADCData12Bit (TADCData12Bit* DataStruct)
{
ADC1ChipSelect();
AT91F_SPI_ReceiveFrame(pSPI,buf,2,(char *) DataStruct,26);
//первые два байта с ненужными данными, последующие записываются в структуру из unsigned short
SPI_Tx( ADC1Request,2);
//передача первого запроса
ADC1ReqLeft=13; //количество оставшихся запросов
}
for (i=0; i<=13;i++ )
{
//массив запросов с соответсвующими адресами каналов АЦП
ADC1Request[i*2]=(1<<7)|( (i) <<2)|(1<<1)|1;
ADC1Request[i*2+1]=(1<<5)|(1<<4);//(1<<5) | (1<<4);//| (1<<6);
}
...
void RequestADCData12Bit (TADCData12Bit* DataStruct)
{
ADC1ChipSelect();
AT91F_SPI_ReceiveFrame(pSPI,buf,2,(char *) DataStruct,26);
//первые два байта с ненужными данными, последующие записываются в структуру из unsigned short
SPI_Tx( ADC1Request,2);
//передача первого запроса
ADC1ReqLeft=13; //количество оставшихся запросов
}
обработчик прерывания по пустому буферу передачи
Код
__irq void SPI_Handler (void)
{
if (pSPI->SPI_SR & AT91C_SPI_TXBUFE){
if (ADC1ReqLeft)
{
pSPI->SPI_CR=AT91C_SPI_LASTXFER;
while ( !(*AT91C_PIOA_PDSR & AT91C_PA11_NPCS0) ); //ждём пока вернётся наверх CS
ADC1ReqLeft--;
pSPI->SPI_TCR=2;
//разрешаем PDC передать последующие два байта массива запроса
}
}
Данные извлечь этот подход позволяет. Но! В младшем байте каждой из посылок (принятых результатов преобразования) находятся произвольные данные, пока что ни с чем не кореллирующие. А в старшем байте всё хорошо. То есть на выходе на графике значений с АЦП я вижу ступеньки с высотой 256.
Самое интересное что если запрашивать данные поодиночке с одного канала, то всё работает, данные идут корректные. Но хочеться чтобы всё было быстро и изящно.
Где посоветуете искать причину?