117,6 → 117,38 |
#endif |
} |
|
void SPI2_DMA_Init(void) { |
DMACON1bits.SSCON0 = 0; |
DMACON1bits.SSCON1 = 0; // DYLINTEN is software programmable |
|
DMACON1bits.TXINC = 1; // TXADDR is automatically incremented |
DMACON1bits.RXINC = 0; // RXADDR is not automatically incremented |
|
DMACON1bits.DUPLEX0 = 1; |
DMACON1bits.DUPLEX1 = 0; // Half-duplex mode, transmission only |
|
DMACON1bits.DLYINTEN = 0; // Interrupt is disabled |
|
DMACON2bits.DLYCYC = 0b0000; // Delay time of 1 cycle between bytes |
DMACON2bits.INTLVL = 0b0000; // Interrupt on transfer complete |
} |
|
void SPI2_DMA_Start(unsigned int length, void* TXADDR, void* RXADDR) { |
// Set length of message to transmit |
DMABCH = (char)(length-1 >> 8); |
DMABCL = (char)(length-1); |
|
// Set sourcing address |
TXADDRH = (char)((int)TXADDR >> 8); |
TXADDRL = (char)((int)TXADDR); |
|
// Set receiving address |
RXADDRH = (char)((int)RXADDR >> 8); |
RXADDRL = (char)((int)RXADDR); |
|
DMACON1bits.DMAEN = 1; // Start transmission |
} |
|
#ifndef SPI2_WRITE_ONLY |
void SPI2_Recv_Interrupt_Handler() { |
char c; |