Реализовывал ли кто SPI обмен, используя DMA режим в S3C44B0x ?
Хожу по граблям. В режиме полинга прием и передача работает нормально. В режиме ДМА - передача ОК, но при приеме происходит прием дополнительных 8-ми бит. Т.е. запросили 10 байт, осциллографом вижу 88 (а не 80) клоков. В буфер попало 10-мь байт. Естественно весь обмен сыпется.
Заранее спасибо. Кусок исходника ниже.
// Init IO pins as SPI pins
C44B_rPCONF &=~ ((7 << 10) | (7 << 16) | (7 << 19)) ;
C44B_rPCONF |= ((3 << 10) | (3 << 16) | (3 << 19)) ;
// Enable clock for SIO module
C44B_rCLKCON |= 1 << 5;
// Setup SIO parameters
C44B_rBDCON0 = (0x0<<2);
C44B_rSIOCON = 0;
C44B_rSBRDR = 15;
C44B_rIVTCNT = 255;
C44B_rSIOCON = C44B_bSIOCON_INT + C44B_bSIOCON_TXRX + C44B_bSIOCON_MSB +
C44B_bSIOCON_INTCLK + C44B_bSIOCON_REDGE;
// Perform infinite DMA READ cycle
while (1)
{
// prepare SIO for BDMA receive
C44B_rSIOCON &=~ (3 | C44B_bSIOCON_START | (1 << 5));
C44B_rI_ISPC |= C44B_bISR_BDMA0;
C44B_rDCNTZ = 0x3;
C44B_rDCNTZ = 0;
// setup BDMA0
C44B_rBDISRC0 = (0<<30)|(3<<28)|(uint32_t)C44B_aSIODAT;
C44B_rBDIDES0 = (2<<30)|(1<<28)|(uint32_t)&buff[0];
C44B_rBDICNT0 = (3<<30)|(1<<26)|(3<<22)|2;
C44B_rBDICNT0 |= (1<<20);
C44B_rSIOCON |= C44B_bSIOCON_BDMA0;
C44B_rSIOCON |= C44B_bSIOCON_START;
// wait until ready
while ((C44B_rINTPND & C44B_bISR_BDMA0) == 0)
;
C44B_rDCNTZ = 0x3;
// wait
delayUS(100);
}