max32630fthr quad spi , unexpected spi behavior
FTHR_USB_serial/main.cpp@0:a35c40f49345, 2018-03-13 (annotated)
- Committer:
- boonshen
- Date:
- Tue Mar 13 21:12:00 2018 +0000
- Revision:
- 0:a35c40f49345
MAX32630FTHR QuadSPI test
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
boonshen | 0:a35c40f49345 | 1 | /***** Includes *****/ |
boonshen | 0:a35c40f49345 | 2 | #include "mbed.h" |
boonshen | 0:a35c40f49345 | 3 | #include "max32630fthr.h" |
boonshen | 0:a35c40f49345 | 4 | #include "USBSerial.h" |
boonshen | 0:a35c40f49345 | 5 | |
boonshen | 0:a35c40f49345 | 6 | #include "gpio.h" |
boonshen | 0:a35c40f49345 | 7 | #include "mxc_config.h" |
boonshen | 0:a35c40f49345 | 8 | #include "clkman.h" |
boonshen | 0:a35c40f49345 | 9 | #include "ioman.h" |
boonshen | 0:a35c40f49345 | 10 | #include "spim.h" |
boonshen | 0:a35c40f49345 | 11 | #include "spis.h" |
boonshen | 0:a35c40f49345 | 12 | |
boonshen | 0:a35c40f49345 | 13 | /***** Globals *****/ |
boonshen | 0:a35c40f49345 | 14 | |
boonshen | 0:a35c40f49345 | 15 | MAX32630FTHR pegasus(MAX32630FTHR::VIO_3V3); |
boonshen | 0:a35c40f49345 | 16 | uint8_t spiwidth = 0; |
boonshen | 0:a35c40f49345 | 17 | |
boonshen | 0:a35c40f49345 | 18 | // Hardware serial port over DAPLink |
boonshen | 0:a35c40f49345 | 19 | Serial daplink(P2_1, P2_0); |
boonshen | 0:a35c40f49345 | 20 | |
boonshen | 0:a35c40f49345 | 21 | // Virtual serial port over USB |
boonshen | 0:a35c40f49345 | 22 | USBSerial microUSB; |
boonshen | 0:a35c40f49345 | 23 | |
boonshen | 0:a35c40f49345 | 24 | DigitalOut rLED(LED1); |
boonshen | 0:a35c40f49345 | 25 | DigitalOut gLED(LED2); |
boonshen | 0:a35c40f49345 | 26 | DigitalOut bLED(LED3); |
boonshen | 0:a35c40f49345 | 27 | |
boonshen | 0:a35c40f49345 | 28 | |
boonshen | 0:a35c40f49345 | 29 | |
boonshen | 0:a35c40f49345 | 30 | /***** Functions *****/ |
boonshen | 0:a35c40f49345 | 31 | |
boonshen | 0:a35c40f49345 | 32 | union spisRXcontainer32 { |
boonshen | 0:a35c40f49345 | 33 | uint8_t rx8[4]; |
boonshen | 0:a35c40f49345 | 34 | uint32_t rx32; |
boonshen | 0:a35c40f49345 | 35 | }; |
boonshen | 0:a35c40f49345 | 36 | |
boonshen | 0:a35c40f49345 | 37 | uint32_t spis_read_quad32bit() { |
boonshen | 0:a35c40f49345 | 38 | spisRXcontainer32 rxbuf; |
boonshen | 0:a35c40f49345 | 39 | |
boonshen | 0:a35c40f49345 | 40 | spis_req_t req; |
boonshen | 0:a35c40f49345 | 41 | |
boonshen | 0:a35c40f49345 | 42 | req.len = 4; |
boonshen | 0:a35c40f49345 | 43 | req.width = SPIS_WIDTH_4; |
boonshen | 0:a35c40f49345 | 44 | req.tx_data = NULL; |
boonshen | 0:a35c40f49345 | 45 | req.rx_data = rxbuf.rx8; |
boonshen | 0:a35c40f49345 | 46 | req.deass = 0; |
boonshen | 0:a35c40f49345 | 47 | |
boonshen | 0:a35c40f49345 | 48 | SPIS_Trans(MXC_SPIS, &req); |
boonshen | 0:a35c40f49345 | 49 | |
boonshen | 0:a35c40f49345 | 50 | return rxbuf.rx32; |
boonshen | 0:a35c40f49345 | 51 | } |
boonshen | 0:a35c40f49345 | 52 | |
boonshen | 0:a35c40f49345 | 53 | uint8_t spis_read_8bit() { |
boonshen | 0:a35c40f49345 | 54 | uint8_t rxbuf; |
boonshen | 0:a35c40f49345 | 55 | |
boonshen | 0:a35c40f49345 | 56 | spis_req_t req; |
boonshen | 0:a35c40f49345 | 57 | |
boonshen | 0:a35c40f49345 | 58 | req.len = 1; |
boonshen | 0:a35c40f49345 | 59 | req.width = SPIS_WIDTH_4; |
boonshen | 0:a35c40f49345 | 60 | req.tx_data = NULL; |
boonshen | 0:a35c40f49345 | 61 | req.rx_data = &rxbuf; |
boonshen | 0:a35c40f49345 | 62 | req.deass = 0; |
boonshen | 0:a35c40f49345 | 63 | |
boonshen | 0:a35c40f49345 | 64 | SPIS_Trans(MXC_SPIS, &req); |
boonshen | 0:a35c40f49345 | 65 | |
boonshen | 0:a35c40f49345 | 66 | return rxbuf; |
boonshen | 0:a35c40f49345 | 67 | } |
boonshen | 0:a35c40f49345 | 68 | |
boonshen | 0:a35c40f49345 | 69 | |
boonshen | 0:a35c40f49345 | 70 | void spis_config() { |
boonshen | 0:a35c40f49345 | 71 | //fthr extra, set shared pin to high Z input |
boonshen | 0:a35c40f49345 | 72 | gpio_cfg_t gpio_cfg; |
boonshen | 0:a35c40f49345 | 73 | gpio_cfg.port = 5; |
boonshen | 0:a35c40f49345 | 74 | gpio_cfg.mask = PIN_0 | PIN_1 | PIN_2 | PIN_3 | PIN_4 | PIN_5; |
boonshen | 0:a35c40f49345 | 75 | gpio_cfg.func = GPIO_FUNC_GPIO; |
boonshen | 0:a35c40f49345 | 76 | gpio_cfg.pad= GPIO_PAD_INPUT; |
boonshen | 0:a35c40f49345 | 77 | GPIO_Config(&gpio_cfg); |
boonshen | 0:a35c40f49345 | 78 | |
boonshen | 0:a35c40f49345 | 79 | int error; |
boonshen | 0:a35c40f49345 | 80 | uint8_t spis_mode = 0; |
boonshen | 0:a35c40f49345 | 81 | sys_cfg_spis_t sys_cfg; |
boonshen | 0:a35c40f49345 | 82 | |
boonshen | 0:a35c40f49345 | 83 | //IO Config req pin, core I/O, quad, fast usr manual pg333 |
boonshen | 0:a35c40f49345 | 84 | sys_cfg.io_cfg = IOMAN_SPIS(0, 1, 1, 1); |
boonshen | 0:a35c40f49345 | 85 | sys_cfg.clk_scale = CLKMAN_SCALE_AUTO; |
boonshen | 0:a35c40f49345 | 86 | |
boonshen | 0:a35c40f49345 | 87 | |
boonshen | 0:a35c40f49345 | 88 | if((error = SPIS_Init(MXC_SPIS, spis_mode, &sys_cfg)) != E_NO_ERROR) { |
boonshen | 0:a35c40f49345 | 89 | microUSB.printf("Error initializing SPIS %d\n", error); |
boonshen | 0:a35c40f49345 | 90 | while(1) {} |
boonshen | 0:a35c40f49345 | 91 | } else { |
boonshen | 0:a35c40f49345 | 92 | microUSB.printf("SPIS Initialized, SPIS Clock speed %d\n", SYS_SPIS_GetFreq()); |
boonshen | 0:a35c40f49345 | 93 | |
boonshen | 0:a35c40f49345 | 94 | //Maxim SDK doesn't provide init function to set spis quad mode |
boonshen | 0:a35c40f49345 | 95 | spiwidth = MXC_SPIS->gen_ctrl & 0b00110000; //bits location 5:4 |
boonshen | 0:a35c40f49345 | 96 | daplink.printf("initial spi width mode: %d\r\n", (spiwidth >> 4) ); |
boonshen | 0:a35c40f49345 | 97 | |
boonshen | 0:a35c40f49345 | 98 | MXC_SPIS->gen_ctrl &= ~(1UL << 4); //set quad |
boonshen | 0:a35c40f49345 | 99 | MXC_SPIS->gen_ctrl |= 1UL << 5; |
boonshen | 0:a35c40f49345 | 100 | |
boonshen | 0:a35c40f49345 | 101 | spiwidth = MXC_SPIS->gen_ctrl & 0b00110000; //bits location 5:4 |
boonshen | 0:a35c40f49345 | 102 | daplink.printf("set spi width mode : %d\r\n", (spiwidth >> 4) ); |
boonshen | 0:a35c40f49345 | 103 | |
boonshen | 0:a35c40f49345 | 104 | } |
boonshen | 0:a35c40f49345 | 105 | }; |
boonshen | 0:a35c40f49345 | 106 | |
boonshen | 0:a35c40f49345 | 107 | |
boonshen | 0:a35c40f49345 | 108 | |
boonshen | 0:a35c40f49345 | 109 | // ***************************************************************************** |
boonshen | 0:a35c40f49345 | 110 | // main() runs in its own thread in the OS |
boonshen | 0:a35c40f49345 | 111 | // (note the calls to Thread::wait below for delays) |
boonshen | 0:a35c40f49345 | 112 | int main() |
boonshen | 0:a35c40f49345 | 113 | { |
boonshen | 0:a35c40f49345 | 114 | daplink.printf("daplink serial port\r\n"); |
boonshen | 0:a35c40f49345 | 115 | microUSB.printf("micro USB serial port\r\n"); |
boonshen | 0:a35c40f49345 | 116 | |
boonshen | 0:a35c40f49345 | 117 | rLED = LED_ON; |
boonshen | 0:a35c40f49345 | 118 | gLED = LED_ON; |
boonshen | 0:a35c40f49345 | 119 | bLED = LED_OFF; |
boonshen | 0:a35c40f49345 | 120 | |
boonshen | 0:a35c40f49345 | 121 | rLED = LED_OFF; |
boonshen | 0:a35c40f49345 | 122 | |
boonshen | 0:a35c40f49345 | 123 | //c = microUSB.getc(); |
boonshen | 0:a35c40f49345 | 124 | spis_config(); |
boonshen | 0:a35c40f49345 | 125 | |
boonshen | 0:a35c40f49345 | 126 | |
boonshen | 0:a35c40f49345 | 127 | uint8_t readSpi8[8]; |
boonshen | 0:a35c40f49345 | 128 | uint32_t readSpi32[8]; |
boonshen | 0:a35c40f49345 | 129 | |
boonshen | 0:a35c40f49345 | 130 | uint8_t spiRxAvail; |
boonshen | 0:a35c40f49345 | 131 | |
boonshen | 0:a35c40f49345 | 132 | spiRxAvail = SPIS_NumReadAvail(MXC_SPIS); |
boonshen | 0:a35c40f49345 | 133 | daplink.printf("buf avail:%d\r\n", spiRxAvail); |
boonshen | 0:a35c40f49345 | 134 | |
boonshen | 0:a35c40f49345 | 135 | while(1) { |
boonshen | 0:a35c40f49345 | 136 | |
boonshen | 0:a35c40f49345 | 137 | if( (spiwidth<<4) == 0) { |
boonshen | 0:a35c40f49345 | 138 | //4-wire mode |
boonshen | 0:a35c40f49345 | 139 | while( SPIS_NumReadAvail(MXC_SPIS) < 8 ) {}; |
boonshen | 0:a35c40f49345 | 140 | |
boonshen | 0:a35c40f49345 | 141 | for (int i = 0; i< 8; i++){ |
boonshen | 0:a35c40f49345 | 142 | readSpi8[i] = spis_read_8bit(); |
boonshen | 0:a35c40f49345 | 143 | } |
boonshen | 0:a35c40f49345 | 144 | |
boonshen | 0:a35c40f49345 | 145 | for (int i = 0; i< 8; i++){ |
boonshen | 0:a35c40f49345 | 146 | daplink.printf("spi read : 0x%08x\r\n", readSpi8[i]); |
boonshen | 0:a35c40f49345 | 147 | } |
boonshen | 0:a35c40f49345 | 148 | |
boonshen | 0:a35c40f49345 | 149 | } |
boonshen | 0:a35c40f49345 | 150 | |
boonshen | 0:a35c40f49345 | 151 | if( (spiwidth<<4) == 2) { |
boonshen | 0:a35c40f49345 | 152 | //6-wire (quad) mode |
boonshen | 0:a35c40f49345 | 153 | |
boonshen | 0:a35c40f49345 | 154 | while( SPIS_NumReadAvail(MXC_SPIS) < 4 * 8 ) {}; |
boonshen | 0:a35c40f49345 | 155 | |
boonshen | 0:a35c40f49345 | 156 | for (int i = 0; i< 8; i++){ |
boonshen | 0:a35c40f49345 | 157 | readSpi32[i] = spis_read_quad32bit(); |
boonshen | 0:a35c40f49345 | 158 | } |
boonshen | 0:a35c40f49345 | 159 | for (int i = 0; i< 8; i++){ |
boonshen | 0:a35c40f49345 | 160 | daplink.printf("spi read : 0x%08x\r\n", readSpi32[i]); |
boonshen | 0:a35c40f49345 | 161 | } |
boonshen | 0:a35c40f49345 | 162 | |
boonshen | 0:a35c40f49345 | 163 | } |
boonshen | 0:a35c40f49345 | 164 | |
boonshen | 0:a35c40f49345 | 165 | spiRxAvail = SPIS_NumReadAvail(MXC_SPIS); |
boonshen | 0:a35c40f49345 | 166 | daplink.printf("buf left:%d\r\n", spiRxAvail); |
boonshen | 0:a35c40f49345 | 167 | |
boonshen | 0:a35c40f49345 | 168 | } |
boonshen | 0:a35c40f49345 | 169 | |
boonshen | 0:a35c40f49345 | 170 | |
boonshen | 0:a35c40f49345 | 171 | |
boonshen | 0:a35c40f49345 | 172 | } |
boonshen | 0:a35c40f49345 | 173 |