SPI RAM 23LC1024 (Microchip) with DMA and FIFO

Dependencies:   SerRAM mbed

Fork of SPIRAM_23LC1024_DMA by Suga koubou

Committer:
okini3939
Date:
Fri Mar 08 14:02:14 2013 +0000
Revision:
3:cc45604ca53f
Parent:
2:a3e0f7f37ac9
add CircBuffer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 2:a3e0f7f37ac9 1 #include "mbed.h"
okini3939 2:a3e0f7f37ac9 2 #include "MODDMA.h"
okini3939 2:a3e0f7f37ac9 3 #include "MODSERIAL.h"
okini3939 2:a3e0f7f37ac9 4
okini3939 2:a3e0f7f37ac9 5 DigitalOut led1(LED1);
okini3939 2:a3e0f7f37ac9 6 DigitalOut led2(LED2);
okini3939 2:a3e0f7f37ac9 7 DigitalOut led3(LED3);
okini3939 2:a3e0f7f37ac9 8 DigitalOut led4(LED4);
okini3939 2:a3e0f7f37ac9 9 MODDMA dma;
okini3939 2:a3e0f7f37ac9 10 MODSERIAL pc(USBTX, USBRX);
okini3939 2:a3e0f7f37ac9 11
okini3939 2:a3e0f7f37ac9 12 // Function prototypes for IRQ callbacks.
okini3939 2:a3e0f7f37ac9 13 // See definitions following main() below.
okini3939 2:a3e0f7f37ac9 14 void dmaTCCallback(void);
okini3939 2:a3e0f7f37ac9 15 void dmaERRCallback(void);
okini3939 2:a3e0f7f37ac9 16 void TC0_callback(void);
okini3939 2:a3e0f7f37ac9 17 void ERR0_callback(void);
okini3939 2:a3e0f7f37ac9 18
okini3939 2:a3e0f7f37ac9 19 int main() {
okini3939 2:a3e0f7f37ac9 20 char s[] = "**DMA** ABCDEFGHIJKLMNOPQRSTUVWXYZ **DMA**";
okini3939 2:a3e0f7f37ac9 21
okini3939 2:a3e0f7f37ac9 22 pc.baud(PC_BAUD);
okini3939 2:a3e0f7f37ac9 23
okini3939 2:a3e0f7f37ac9 24 dma.attach_tc( &dmaTCCallback );
okini3939 2:a3e0f7f37ac9 25 dma.attach_err( &dmaERRCallback );
okini3939 2:a3e0f7f37ac9 26
okini3939 2:a3e0f7f37ac9 27 MODDMA_Config *config = new MODDMA_Config;
okini3939 2:a3e0f7f37ac9 28 config
okini3939 2:a3e0f7f37ac9 29 ->channelNum ( MODDMA::Channel_0 )
okini3939 2:a3e0f7f37ac9 30 ->srcMemAddr ( (uint32_t) &s )
okini3939 2:a3e0f7f37ac9 31 ->dstMemAddr ( 0 )
okini3939 2:a3e0f7f37ac9 32 ->transferSize ( sizeof(s) )
okini3939 2:a3e0f7f37ac9 33 ->transferType ( MODDMA::m2p )
okini3939 2:a3e0f7f37ac9 34 ->transferWidth ( 0 )
okini3939 2:a3e0f7f37ac9 35 ->srcConn ( 0 )
okini3939 2:a3e0f7f37ac9 36 ->dstConn ( MODDMA::UART0_Tx )
okini3939 2:a3e0f7f37ac9 37 ->dmaLLI ( 0 )
okini3939 2:a3e0f7f37ac9 38 ->attach_tc ( &TC0_callback )
okini3939 2:a3e0f7f37ac9 39 ->attach_err ( &ERR0_callback )
okini3939 2:a3e0f7f37ac9 40 ; // config end
okini3939 2:a3e0f7f37ac9 41
okini3939 2:a3e0f7f37ac9 42 // Setup the configuration.
okini3939 2:a3e0f7f37ac9 43 dma.Setup(config);
okini3939 2:a3e0f7f37ac9 44
okini3939 2:a3e0f7f37ac9 45 //dma.Enable( MODDMA::Channel_0 );
okini3939 2:a3e0f7f37ac9 46 //dma.Enable( config->channelNum() );
okini3939 2:a3e0f7f37ac9 47 dma.Enable( config );
okini3939 2:a3e0f7f37ac9 48
okini3939 2:a3e0f7f37ac9 49 while (1) {
okini3939 2:a3e0f7f37ac9 50 led1 = !led1;
okini3939 2:a3e0f7f37ac9 51 wait(0.25);
okini3939 2:a3e0f7f37ac9 52 }
okini3939 2:a3e0f7f37ac9 53 }
okini3939 2:a3e0f7f37ac9 54
okini3939 2:a3e0f7f37ac9 55 // Main controller TC IRQ callback
okini3939 2:a3e0f7f37ac9 56 void dmaTCCallback(void) {
okini3939 2:a3e0f7f37ac9 57 led2 = 1;
okini3939 2:a3e0f7f37ac9 58 }
okini3939 2:a3e0f7f37ac9 59
okini3939 2:a3e0f7f37ac9 60 // Main controller ERR IRQ callback
okini3939 2:a3e0f7f37ac9 61 void dmaERRCallback(void) {
okini3939 2:a3e0f7f37ac9 62 error("Oh no! My Mbed exploded! :( Only kidding, find the problem");
okini3939 2:a3e0f7f37ac9 63 }
okini3939 2:a3e0f7f37ac9 64
okini3939 2:a3e0f7f37ac9 65 // Configuration callback on TC
okini3939 2:a3e0f7f37ac9 66 void TC0_callback(void) {
okini3939 2:a3e0f7f37ac9 67 MODDMA_Config *config = dma.getConfig();
okini3939 2:a3e0f7f37ac9 68 dma.haltAndWaitChannelComplete( (MODDMA::CHANNELS)config->channelNum());
okini3939 2:a3e0f7f37ac9 69 dma.Disable( (MODDMA::CHANNELS)config->channelNum() );
okini3939 2:a3e0f7f37ac9 70
okini3939 2:a3e0f7f37ac9 71 // Configurations have two IRQ callbacks for TC and Err so you
okini3939 2:a3e0f7f37ac9 72 // know which you are processing. However, if you want to use
okini3939 2:a3e0f7f37ac9 73 // a single callback function you can tell what type of IRQ
okini3939 2:a3e0f7f37ac9 74 // is being processed thus:-
okini3939 2:a3e0f7f37ac9 75 if (dma.irqType() == MODDMA::TcIrq) {
okini3939 2:a3e0f7f37ac9 76 led3 = 1;
okini3939 2:a3e0f7f37ac9 77 dma.clearTcIrq();
okini3939 2:a3e0f7f37ac9 78 }
okini3939 2:a3e0f7f37ac9 79 if (dma.irqType() == MODDMA::ErrIrq) {
okini3939 2:a3e0f7f37ac9 80 led4 = 1;
okini3939 2:a3e0f7f37ac9 81 dma.clearErrIrq();
okini3939 2:a3e0f7f37ac9 82 }
okini3939 2:a3e0f7f37ac9 83 }
okini3939 2:a3e0f7f37ac9 84
okini3939 2:a3e0f7f37ac9 85 // Configuration cakllback on Error
okini3939 2:a3e0f7f37ac9 86 void ERR0_callback(void) {
okini3939 2:a3e0f7f37ac9 87 error("Oh no! My Mbed exploded! :( Only kidding, find the problem");
okini3939 2:a3e0f7f37ac9 88 }
okini3939 2:a3e0f7f37ac9 89