DMA для dsPIC. Контроллер Прямого доступа к памяти (DMA). DMA контроллер. Регистр Смещения Адреса Начала A DPSRAM Канала DMA x, страница 22

Ко времени когда введено прерывание переполнения периферийного устройства, ждущий обработки запрос DMA, уже переместит значение данных переполнения к адресу, куда потерянные данные должны были уйти. эти данные могут быть перемещены к его правильному адресу и нулевое значению данных вставится в отсутствующий слот данных. Адрес DPSRAM канала может быть соответственно тогда откорректирован. Последующий DMA запрос на faulted канал, тогда инициализируют передачи как нормаль к исправленному адресу DPSRAM. Для приложений, где данные не могут быть потеряны, прерывание переполнения периферийного устройства, должно прервать текущую пересылку блока, повторно инициализировать канал DMA и запрос, который данные снова посылают прежде это потеряно.

22.9 ПОДДЕРЖКА ОТЛАДКИ

Чтобы улучшать пользовательскую видимость операций DMA в течение отладки, контроллер DMA включает несколько регистров состояния, которые могут обеспечить информацию, какой канал DMA выполнился последний (LSTCH <3:0> биты в регистре DMACS1), какой адрес смещения DPSRAM он обращался (DSADR <15:0> биты в регистре DSADR) и из какого буфера (PPSTx биты в регистре DMACS1).

22.10 DATA WRITE COLLISIONS

The CPU and DMA channel may simultaneously read or read/write to any DPSRAM or DMA-ready peripheral data register. The only constraint is that the CPU and DMA channel should not simultaneously write to the same address. Under normal circumstances, this situation should never arise. However, if for some reason it does, then it will be detected and flagged, and a DMA

Fault trap will be initiated. The CPU write will also be allowed to take priority, though that is mainly to provide predictable behavior and is otherwise of little practical consequence.

It is also permissible for the DMA channel to write to a location during the same bus cycle that the CPU is reading it, and vice versa. However, it should be noted that the resultant reads are of the old data, not the data written during that bus cycle. Also note that this situation is considered normal operation and does not result in any special action being taken.

In the event of a simultaneous write to the same DPSRAM address by the CPU and DMA channel, the XWCOLx bit is set in the DMA Controller Status 0 (DMACS0) register. In the event of a simultaneous write to the same peripheral address by the CPU and DMA channel, the PWCOLx bit is set in the DMA Controller Status 0 (DMACS0) register. All collision status flags are logically ORed together to generate a common DMAC Fault trap. The XWCOLx and PWCOLx flags are automatically cleared when the user application clears the DMAC Error Status bit (DMACERR) in the Interrupt Controller (INTCON1) register.

Subsequent DMA requests to a channel that has a write collision error are ignored while the XWCOLx or PWCOLx remain set.

Under write collision conditions, either XWCOLx or PWCOLx could be set due to write collision, but not both. Setting both flags is used as a unique means to flag a rare manual trigger event error without adding more Status bits (see Section 22.6.10 “Manual Transfer Mode”).

Пример 22-11 illustrates DMA controller trap handling with DMA Channel 0 transferring data from the DPSRAM to the peripheral (UART), and DMA Channel 1 transferring data from the peripheral (ADC) to the DPSRAM.

Пример 22-11: DMA Controller Trap Handling:

void __attribute__((__interrupt__)) _DMACError(void)

{

static unsigned int ErrorLocation;

// Peripheral Write Collision Error Location

if(DMACS0 & 0x0100)

{

ErrorLocation = DMA0STA;

}

// DMA RAM Write Collision Error Location

if(DMACS0 & 0x0002)

{

ErrorLocation = DMA1STA;

}

DMACS0 = 0; //Clear Write Collision Flag

INTCON1bits.DMACERR = 0; //Clear Trap Flag

}

22.11 OPERATION IN POWER-SAVING MODES

22.11.1 Sleep Mode

22.11.2 Idle Mode

22.12 DESIGN TIPS

22.12.1 Interfacing DMA with DCI

22.13 REGISTER MAPS

22.14 RELATED APPLICATION NOTES

22.15 REVISION HISTORY

Revision A (December 2006)