Guest User

Untitled

a guest
Feb 4th, 2015
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.91 KB | None | 0 0
  1. #include "common.h"
  2. #include "udma.h"
  3. #include "udma_if.h"
  4. #include "hw_mcspi.h"
  5.  
  6.  
  7. #define TIMER_TICK 5000000
  8. static uint32_t interrupt_count;
  9. static uint8_t tx_buffer[TR_BUFF_SIZE];
  10. static uint8_t rx_buffer[TR_BUFF_SIZE];
  11.  
  12. static void interrupt_handler()
  13. {
  14.     uint32_t status = MAP_SPIIntStatus(GSPI_BASE,true);
  15.     interrupt_count++;
  16.     Report("Count: %d\n\r",interrupt_count);
  17.     if(interrupt_count > 100)
  18.     {
  19.         Message("Reached 100 interrupts...\n\r");
  20.         //SPIIntUnregister(GSPI_BASE);
  21.     //  while(1){}
  22.     }
  23.     if(status &  SPI_INT_DMATX)
  24.     {
  25.         Message(" SPI_INT_DMATX\n\r"); 
  26.         MAP_SPIIntClear(GSPI_BASE,SPI_INT_DMATX);
  27.         SPIIntDisable(GSPI_BASE, SPI_INT_DMATX );
  28.         return;
  29.     }
  30.     if(status & SPI_INT_DMARX)
  31.     {
  32.         Message("SPI_INT_DMARX  \n\r");
  33.         MAP_SPIIntClear(GSPI_BASE,SPI_INT_DMARX);
  34.         SPIIntDisable(GSPI_BASE, SPI_INT_DMARX );
  35.         return;
  36.     }
  37.     Message("Unkown Interrupt\n\r");
  38. //  Message("int\n\r");
  39. }
  40. void setup()
  41. {
  42.     // configure SPI
  43.     MAP_SPIReset(GSPI_BASE);
  44.  
  45.     UDMAInit();
  46.  
  47.     MAP_SPIConfigSetExpClk(GSPI_BASE,MAP_PRCMPeripheralClockGet(PRCM_GSPI),
  48.                      SPI_IF_BIT_RATE,SPI_MODE_SLAVE,SPI_SUB_MODE_0,
  49.                      (SPI_HW_CTRL_CS |
  50.                      SPI_4PIN_MODE |
  51.                      SPI_TURBO_OFF |
  52.                      SPI_CS_ACTIVEHIGH |
  53.                      SPI_WL_8));   
  54.     MAP_SPIIntRegister(GSPI_BASE,interrupt_handler);
  55.  
  56.     SetupTransfer(UDMA_CH30_GSPI_RX,UDMA_MODE_BASIC,TR_BUFF_SIZE,
  57.                 UDMA_SIZE_8,UDMA_ARB_1,
  58.                 (void *)(GSPI_BASE + MCSPI_O_RX0),UDMA_SRC_INC_NONE,
  59.                 rx_buffer,UDMA_DST_INC_8);
  60.  
  61.     SetupTransfer(UDMA_CH31_GSPI_TX,UDMA_MODE_BASIC,TR_BUFF_SIZE,
  62.                 UDMA_SIZE_8,UDMA_ARB_1,
  63.                 tx_buffer,UDMA_SRC_INC_8,
  64.                 (void *)(GSPI_BASE + MCSPI_O_TX0),UDMA_DST_INC_NONE);  
  65.     SPIDmaEnable(GSPI_BASE,SPI_RX_DMA|SPI_TX_DMA);
  66.     //MAP_SPIIntEnable(GSPI_BASE,SPI_INT_DMATX | SPI_INT_DMARX );
  67.     MAP_SPIIntEnable(GSPI_BASE, SPI_INT_DMARX | SPI_INT_DMATX  );
  68.     MAP_SPIEnable(GSPI_BASE);
  69.  
  70. }
  71. int main()
  72. {
  73.     interrupt_count = 0;
  74.  
  75.     uint32_t output_count = 0;
  76.     uint32_t sum = 0;
  77.     uint32_t tick_count = 0;
  78.     uint32_t tx_crc = 0;
  79.    
  80.    
  81.     init();
  82.     // initialize buffers with some known value
  83.     memset(tx_buffer,0x55,sizeof(tx_buffer));
  84.     memset(rx_buffer,0x22,sizeof(rx_buffer));
  85.    
  86.     for(int i = 0; i < TR_BUFF_SIZE; i++)
  87.     {
  88.         tx_buffer[i] = 0x20+i;
  89.     }
  90.     setup();
  91. //  MAP_uDMAIntClear(0xffffffff);
  92. //  MAP_uDMAChannelAssign( UDMA_CH30_GSPI_RX );
  93. //    MAP_uDMAChannelAssign( UDMA_CH31_GSPI_TX);
  94.   //  MAP_uDMAChannelRequest(UDMA_CH30_GSPI_RX);
  95.   //  MAP_uDMAChannelRequest(UDMA_CH31_GSPI_TX);
  96.  
  97.     Message("Enabled SPI Interface in Slave Mode!\n\r");
  98. //  change_seed(456546,35345,345346,3463);
  99. //  tx_crc = fill_buffer(tx_buffer,TR_BUFF_SIZE,"TX");
  100.  
  101.     Message("Starting while...\n\r");
  102.     uint32_t timer = 0;
  103.     while(1)
  104.     {
  105.  
  106.         memcpy(tx_buffer,rx_buffer,TR_BUFF_SIZE);
  107.         // here we could also change the tx_buffer
  108.         //  tx_buffer[TR_BUFF_SIZE - 1] = 18;
  109.         // we want to print out the buffer
  110.         // on the slave side after each transfer.
  111.         // As each transfer will cause
  112.         // TR_BUFF_SIZE interrupts, we check if our
  113.         // local counter is less than interrupt_count
  114.         // which is incremeted in the interrupt handler
  115.         sum = 0;
  116.         if(timer > TIMER_TICK)
  117.         {
  118.             Report("Timer Tick %d!\n\r",tick_count);
  119.             tick_count++;
  120.         }
  121.         if((output_count < interrupt_count) || timer > TIMER_TICK)
  122.         {
  123.             for(int i = 0; i < TR_BUFF_SIZE; i++)
  124.             {
  125.                 sum += rx_buffer[i];
  126.             }
  127.             Report("The sum in the Rx buffer is: %d\n\r",sum);
  128.             Report("Checksum Rx buffer is: 0x%02x\n\r",crc(rx_buffer));
  129.             Report("interrupt: %d\n\r",interrupt_count);
  130.             Message("TX-");
  131.             print_buffer(tx_buffer,TR_BUFF_SIZE);
  132.             Message("RX-");
  133.             print_buffer(rx_buffer,TR_BUFF_SIZE);
  134.             SPIDisable(GSPI_BASE);
  135.             uDMADisable();
  136.             setup();
  137.             output_count++;
  138.         }
  139.         if(timer > TIMER_TICK)
  140.         {
  141.             timer = 0;
  142.         }
  143.         timer++;
  144.     }
  145.     return 0;
  146. }
Advertisement
Add Comment
Please, Sign In to add comment