Michele Bavaro
/
atlas
max2769ssp0.cpp@0:be1765e9885e, 2011-01-25 (annotated)
- Committer:
- michelebavaro
- Date:
- Tue Jan 25 11:26:16 2011 +0000
- Revision:
- 0:be1765e9885e
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
michelebavaro | 0:be1765e9885e | 1 | #include "mbed.h" |
michelebavaro | 0:be1765e9885e | 2 | #include "max2769ssp0.h" |
michelebavaro | 0:be1765e9885e | 3 | |
michelebavaro | 0:be1765e9885e | 4 | |
michelebavaro | 0:be1765e9885e | 5 | extern "C" void MYSSP0_IRQHandler(void) __irq; |
michelebavaro | 0:be1765e9885e | 6 | |
michelebavaro | 0:be1765e9885e | 7 | // CONSTRUCTOR |
michelebavaro | 0:be1765e9885e | 8 | MAX2769SSP0::MAX2769SSP0(PinName _mosi=p11, PinName _sck=p13, PinName _ssel=p14) { |
michelebavaro | 0:be1765e9885e | 9 | /* |
michelebavaro | 0:be1765e9885e | 10 | * DEFAULT PORT IS SSP0, others are not supported |
michelebavaro | 0:be1765e9885e | 11 | */ |
michelebavaro | 0:be1765e9885e | 12 | if ( (_mosi == p11) && (_sck == p13) && (_ssel == p14) ) { |
michelebavaro | 0:be1765e9885e | 13 | sppx = 0; |
michelebavaro | 0:be1765e9885e | 14 | // Turn on SSP0 periferal |
michelebavaro | 0:be1765e9885e | 15 | LPC_SC->PCONP |= (0x01UL << 21); |
michelebavaro | 0:be1765e9885e | 16 | // Turn on the SSP0 clock |
michelebavaro | 0:be1765e9885e | 17 | LPC_SC->PCLKSEL1 |= (0x01U << 10); // Turn on peripheral clock |
michelebavaro | 0:be1765e9885e | 18 | // DIP11 is P0.18 |
michelebavaro | 0:be1765e9885e | 19 | LPC_PINCON->PINSEL1 &= ~(3UL << 4); // Reset P0.18 |
michelebavaro | 0:be1765e9885e | 20 | LPC_PINCON->PINSEL1 |= (2UL << 4); // Set P0.18 to MOSI0 |
michelebavaro | 0:be1765e9885e | 21 | LPC_PINCON->PINMODE1 &= ~(3UL << 4); // |
michelebavaro | 0:be1765e9885e | 22 | LPC_PINCON->PINMODE1 |= (2UL << 4); // Set P0.18 with no pull-up or pull-down |
michelebavaro | 0:be1765e9885e | 23 | // DIP12 is P0.17 |
michelebavaro | 0:be1765e9885e | 24 | LPC_PINCON->PINSEL1 &= ~(3UL << 2); // Reset P0.17 |
michelebavaro | 0:be1765e9885e | 25 | LPC_PINCON->PINSEL1 |= (2UL << 2); // Set P0.17 to MISO0 |
michelebavaro | 0:be1765e9885e | 26 | LPC_PINCON->PINMODE1 &= ~(3UL << 2); // |
michelebavaro | 0:be1765e9885e | 27 | LPC_PINCON->PINMODE1 |= (2UL << 2); // Set P0.17 with no pull-up or pull-down |
michelebavaro | 0:be1765e9885e | 28 | // DIP13 is P0.15 |
michelebavaro | 0:be1765e9885e | 29 | LPC_PINCON->PINSEL0 &= ~(3UL << 30); // Reset P0.15 |
michelebavaro | 0:be1765e9885e | 30 | LPC_PINCON->PINSEL0 |= (2UL << 30); // Set P0.15 to SCK0 |
michelebavaro | 0:be1765e9885e | 31 | LPC_PINCON->PINMODE0 &= ~(3UL << 30); // |
michelebavaro | 0:be1765e9885e | 32 | LPC_PINCON->PINMODE0 |= (2UL << 30); // Set P0.15 with no pull-up or pull-down |
michelebavaro | 0:be1765e9885e | 33 | // DIP14 is P0.16 |
michelebavaro | 0:be1765e9885e | 34 | LPC_PINCON->PINSEL1 &= ~(3UL << 0); // Reset P0.16 |
michelebavaro | 0:be1765e9885e | 35 | LPC_PINCON->PINSEL1 |= (2UL << 0); // Set P0.16 to SSEL0 |
michelebavaro | 0:be1765e9885e | 36 | LPC_PINCON->PINMODE1 &= ~(3UL << 0); // |
michelebavaro | 0:be1765e9885e | 37 | LPC_PINCON->PINMODE1 |= (2UL << 0); // Set P0.16 with no pull-up or pull-down |
michelebavaro | 0:be1765e9885e | 38 | |
michelebavaro | 0:be1765e9885e | 39 | // Configure interrupts for SSP0 |
michelebavaro | 0:be1765e9885e | 40 | LPC_SSP0->IMSC = |
michelebavaro | 0:be1765e9885e | 41 | (1UL << 0) | // Receive overrun |
michelebavaro | 0:be1765e9885e | 42 | (1UL << 1) | // Receive timeout |
michelebavaro | 0:be1765e9885e | 43 | (0UL << 2) | // RX FIFO half full |
michelebavaro | 0:be1765e9885e | 44 | (0UL << 3); // TX FIFO half empty |
michelebavaro | 0:be1765e9885e | 45 | NVIC_SetVector(SSP0_IRQn, (uint32_t) MYSSP0_IRQHandler); |
michelebavaro | 0:be1765e9885e | 46 | NVIC_EnableIRQ(SSP0_IRQn); |
michelebavaro | 0:be1765e9885e | 47 | |
michelebavaro | 0:be1765e9885e | 48 | // Configure SSP0 |
michelebavaro | 0:be1765e9885e | 49 | LPC_SSP0->CR0 = |
michelebavaro | 0:be1765e9885e | 50 | ( 0xFUL << 0) | // 16 bits transfers |
michelebavaro | 0:be1765e9885e | 51 | ( 1UL << 4) | // Texas mode |
michelebavaro | 0:be1765e9885e | 52 | (0x00UL << 8); // Serial clock rate |
michelebavaro | 0:be1765e9885e | 53 | // Not really relevant since we are in slave mode |
michelebavaro | 0:be1765e9885e | 54 | LPC_SSP0->CPSR = 0; |
michelebavaro | 0:be1765e9885e | 55 | |
michelebavaro | 0:be1765e9885e | 56 | LPC_SSP0->CR1 = |
michelebavaro | 0:be1765e9885e | 57 | ( 0UL << 0) | // Loopback mode disabled |
michelebavaro | 0:be1765e9885e | 58 | ( 0UL << 1) | // SSP controller disabled |
michelebavaro | 0:be1765e9885e | 59 | ( 1UL << 2) | // Slave mode! |
michelebavaro | 0:be1765e9885e | 60 | ( 1UL << 3); // Slave output is disabled |
michelebavaro | 0:be1765e9885e | 61 | |
michelebavaro | 0:be1765e9885e | 62 | LPC_SSP0->DMACR = |
michelebavaro | 0:be1765e9885e | 63 | ( 0UL << 0) | // DMA disabled on RX path |
michelebavaro | 0:be1765e9885e | 64 | ( 0UL << 1); // DMA disabled on TX path |
michelebavaro | 0:be1765e9885e | 65 | |
michelebavaro | 0:be1765e9885e | 66 | } else { |
michelebavaro | 0:be1765e9885e | 67 | sppx = -1; |
michelebavaro | 0:be1765e9885e | 68 | } |
michelebavaro | 0:be1765e9885e | 69 | } |
michelebavaro | 0:be1765e9885e | 70 | |
michelebavaro | 0:be1765e9885e | 71 | |
michelebavaro | 0:be1765e9885e | 72 | // DISTRUCTOR |
michelebavaro | 0:be1765e9885e | 73 | MAX2769SSP0::~MAX2769SSP0() { |
michelebavaro | 0:be1765e9885e | 74 | // do nothing |
michelebavaro | 0:be1765e9885e | 75 | } |
michelebavaro | 0:be1765e9885e | 76 | |
michelebavaro | 0:be1765e9885e | 77 | // |
michelebavaro | 0:be1765e9885e | 78 | void MAX2769SSP0::Read(uint16_t *_puiBuff, uint32_t _iLocations) { |
michelebavaro | 0:be1765e9885e | 79 | int k; |
michelebavaro | 0:be1765e9885e | 80 | |
michelebavaro | 0:be1765e9885e | 81 | // Sanity check, port is not valid |
michelebavaro | 0:be1765e9885e | 82 | if (sppx < 0) { |
michelebavaro | 0:be1765e9885e | 83 | error("%s; this SSP port is not valid\n", __FUNCTION__); |
michelebavaro | 0:be1765e9885e | 84 | } |
michelebavaro | 0:be1765e9885e | 85 | |
michelebavaro | 0:be1765e9885e | 86 | // Sanity check, buffer pointer is not valid |
michelebavaro | 0:be1765e9885e | 87 | if (_puiBuff == NULL) { |
michelebavaro | 0:be1765e9885e | 88 | error("%s; buffer pointer %p is not valid\n", __FUNCTION__, _puiBuff); |
michelebavaro | 0:be1765e9885e | 89 | } |
michelebavaro | 0:be1765e9885e | 90 | |
michelebavaro | 0:be1765e9885e | 91 | //LPC_SSP0->DR = 0x5555; |
michelebavaro | 0:be1765e9885e | 92 | if (LPC_SSP0->SR & 0x01) { |
michelebavaro | 0:be1765e9885e | 93 | fprintf(stderr, "SSP0: TX FIFO empty\n"); |
michelebavaro | 0:be1765e9885e | 94 | } else { |
michelebavaro | 0:be1765e9885e | 95 | if (LPC_SSP0->SR & 0x02) { |
michelebavaro | 0:be1765e9885e | 96 | fprintf(stderr, "SSP0: TX FIFO not full\n"); |
michelebavaro | 0:be1765e9885e | 97 | } else { |
michelebavaro | 0:be1765e9885e | 98 | fprintf(stderr, "SSP0: TX FIFO full\n"); |
michelebavaro | 0:be1765e9885e | 99 | } |
michelebavaro | 0:be1765e9885e | 100 | } |
michelebavaro | 0:be1765e9885e | 101 | if (LPC_SSP0->SR & 0x04) { |
michelebavaro | 0:be1765e9885e | 102 | if (LPC_SSP0->SR & 0x08) { |
michelebavaro | 0:be1765e9885e | 103 | fprintf(stderr, "SSP0: RX FIFO full\n"); |
michelebavaro | 0:be1765e9885e | 104 | } else { |
michelebavaro | 0:be1765e9885e | 105 | fprintf(stderr, "SSP0: RX FIFO not full\n"); |
michelebavaro | 0:be1765e9885e | 106 | } |
michelebavaro | 0:be1765e9885e | 107 | } else { |
michelebavaro | 0:be1765e9885e | 108 | fprintf(stderr, "SSP0: RX FIFO empty\n"); |
michelebavaro | 0:be1765e9885e | 109 | } |
michelebavaro | 0:be1765e9885e | 110 | if (LPC_SSP0->SR & 0x10) { |
michelebavaro | 0:be1765e9885e | 111 | fprintf(stderr, "SSP0: BUSY\n"); |
michelebavaro | 0:be1765e9885e | 112 | } else { |
michelebavaro | 0:be1765e9885e | 113 | fprintf(stderr, "SSP0: IDLE\n"); |
michelebavaro | 0:be1765e9885e | 114 | } |
michelebavaro | 0:be1765e9885e | 115 | |
michelebavaro | 0:be1765e9885e | 116 | k=0; |
michelebavaro | 0:be1765e9885e | 117 | while (k < _iLocations) { |
michelebavaro | 0:be1765e9885e | 118 | if (LPC_SSP0->SR & 0x4) { // if the RX FIFO is not empty |
michelebavaro | 0:be1765e9885e | 119 | _puiBuff[k++] = (uint16_t) (LPC_SSP0->DR & 0xFFFF); |
michelebavaro | 0:be1765e9885e | 120 | } |
michelebavaro | 0:be1765e9885e | 121 | } |
michelebavaro | 0:be1765e9885e | 122 | } |
michelebavaro | 0:be1765e9885e | 123 | |
michelebavaro | 0:be1765e9885e | 124 | |
michelebavaro | 0:be1765e9885e | 125 | // MYSSP0_IRQHandler |
michelebavaro | 0:be1765e9885e | 126 | extern "C" void MYSSP0_IRQHandler(void) __irq { |
michelebavaro | 0:be1765e9885e | 127 | if (LPC_SSP0->MIS & 0x1UL) { |
michelebavaro | 0:be1765e9885e | 128 | myled1 = 1; |
michelebavaro | 0:be1765e9885e | 129 | LPC_SSP0->ICR &= ~0x1UL; |
michelebavaro | 0:be1765e9885e | 130 | } |
michelebavaro | 0:be1765e9885e | 131 | if (LPC_SSP0->MIS & 0x2UL) { |
michelebavaro | 0:be1765e9885e | 132 | myled2 = 1; |
michelebavaro | 0:be1765e9885e | 133 | LPC_SSP0->ICR &= ~0x2UL; |
michelebavaro | 0:be1765e9885e | 134 | } |
michelebavaro | 0:be1765e9885e | 135 | } |