Dependencies:   mbed

Committer:
michelebavaro
Date:
Tue Jan 25 11:26:16 2011 +0000
Revision:
0:be1765e9885e

        

Who changed what in which revision?

UserRevisionLine numberNew 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 }