Реализовывал ли кто 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); }
|